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