Logo

¡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.
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.