Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





problema con Blit_Mirror

Iniciado por Hechelion, 17 de Septiembre de 2008, 11:36:34 AM

« anterior - próximo »

Hechelion

Buenas nuevamente.

En la programación del juego tengo las siguientes lineas que me dibujan una nave (un png), dependiendo de la dirección de la misma, es que la dibujo de forma normal o con mirror horizontal, sin embargo ahora que pase a la versión 2.2, el mismo código no me dibuja nada si en la función "DRAW_AdvMap" utilizo el valor "Mirror_Horizontal", o sea, si dibujo de forma directa no tengo problema, pero al tratar de utilizar el mirror el dibujo simplemente desaparece.

Citar
....
FrmFlota = m_gfx.MAP_Load(App.Path & "\Recursos\naves.png", &HFFFF00FF)
....
....
....
Dim Espejo As Blit_Mirror

For i = 0 To 1024
    If Flotas(i, 0) = 1 Then 'Buscar solo flotas que pertenezcan al jugador
    'Determinar coordenas para dibujo de recorrido
        PosInicialX = 36 + Planeta(Flotas(i, 5), 4) * 32
        PosInicialY = 86 + Planeta(Flotas(i, 5), 5) * 32
        PosFinalX = 36 + Planeta(Flotas(i, 1), 4) * 32
        PosFinalY = 86 + Planeta(Flotas(i, 1), 5) * 32
    'Dibujar recorrido de la flota
        Call m_gfx.DRAW_Line(PosInicialX - 1, PosInicialY, PosFinalX, PosFinalY, 0, m_gfx.ARGB_Set(255, 70, 20, 200))
        Call m_gfx.DRAW_Line(PosInicialX + 1, PosInicialY, PosFinalX, PosFinalY, 0, m_gfx.ARGB_Set(255, 70, 20, 200))
        Call m_gfx.DRAW_Line(PosInicialX, PosInicialY - 1, PosFinalX, PosFinalY, 0, m_gfx.ARGB_Set(255, 70, 20, 200))
        Call m_gfx.DRAW_Line(PosInicialX, PosInicialY + 1, PosFinalX, PosFinalY, 0, m_gfx.ARGB_Set(255, 70, 20, 200))
        Call m_gfx.DRAW_Line(PosInicialX, PosInicialY, PosFinalX, PosFinalY, 0, m_gfx.ARGB_Set(255, 87, 226, 33))
   
    'Posicionar y dibujar Flota
        DeltaFlota = Flotas(i, 4) - Flotas(i, 6)
        PosFlotaX = PosInicialX - 16 + ((PosFinalX - PosInicialX) / DeltaFlota) * ((NumTurno - Flotas(i, 6)) + 0.5)
        PosFlotaY = PosInicialY - 16 + ((PosFinalY - PosInicialY) / DeltaFlota) * ((NumTurno - Flotas(i, 6)) + 0.5)
       
        Espejo = Mirror_None 'Iniciar espejo para flota que va a la izquierda
        If PosFinalX - PosInicialX > 0 Then Espejo = Mirror_Horizontal 'Determinar si flota va a la derecha
        Call m_gfx.DRAW_AdvMap(FrmFlota, PosFlotaX, PosFlotaY, -1, 0, 0, Blendop_Color, &HFFFFFFFF, Espejo, Filter_None, 0)

....

¿alguna idea?, porque le he estado dando vueltas al asunto pero no lo veo el problema.

[EX3]

#1
Acabo de hacer una prueba y los espejados si funcionan, tanto si lo llamo directamente como si lo hago a traves de una variable como haces tu. Mira a ver que no estes errando las coordenadas, no se.

Este el codigo que he probado aqui en la oficina:
Código (vb) [Seleccionar]
Option Explicit

Dim gfx As New dx_GFX_Class
Dim sprite As Long, mirror As Blit_Mirror

Private Sub Form_Load()
    gfx.Init Me.hWnd, 300, 300, , True
    sprite = gfx.MAP_Load(App.Path & "\tlsa_remember.png", 0)
    mirror = Blit_Mirror.Mirror_Horizontal
End Sub

Private Sub Timer1_Timer()
    gfx.DRAW_MapEx sprite, 0, 0, 0, 0, 0, 0, Blendop_Color, &HFFFFFFFF, mirror, Filter_Bilinear, False
    gfx.Frame
End Sub


Por cierto, no deberias indicar colorkey al cargar un PNG si este ya tiene transparencia aplicada por alpha, dicho sea, esa es la ventaja del PNG, que aplica diferentes niveles de alpha en la imagen y permite evitar los bordes aserrados entre otros artefactos.

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

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

Hechelion

Lo del PNG es una larga historia, ahora que estoy reeditando posiblemente vuelva tocar las imágenes y aprovechando a gimp le de transparencia al PNG (los actuales no lo tienen, de ahí que deba indicar el colorkey.)

Con respecto a lo del espejado también me pareció rarisimo, en especial porque recuerdo que trabaja sin problemas con las versiones antiguas y esa parte del código no la he tocado, con respecto a las coordenadas también lo pensé e hice la prueba comentando la línea que cambia el valor a la variable "espejo" y las imágenes aparecieron inmediatamente (claro que todas apuntando a la izquierda). Voy a registrar la versión antigua de la librería y te comento como me fue.

Hechelion

#3
Pues no le encuentro problemas a la lógica, incluso cargue la librería antigua y corrí el último ejecutable que tenía y funciona de maravilla:



la primera imagen es con el código como esta-
en la segunda imagen comento la línea "Espejo = Mirror_Horizontal"
la tercera es del último ejecutable con la librería antigua.

EDIT

Pues decidí sacarle el colorkey a la imagen y mira que lo que aparece:



sinceramente, si mi equipo no tiene Gremlin, pues simplemente no se me ocurre que diablos esta pasando.

EDIT2.

he retornado a la librería anterior el proyecto y las naves aparecen correctamente, por lo cual descarto cualquier problema de lógica.

Edit 3
Aunque no he encontrado el problema de fondo, por lo menos encontre una solución, y es cambiar el advmap que estaba utilizando por el MapEx.
A mi entender no debería dar problema, en especial si la versión antigua funciona, pero esos detalles quedan en tus manos no en las mias   >:D >:D >:D

[EX3]

Cawen, yo lo he mirado con la funcion DRAW_MapEx, no con la DRAW_AdvMap que es la que estas usando :P Si, a mi tambien me falla y tambien he encontrado el motivo (pero este error era menos evidente que el del Key_Press  ::)).

Me da gracia el asunto, DRAW_AdvMap() es una funcion que apenas nadie (salvo tu, al menos que tenga noticia por el foro) excepto yo ha explotado en sus desarrollos (la diseñe para el plataformas que intento desarrollar) y hasta la fecha no habia encontrado error alguno en su uso, sencillamente por que no aplicaba espejados en esta funcion xD

Idem, esta tarde vendra corregido junto al otro error del Key_Press. Ya que te veo ocioso, si encuentras algun error mas hazmelo saber. Yo tengo que seguir en casa con los tutoriales asi que quizas encuentre algun otro escondido, aunque en la Campus Party de este año le meti caña a la libreria en la compo72h y no encontre error alguno, por lo que espero que estos dos casos sean aislados (ya estoy hasta el carajo de arreglar bugs en la libreria xDDDDDDDDDDD)

Salu2... :)

P.D.: Lo del PNG, el formato en si no quiere decir que tenga que tener aplicado transparencia, si no la aplicas tu en photoshop o el programa que sea el PNG no la tendra. Si tus imagenes no tienen transparencia aplicada entonces si tendras que usar colorkey, pero si aplicas la transparencia en photoshop, este al hacerlo con el suavizado en la seleccion de zonas (varita magica) suavizara los bordes y contornos de los sprites que haya en la imagen, por lo que evitaras el efecto aserrado de los pixeles recortados con el colorkey (y evitas tener que descartar un color de la imagen que no podrias usar).
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

Hechelion

Vale, a esperar la actualización entonces.
Te comento que por mis pagos estamos celebrando la independencia (sin enojarse Españoles), así que tengo desde hoy libre, por eso me pillaste tan fructífero.

Lo de PNG como te comentaba es una larga historia, pues no uso photoshop y en esos entonces no sabía que gimp estaba exportado a windows (sólo lo tenia en la partición de linux), bajo windows utilizaba una reliquia (aldus photostyler), el cual no tiene opción de transparencia, pero como era lo que tenía a mano simplemente opte por lo más corto, crear el PNG y darle transparencia con la libreria.

PD: Por estas fechas he estado con bastante mala suerte, así que créeme que estoy en el momento propicio para encontrar errores raros donde nadie más los ha tenido.

[EX3]

Ya esta aplicada la correccion a la descarga de ayer :)

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

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

Hechelion


Hechelion

#8
¿Seguro que has modificado el enlace de descarga?

Mira que desinstale, borre y volví a descargar e instalar y los problemas están exactamente iguales.

dxlib32v220CTPsetup.exe

[EX3]

#9
Si te aparece el leeme en la instalacion, el titulo cambiado de "dx_lib32 2.2.0 para Windows Vista" por "dx_lib32 2.2.0 CTP" y la carpeta del menu inicio por "dx_lib32 2.2.0 CTP" en vez de "dx_lib32 2.2.0", si has descargado la version corregida.

Yo lo he probado y si me funcionan las modificaciones, tanto el Key_Press como los espejado en DRAW_AdvMap.

Salu2...

Edit: He vuelto a generar el distribuible por si las moscas, por que tengo un follon montado con un par de versiones y quizas metiera la que no debi :P Vuelve a bajar el instalador y prueba de nuevo.
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

Hechelion

#10
ahora sí. Por lo menos con la actualización de la liberria (ahora me marca que la última modificación del archivo tiene fecha de 17/9 y no del 28/8).

La función advMap funciona impecable pero siguen existiendo problemas con el Hit, ahora sólo me detecta una única vez la pulsación de una tecla, o sea, si presiono dos veces la tecla A, sólo me la toma como una. Incluso si intento ingresar el valor "121" sólo me reconoce el "12" y lo mismo ocurre con el "enter", además persiste el error de múltiples flancos de subida al precionar una tecla si tengo el input dentro del bucle principal (voy a tratar de subir una imagen del problema)

EDIT:



En ese diagrama de tiempo te adjunto lo que yo asumo debería hacer la función Key_Hit y lo que esta haciendo actualmente. El problema de las múltiples detecciones al inicio lo corrijo metiendo el bucle de input en un timer en paralelo cada 2 ms, pero yo asumo que hit sólo me debería devolver TRUE una sola vez (por cada pulsación de la tecla) y no mantener el valor TRUE durante un tiempo.

El bug más serio es que en esta actualización, cuando tratas de detectar la segunda o tercera pulsación de una misma tecla esta no la detecta y Key_Hit sigue devolviendo false.

[EX3]

Localizado y corregido, tanto Key_Press como Key_Hit funcionan.

Esta mañana no recordaba exactamente que hacia las dos lineas de codigo que quite en el evento interno de dx_Input y una de ellas se ve que la usaba Key_Hit para controlar el estado. Sobre esa frecuencia que mencionas de Key_Hit, Key_Hit mantiene el estado de la tecla hasta durante el tiempo que tarda en actualizar los valores del evento interno de dx_Input (evento que esta alojado en un hilo independiente de un cronometro del sistema con espera de 0 milisegundos, osea, inmediata, para que el codigo del programa no interfiera ni provoque retrasos). Acabo de hacer una prueba escribiendo en la ventana de inmediato del Visual Basic escribiendo en cada bucle el estado de Key_Hit y solo me anota "una pulsacion por llamada en cada ciclo", si hago 3 llamadas a Key_Hit contra la misma tecla hasta que no acabe el ciclo devolvera verdadero. Te referias a eso o es otra cosa?

Esta correccion en principio la dejare para la publicacion oficial, por que haciendo los tutoriales seguro (aunque a estas alturas ya seria de risa) que me encuentro alguna otra sorpresa escondida en dx_Input con los gamepads o en dx_Video o en dx_System, que son las que me faltan. dx_Sound parece que no ha dado guerra alguna en los tutoriales y dx_GFX, si no asoma ningun otro error tambien quedaria descartada de errores.

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

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

Hechelion

más menos tengo lo siguiente:


public sub Entradas
if m_input.key_hit(Key_1) then text1 = text1 & 1
end sub
....
...
...
Loop_Princpial
  'Comprobar estado de input
  Entradas

  'Llamar a graficos ,etc
end loop


En esa línea, si presiono la tecla "1" en text1 me aparecen "111" o "1111" o "11", etc

tengo que sacar el llamdo a la función "Entradas" y colocarlo en un timer cada 2 ms.


public sub Entradas
if m_input.key_hit(Key_1) then text1 = text1 & 1
end sub
....
...
...
Loop_Princpial

  'Llamar a graficos ,etc
end loop
....
....
....
Private sub Timer1_Timer() 'con interval 2
  'Comprobar estado de input
  Entradas
end sub


ahora cada si funciona. El problema es que en la versión anterior de la libreria funcionaba sin problema independiente de donde tuviera la llamada a la función "Entradas".

PD: La falla en la función Hit es bastante critica, ya que de no disponer de la corrección debo cambiar todo a key_press o volver a la biblioteca antigua (recuerda que mi proyecto es mediante turnos), si por último me puedes mandar una copia de la .dll para poder trabajar con el HIT te lo agradeceria.

[EX3]

Text1 es un control TextBox? Si es un control TextBox normal que al presionar 1 te aparezcan varios 1 en vez de uno. El TextBox esta recibiendo el foco del formulario y del teclado, por lo que respondera primero al foco del teclado via Windows mas la pulsacion que lea via dx_lib32. Para que me entiendas, mete otro control en el formulario que pueda recibir foco, un PictureBox por ejemplo. Pulsa sobre el PictureBox para quitar el foco al TextBox y vuelve a probar tu codigo, veras que solo agrega un 1 mientras tengas pulsada la tecla.

CitarEl problema es que en la versión anterior de la libreria funcionaba sin problema independiente de donde tuviera la llamada a la función "Entradas".
Es en la version 2.1.190 donde si que no funcionaba ya que solo leia la primera vez y no las restantes (error que localizo RobiHm) por eso no pasaba lo de la repeticion de caracteres como ahora.

Al final he decidido subir la nueva correccion asi que vuelve a bajar el distribuible y prueba.

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

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

Hechelion

#14
Dios mio que velocidad al responder, mejor que libreria paga  :D

Lo del textbox lo he puesto como ejemplo para que se entienda el problema, ya que en realidad tengo una rutina que dibuja el contenido de una variable que es la recibe el ingreso del teclado (este proyecto lo habia iniciado antes que Robihim publicara su clase para cuadros de texto). Y si te fijas, estoy escribiendo el código de memoria, así que para simplificar...

PD: También como con tenedor y cuchillo (o sea, tan bestia no soy  ^_^')

PD2: Se agradece la actualización, apenas encuentre otro bug te aviso  0:-)

EDIT
Código (vb) [Seleccionar]

If Estado = 2 Then
    If .Key_Hit(Key_0) Then
AuxFlotaEnviada = AuxFlotaEnviada & "0"
    ElseIf .Key_Hit(Key_1) Then
        AuxFlotaEnviada = AuxFlotaEnviada & "1"
    ElseIf .Key_Hit(Key_2) Then
        AuxFlotaEnviada = AuxFlotaEnviada & "2"
    ElseIf .Key_Hit(Key_3) Then
        AuxFlotaEnviada = AuxFlotaEnviada & "3"
    ElseIf .Key_Hit(Key_4) Then
        AuxFlotaEnviada = AuxFlotaEnviada & "4"
    ElseIf .Key_Hit(Key_5) Then
        AuxFlotaEnviada = AuxFlotaEnviada & "5"
    ElseIf .Key_Hit(Key_6) Then
        AuxFlotaEnviada = AuxFlotaEnviada & "6"
    ElseIf .Key_Hit(Key_7) Then
        AuxFlotaEnviada = AuxFlotaEnviada & "7"
    ElseIf .Key_Hit(Key_8) Then
        AuxFlotaEnviada = AuxFlotaEnviada & "8"
    ElseIf .Key_Hit(Key_9) Then
        AuxFlotaEnviada = AuxFlotaEnviada & "9"
    End If
End If


Esas son las líneas reales, además aclaro que el problema se me presentaba con todos los eventos del input, incluyendo el click del ratón.
Con la última "actualización" se encuentra funcionando todo a las mil maravillas.

Felicitaciones Ex3.






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.