creo haber encontrado un bug en Put() y XPut().

Started by kim-elet-o, December 03, 2008, 10:39:58 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

kim-elet-o

Hola SplinterGu estoy realizando un remake del jet pac para el proyecto apagame4be.

En este remake, necesito dibujar la pantalla del juego en el fondo de pantalla, y para ello utilizo una tecnica muy basica de tiles, para dibujar tiles utilizo la funcion Put(), cuando probe la funcion mia de dibujado por tiles, me volvi loco buscando mi supuesto error en 6 lineas de codigo, por que un codigo tan sencillo se me resistia, hasta me di cuenta que cuando Put() se le entra un cero en el codigo del grafico, en vez de no dibujar nada en el fondo de la pantalla (supongo que seria este el comportamiento logico), esta dibuja precisamente lo que hay en fondo de la pantalla, ademas lo repite varias veces y cada copia erronea esta desplazada respecto a anterior, despues probe si sucedia lo mismo con Xput y voila el mismo problema.

En el Zip adjunto hay un test para que puedas comprobar lo que digo.

P.D: Estoy segurisimo que es bug, pero a estas alturas casi no tengo credibilidad como cazador de bug, si es un mal uso mio, pido perdon de antemano.

P.D2: En la ultima parte del test, hay que ir dando repetidamente el escape para ir viendo paso el dibujado del cuadrado de tiles.


|/
|\im-elet-o el yayo programador.

DCelso

Voy a mirarlo, killo yo en el manic miner uso map_xput y va de lujo.

A ver si va a ser el bug conocido de carga de imagenes de 8 bits de color
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

kim-elet-o

Gracias Dcelso, toda la tarde de ayer y parte de la mañana de hoy estube volviendome tarumba.

|/
|\im-elet-o el yayo programador.

DCelso

A priori el problema creo que es que segundo parámetro del put es el grafico dentro del fpg y claro los valores segun veo tus imagenes son 1,2,3,11,12,16,17,21,22,23,31,32,36,37,41,42,43 y 71.
Asi que tu rand solo debe devolver estos posibles valores.
Cuando metes el 0 pues la cagas, porque es un valor imposible, si no recuerdo mal, de todas formas hace cosas raras porque a priori todos los gráficos del fpg con numeros fuera de los anteriores nombrados estaran vacíos.

Tendrias que meter estos numeros en un vector de 18 elemento y hacer algo como mivector[rand(0,17)].

voy a ver si es esto o me estoy columpiando :D
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DCelso

#4
Prueba este codigo


GLOBAL

    Int Graficos;
    String Mensaje;
    int numeros[100];
    int indice_numero;
END

//*****************************************************************************************************************************************

FUNCTION Int CargaPngsEnFpg(String Ruta);        // rutina para cargar los Pngs de un subdirectorio en una libreria grafica en memoria,
                                                 // la funcion recibe como parametro el subdirectorio donde se encuentran los Pngs,
                                                 // y la funcion devuelve el identificador de la libreria graficaen memoria donde se encuentran los
                                                 // graficos cargados, en el nombre del Png se indica el punto central del grafico, y el Nº
                                                 // del grafico en el Fpg, el formato del nombre es:
    PRIVATE                                      // <X punto central>-<Y Punto central>-<Nº Grafico>-nombre.Png, Ejemplo: 15-9-11-marciano2A.png
        String Archivo;                          // Nombre del archivo Png.
        String Parametros[2];                    // Parametros del grafico a cargar en la libreria grafica.
        Int LibreriaId;                          // Identificador de la libreria grafica en memoria.
        Int GraficoId;                           // Identificador del grafico a cargar en la libreria grafica.
    BEGIN
     
        LibreriaId = Fpg_New();                  // creamos una libreria grafica en memoria.
       
        Archivo = Glob(Ruta + "*.png");          // Obtenemos el nombre del primer png,
        WHILE (Archivo <> "")                    // si no quedan mas pngs sal del bucle de busqueda,
            GraficoId = Load_Png(Ruta + Archivo); // cargamos el grafico del png en memoria
            Split("[-\.]",Archivo,OFFSET Parametros,3); // obtenemos las cadenas de los parametros introducidos en el nombre del png,
            Set_Point(0,GraficoId,0,Atoi(Parametros[1]),Atoi(Parametros[2])); // ponemos el punto central al grafico,
            Fpg_Add(LibreriaId,Atoi(Parametros[0]),0,GraficoId); // introducimos el grafico en la libreria grafica,
            numeros[indice_numero++]=Atoi(Parametros[0]);
            Archivo = Glob(Ruta + "*.png");      // obtenemos el nombre del siguiente png,
            Unload_Map(0,GraficoId);                 // Descargamos el grafico de la memoria,
        END                                      // bucle de busqueda,
       
        RETURN(LibreriaId);                      // devolvemos el identificador de la libreria.
       
    END

//*************************************************************************************************************************************************

BEGIN

    Set_Mode(800,600,Mode_16Bits,Mode_FullScreen);
    Graficos = CargaPngsEnFpg(Cd() + "\graphics\jet pac\"); //" cargamos la libreria en memoria a partir de pngs.
   
    Mensaje = "GRAFICOS MOSTRADOS CORRECTAMENTE";
    Write_String(0,300,50,0,OFFSET Mensaje);
   
    FROM X = 11 To 20;                                      // Creamos una cuadricula de 10x10 de graficos aleatorios.
        FROM Y = 8 TO 17;
            Put(Graficos,numeros[Rand(1,indice_numero-1)],11+X*24,11+Y*24);       // Si en el rango de numeros aleatorios no incluimos el cero,
        END                                                 // Put pone correctamente en el fondo de pantalla los graficos,
    END                                                     // si en vez de put utilizamos xput tambien los pone correctamente.
   
    WHILE (NOT(Key(_esc)))
        FRAME;
    END
    WHILE ((Key(_esc)))
        FRAME;
    END
   
    Clear_screen();
   
    Mensaje = "GRAFICOS MOSTRADOS INCORRECTAMENTE";
   
    FROM X = 11 To 20;                                      // Creamos una cuadricula de 10x10 de graficos aleatorios.
        FROM Y = 8 TO 17;
            Put(Graficos,numeros[Rand(0,indice_numero-1)],11+X*24,11+Y*24);       // Si en el rango de numeros aleatorios incluimos el cero,
        END                                                 // Put pone varias copias extras erroneamente a parte del grafico correcto,
    END                                                     // en el fondo de la pantalla, si utilizamos XPut tambien ocurre el mismo bug.
   
    WHILE (NOT(Key(_esc)))
        FRAME;
    END
    WHILE ((Key(_esc)))
        FRAME;
    END
   
    Clear_screen();
   
    Mensaje = "GRAFICOS MOSTRADOS INCORRECTAMENTE";
   
    FROM X = 0 To 9;                                      // Creamos una cuadricula de 10x10 de graficos aleatorios.
        FROM Y = 0 TO 9;
            Put(Graficos,numeros[Rand(1,indice_numero-1)],11+X*24,11+Y*24);     // Analizando con mas detenimiento el conportamiento de Put y Xput
            WHILE (NOT(Key(_esc)))                        // parace ser que cuando el valor de grafico vale cero, lo que hacen
                FRAME;                                    // las funciones Put y Xput es repetir varias veces el todo el fondo de
            END                                           // la pantalla, he hecho esta prueba cargando una libreria Fpg con Load_Fpg,
            WHILE ((Key(_esc)))                           // y ocurre exactamente lo mismo, con lo que deduzco que mi funcion CargaPngsEnFpg
                FRAME;                                    // funciona correctamente.
            END
        END                                                 
    END                                                   
   
    WHILE (NOT(Key(_esc)))
        FRAME;
    END
    WHILE ((Key(_esc)))
        FRAME;
    END
END
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

#5
grafico 0 es la pantalla... en realidad creo que 0 es el fondo de la pantalla (grafico) y -1 es el mapa de pantalla directo...
pero esto hay que tener cuidado, porque no hay que olvidarse que el engine dibuja al terminar cada frame, restaurando, y tomando cosas del grafico de fondo para restaurar...
no puedo ver ahora el codigo, quizas te referis a otra cosa, pero por lo que entiendo de tu mensaje, el problema puede venir por ahi y no es un problema...
decime, como te pregunte que version estas usando... si puede ser con fecha de los ejecutables y video (dir > lista) mejor...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

Gracias splinter , pero tambien dentro de un fpg?
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

version que usas? puede ser un bug corregido... porque me suena que me paso y lo corregi...

aca sale mi anterior post...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

no existen los fpg en memoria... son una coleccion de mapas agrupados... 0,0 y 0,-1, aunque creo que si es 0 y -1 se refiere a la lib del systema, y por eso va a la pantalla... tendria que verificarlo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

bueno, yo estoy usando la ultima wip de windows que tienes ya con el parche ultimo. El resultado es que si usas put(id_fpg,0,..) estás copiando en dicha posición toda la pantalla entera por eso el efecto de que se ve todo repetido y graficos entrecortados. Lo que parece ser es que usar 0 como id de gráfico siempre es la pantalla independientemente del valor del id_fpg.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

si, estoy casi seguro que si, ya no me acuerdo como quedo, pero 98% que es asi...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

kim-elet-o

Creo que uso la misma que Dcelso, la wip 15c.2, osea que si ponemos valor cero se refiere a fondo de pantalla, hmmmmm algo me parecia que era asi, pero opino que no es muy logico que si estas usando una libreria que se utilice como grafico el fondo de pantalla, a menos que estuvieras utilizando a ex profeso la libreria cero a modo especial, ademas hay un bug al utilizar el fondo de pantalla para dibujar en el fondo de pantalla, se produce un bucle que dibuja una vez y otra el fondo de pantalla, creo que si usas una libreria diferente a cero deberia pasar como en los procesos, si el codigo del grafico es cero no se dibuja nada.

|/
|\im-elet-o el yayo programador.

SplinterGU

si el codigo de grafico es cero no se dibuja nada, ahora si vos tenes la version que esta dibujando la pantalla cuando pones grafico 0, en realidad creo que es -1, estas usando la version que no tiene el fix sobre ese tema... ya esta solucionado hace un tiempo, solo que no pude generar nueva version... subire luego otra version...
pero bueno, quizas es otra cosa...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

kim-elet-o

Pues entonces es cuestion de esperar a la wip16, de momento he solucionado el problema añadiendo una condicion en la subrutina, esta condicion detecta cuando hay valor cero para que no dibuje nada en el fondo la pantalla, gracias y perdon por las molestias.

;) ;) ;)

|/
|\im-elet-o el yayo programador.

Prg

sí , reuerdo que esto pasaba en el editor fpg, le dabas a pegar y si no había nada en la variable copiar (copiar=0) pues pegaba el gráfico de fondo.
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)