FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
¡ Excelente !
Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#2
|
||||
|
||||
DrawText en SDL2
Ahora necesito texto para la applicación de las hormigas, tanto para debug como para la GUI.
SDL2 es muy bonito hasta que te dás cuenta que no puedes dibujar texto... Bueno si puedes, pero usando SDL2_ttf.dll... ah, pero es muy lento, solo hace el render de la TrueType en memoria de sistema, que hay que convertir a textura... y uff... Entonces lo más eficiente sería BMFont, seguro alguien tendrá algo hecho por ahí, mil veces,... pero tengo ganas de hacerlo yo y no quiero cargar un bitmap pre-generado, quiero generarlo en tiempo de ejecución y divertirme implementando el DrawTextXY... Entonces ya esta hecho y funciona! : El fondo de la imagen son 3500 veces impreso mi nombre con transparencia, alcanzando más de 60fPS. Con el método basico de hacer el render del texto a una SDL_Surface, luego convertir a SDL_Texture, mandar la textura para la pantalla, y librerar esas memorias, el Frame Rate bajaba a 20 por segundo con solo 100 veces imprimir dos palabras... Este es el código para generar la textura: Código:
function Tsdl.createBitmapFont(ttf_FileName: string; fontSize: integer): TBitmapFont; var w :integer; charWidth :array[0..255] of integer; i,j: Integer; c:byte; surf :PSDL_Surface; surfChar :PSDL_Surface; color :TSDL_Color; destRect :TSDL_Rect; sdlFont :PTTF_Font; begin Result.maxW := 0; sdlFont := TTF_OpenFont(StrToSdl( ttf_FileName ), fontSize ); if sdlFont = nil then begin errorMsg('Can''t open font '+ttf_FileName + ' ' + string( TTF_GetError ) ); exit; end; Result.srcFont := sdlFont; for c := 0 to 255 do begin //storing char widths and finding the max width TTF_SizeText(sdlFont, strToSDL(string(char(c))), @w, nil); if w > Result.maxW then Result.maxW := w; charWidth[c] := w; end; Result.maxH := TTF_FontHeight(sdlFont); Result.texW := Result.maxW * 16; Result.texH := Result.maxH * 16; //creating the surface to draw the char matrix of 16 x 16 surf := SDL_CreateRGBSurfaceWithFormat(0, Result.texW, Result.texH, 32, SDL_PIXELFORMAT_RGBA8888); SDL_FillRect(surf, nil, $0 ); c:= 0; color.r := 255; color.g := 255; color.b := 255; color.a := 0; for j := 0 to 15 do for i := 0 to 15 do begin if c > 0 then begin //Rendering a single character to a temporary Surface surfChar := TTF_RenderText_Blended(sdlFont, strToSDL(string(char(c))), color ); destRect := sdl.Rect(i*Result.maxW, j*Result.maxH, charWidth[c], Result.maxH); Result.asciiSprites[c] := destRect; //bliting the character to our big surface matrix SDL_BlitSurface(surfChar, nil, surf, @destRect ); SDL_FreeSurface(surfChar); end; inc(c); end; //to fix the problem with alpha premultiplied od TTF_RenderText_Blended //we get the image as a grayscale mask and convert the intensity to alpha channel sdl.ConvertGrayscaleToAlpha( surf ); //convert to texture; Result.srcTex := SDL_CreateTextureFromSurface(sdl.rend, surf); SDL_FreeSurface(surf); end; Código:
function Tsdl.drawText(s: string; x, y: integer; color: cardinal; alpha: byte): TSDL_Rect; var i :integer; b :byte; srcRect :PSDL_Rect; dstRect :TSDL_Rect; sc : PSDL_Color; begin sc := @color; SDL_SetTextureColorMod(fFont.srcTex, sc.r, sc.g, sc.b); SDL_SetTextureAlphaMod(fFont.srcTex, alpha); dstRect := sdl.Rect(x,y, fFont.maxW, fFont.maxH); for i:=1 to length(s) do begin b := ord( s[i] ); srcRect := @fFont.asciiSprites[b]; dstRect.w := srcRect.w; dstRect.h := srcRect.h; SDL_RenderCopy(fRend, fFont.srcTex, srcRect, @dstRect); dstRect.x := dstRect.x + dstRect.w; end; result.x := x; result.y := y; result.h := fFont.maxH; result.w := dstRect.x - x; end; |
#3
|
||||
|
||||
Muy bueno.
Gracias por compartirlo Saludos |
#4
|
||||
|
||||
Tampoco tenía controles (GUI) en SDL2 con Delphi XE3, así que tuve que hacerlo desde cerito...
https://twitter.com/DenysAlmaral/sta...66578468483072 Sin protestar mucho porque en realidad pensé sería divertido. La experiencia con la VCL me sirvió de inspiración pero enfocado mejor en que la aplicación es ejecutada en tiempo real, no ventanas pasivas.. la cosa cambia. La fuente del trabajo con SDL2 está por aquí: https://github.com/piXelicidio/px.sdl Sigo pensando en después unirlo todo para que sea más facil de descargar, pero tengo conflictos filosóficos pendientes al respecto. Lo único que encontré por ahí fue esto: https://github.com/dalerank/nanogui-sdl, y me pareció bastante distante a lo que yo necesitaba, prefería algo más basico. Ademá que requiere XE5. Por cierto tengo noticias interesantes: He probado compilar pruebas de SDL2 con Delphi Starter 10.2 y por el momento todo funciona. Me preocupaba que si mi intención era que estas hormigas fueran Open Source, entonces dependiera de versiones costozas de Delphi que pudieran ser obstáculo para alguien que solo quiera jugar con los fuentes. Almenos podrá compilar para Win32 de gratis. |
#5
|
||||
|
||||
Hola a todos,
Veo que has publicado una nueva "release" en Github con un ejecutable listo para probar el programa, que, por cierto, funciona muy bien. ¿Lo malo? Que ahora me tiraré media hora jugando con el mismo. |
#6
|
||||
|
||||
Hola a todos,
¿Te has planteado vender el programa? Yo creo que podría ser muy interesante. Añadiendo lo que los usuarios demanden (y sea posible), creo que al final quedaría una especie de juego entretenido y curioso, ¡en mi opinión! |
#7
|
||||
|
||||
Primera versión usable:
Ah! pero @Dec, tu si que eres rápido! Aqui ya venía yo a postear al respecto
Pues así es, ya está disponible un ejecutable para Windows aquí: https://github.com/piXelicidio/hormi...ses/tag/v0.0.1 Detalles que me encantaría saber: A cuantos FPS ejecuta en tu PC y cual CPU y GPU. Ahora mismo el FPS está ilimitado. También si lo corren en una pantalla de alta definición (más de 1080p), me gustaría saber como se comporta. Controles: - Con la rueda del Mouse: Zoom in/Out. - Seleccionan un tipo de bloque y "dibujan" en el mapa con click izquerdo. - F11, alterna FullScreen y Ventana. - Teclas WASD para mover la cámara. - ESC para salir. @Dec, te respondo tu preguntas en un siguiente post |
#8
|
||||
|
||||
Cita:
Mientras pudiera continuar otra versión privada, con objetivos más ambisiosos de publicar en Steam, con algunas ideas de gameplay que estoy elaborando, con toques supervivencia y simulación, pero no tratar de imitar estrictamente una colonia de hormigas de la vida real, si no algo más en función de lo divertido. Aunque aparentemente no tengan que ver, me inspiran elementos de Terraria y Factorio. Pero algo muy importante que he aprendido a tropiezos es escuchar la reacción de la gente, y opiniones como la tuya , para saber que hacer con esto, y hasta donde vale la pena invertirle esfuerzo. Uno de los pasos pudiera ser montar un Patreon, pero de nuevo pienso que eso me lo dirá la reacción de la gente, ya veremos |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Hola! + Simulación de hormigas! | piXelicidio | Gráficos | 35 | 10-04-2018 14:03:22 |
Curso gratis de firebird (hasta el 23.03.2018 o los 20 primeros) | Chogo | Noticias | 3 | 13-03-2018 17:43:23 |
Cargar librerías (SDL2) desde iOS | kotai | FireMonkey | 0 | 09-09-2013 20:58:05 |
EDBEngineError error $2018 | biuti | Conexión con bases de datos | 2 | 28-02-2008 19:06:41 |
Frases locas | Nuria | Humor | 4 | 29-03-2004 18:17:17 |
|