Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema al dibujar fuentes.

Iniciado por Wamba, 30 de Noviembre de 2007, 01:54:11 PM

« anterior - próximo »

Wamba

Tengo un problema:
-Cargo una imagen(png) con Map_Load
-Abro un Render Target con la imagen
-Dibujo un texto en la imagen con Draw_Text (Con la fuente ya cargada , y todos los valores correctos)
-Cierro y destruyo el Target
(Por supuesto tengo el bucle con las llamadas necesarias en el Form_Load, incluida Frame)

Y luego al dibuajarla solo dibuja la imagen pero no el text.
Lo curioso es que de vez en cuando si lo dibuja(Aunque mal)
Y si en vez de dibujar un texto, dibujo una imagen luego no dibuja ni lo uno ni lo otro.

Si alguien sabe a que puede ser debido se lo agradeceria.

[EX3]

Copia el codigo de como lo estas haciendo para que le eche un ojo, si luego tengo tiempo en casa lo pruebo y veo donde puede estar el error.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Wamba

Lo que intento hacer es crear una previsualizacion de una rchivo de texto
Para ello cargo una imagen png de 300x400 que tiene un degradado de blanco a blanco transparente.Luego dibujo encima el texto del archivo y otra funcion se encarga de visualizar el resultado.
Aqui estan las funciones:(Evidentemente llamo en primer lugar a la primera funcion una sola vez, y luego ya se llama a la segunda desde el bucle del Form_Load)


'Previamente he cargado en un array las lineas del archivo
TextLines = Numero de lineas del archivo
TextLine(TextLines) = Cada una de las linea que contiene el archivo

'ESTA ES LA FUNCION QUE CREA LA PREVISUALIZACION

...
Dim Target as Long
Public ShowPicture as Long <- Esta es global (esta en un modulo aparte)

ShowPicture = mgfx.MAP_Load(App.path & "\Fondo.png") 'Imagen del fondo
Target = mgfx.TARGET_Create(ShowPicture)
Call mgfx.TARGET_Open(Target) 'Abrimos la imagen para dibujar dentro
   For i = 1 To TextLines  'Ahora voy dibujando la lineas del archivo
       Call mgfx.DRAW_Text(Font, TextLine(i), 0, 15*i,0,mgfx.ARGB_Set(255, 0, 0, 0), Align_Left)
   Next i
Call mgfx.TARGET_Close 'Cierro y destruyo el Taget
Call mgfx.TARGET_Destroy(Target)
Ancho = 300
Alto = 400
...

'Y ESTA LA QUE LO DIBUJA EN EL BACKBUFFER

....
Call mgfx.DRAW_MapEx(ShowPicture, DespX,DespY, 0, 300, 400, 0, Blendop_Color, mgfx.ARGB_Set(Transparencia, 255, 255, 255), Mirror_None, Filter_None, False)
...

Como digo el resultado es que solo dibuja la imagen pero no el texto,
salvo rarisimas ocasiones en las que dibuja tambien el texto
aunque mal.

[EX3]

Vale, estuve probando logre hacerlo correctamente pero haciendo un par de modificaciones:

1. Crea una textura vacia con MAP_Create() y con un tamaño potencia de base 2 (64x64, 256x256, 512x512, etc...) en vez de valores como 300x400. Recuerda que trabajas con texturas y estas si no son potencia de 2 la tarjeta las reescala en memoria, lo que provoca que despues se vea extraña la imagen y el texto que dibujas sobre ella.

2. Apunta el RenderTarget contra la textura que has creado.

3. Abre el render target, dibuja tu imagen de fondo sobre ella y despues pinta las lineas de texto.

4. Cierra y destruye el render target y listos.

Los render target trabajan correctamente sobre texturas base creadas en memoria (temas del formato del pixel y demas historias). Por eso daba problemas (a mi me dejaba parte de la textura en negro). El codigo que he probado:
Option Explicit

'Variable objeto que apunta a la clase dx_GFX:
Dim mgfx As dx_GFX_Class

'Identificador de fuente de texto:
Dim mFont As Long

'Controla el bucle principal:
Dim Looping As Boolean

Dim Target As Long
Public ShowPicture As Long

Dim map As Long

Private Sub RenderTarget()
   Dim i As Long
   Dim TextLine(9) As String
   TextLine(0) = "ShowPicture = mgfx.MAP_Load(App.Path & ""\Fondo.png"") 'Imagen del fondo"
   TextLine(1) = "Target = mgfx.TARGET_Create(ShowPicture)"
   TextLine(2) = "Call mgfx.TARGET_Open(Target) 'Abrimos la imagen para dibujar dentro"
   TextLine(3) = "For i = 1 To TextLines 'Ahora voy dibujando la lineas del archivo"
   TextLine(4) = "    Call mgfx.DRAW_Text(Font, TextLine(i), 0, 15 * i, 0, mgfx.ARGB_Set(255, 0, 0, 0), Align_Left)"
   TextLine(5) = "Next i"
   TextLine(6) = "Call mgfx.TARGET_Close 'Cierro y destruyo el Taget"
   TextLine(7) = "Call mgfx.TARGET_Destroy(Target)"
   TextLine(8) = "Ancho = 300"
   TextLine(9) = "Alto = 400"
   
   map = mgfx.MAP_Create(300, 400)
   
   ShowPicture = mgfx.MAP_Load(App.Path & "\Fondo.png", 0) 'Imagen del fondo
   Target = mgfx.TARGET_Create(map)
   Call mgfx.TARGET_Open(Target) 'Abrimos la imagen para dibujar dentro
   Call mgfx.DRAW_Map(ShowPicture, 0, 0, 0, 0, 0)
   For i = 1 To 9 'Ahora voy dibujando la lineas del archivo
       Call mgfx.DRAW_Text(mFont, TextLine(i), 0, 15 * i, 0, mgfx.ARGB_Set(255, 255, 255, 255), Align_Left)
   Next i
   Call mgfx.TARGET_Close 'Cierro y destruyo el Taget
   Call mgfx.TARGET_Destroy(Target)
   'Ancho = 300
   'Alto = 400
End Sub

Private Sub Form_Load()
'Mostramos la ventana:
Me.Show

'Creamos la instancia de la clase dx_GFX:
Set mgfx = New dx_GFX_Class

'Inicializamos la clase y el modo de video a 640x480 en modo ventana:
Call mgfx.Init(Me.hWnd, 640, 480, , True)

'Creamos y configuramos una fuente de texto:
mFont = mgfx.FONT_LoadSystemFont("Lucida Console", 10, False, False, False, False)

Call RenderTarget

Looping = True

Do While Looping
   'Dibujamos el RenderTarget:
   Call mgfx.DRAW_MapEx(map, 0, 0, 0, 300, 400, 0, Blendop_Color, mgfx.ARGB_Set(255, 255, 255, 255), Mirror_None, Filter_None, False)
   
   'Ejecutamos las llamadas de la clase grafica:
   Call mgfx.Frame

Loop

'Descargamos el grafico de la memoria:
Call mgfx.MAP_Unload(ShowPicture)

'Terminamos la ejecucion de la clase:
Call mgfx.Terminate

'Destruimos la instancia de la clase:
Set mgfx = Nothing

End

End Sub

Private Sub Form_Unload(Cancel As Integer)
Looping = False

End Sub

De esta forma te deberia funcionar.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Wamba

Ok, muchas gracias, ya funciona.
Por ultimo, puesto que lo que estoy haciendo no es un juego,
no es muy adecuado que la CPU este constantemente al 100% cuando
ejecuto el programa (ya que puede que se esten ejecutando otras aplicaciones a la vez).
Como puedo hacer para evitar esto ?
Puedo hacer que le funcion dibuje en el escritorio en vez de una ventana?
Muchas Gracias.

[EX3]

Generalmente un juego, que es a lo que esta orientado dx_lib32, esta diseñado para ejecutarse en solitario y no en conjunto con otros programas (a excepcion del sistema operativo) pero tampoco quiere decir que no se puedan evitar procesos repetitivos y en ocasiones innecesarios, como redibujar constantemente toda la pantalla.

En la proxima release se podra deshabilitar el borrado de la pantalla al llamar a Frame(), lo que en caso de tener pantallas estaticas o secciones estaticas permitira no tener que redibujar constantemente y supongo que algo de recursos dejara libres, teniendo que redibujar todo o solo secciones cuando estas se borren por el paso de una ventana o similar.

Lo de que este pensado inicialmente para tener que redibujar constantemente la pantalla es por pura comodidad, te evitas tener que recalcular zonas que hayan variado o calcular que zonas se han borrado, etc...

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.