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.
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
Gracias Dcelso, toda la tarde de ayer y parte de la mañana de hoy estube volviendome tarumba.
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
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
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...
Gracias splinter , pero tambien dentro de un fpg?
version que usas? puede ser un bug corregido... porque me suena que me paso y lo corregi...
aca sale mi anterior post...
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...
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.
si, estoy casi seguro que si, ya no me acuerdo como quedo, pero 98% que es asi...
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.
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...
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.
;) ;) ;)
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.
ya vi el codigo, el funcionamiento es correcto, si vos usas 0 como grafico de alguna funcion (no confundir con GRAPH=0), la funcion trabaja con/sobre el fondo de pantalla... por eso esta bien que ponga varias veces el grafico sobre si mismo, estas poniendo el fondo sobre el fondo, usando las coordenadas en cuestion + el centro... y por ende es logico que se dibuje a si mismo haciendo efecto espejo... pone 2 espejos enfrentados y vas a ver que pasa, el reflejo no puede borrar su fuente y a medida que se copia va generando informacion nueva sobre el source... y por ende queda imagen multiple...
no tenes que usar 0 si no queres trabajar sobre el fondo...
Esto me recuerda a un bug curioso que me pasó ayer con Fenix: tengo un gráfico para el raton cuando se pulsa el botón izquierdo, pero cuando no se pulsa hago mouse.graph=0. En ocasiones funciona bien, pero en otras ¡ZASCA! el raton se convierte en el fondo de pantalla.
Tengo que probarlo en bennu, a ver si el bug es mio (como siempre) o no :P
je, proba si posiblemente estas queriendo hacer mouse.graph de un numero de grafico inexistente o un load_png o load_algo que falle... o sea, de un archivo que no existe...
creo que ahi te puede fallar en fenix... en bennu no deberia...
No, no, es cuando hago mouse.graph=0 cuando se le asigna el fondo de pantalla. Para arreglarlo, de momento, le asigno un gráfico que no existe en el fpg y no da problemas (se vuelve invisible, como debe ser).
es raro, ya que mouse.graph=0 es el valor inicial que tiene esa variable cuando arranca, no sera que en algun punto del programa estas descargando el grafico que usa mouse y no reseteas mouse.graph?
pone un ejemplo...
Pues así, a bote pronto, sería:
graficos=load_fpg(...);
mouse.file=graficos;
loop
if (mouse.left) mouse.graph=1; else mouse.graph=0; end
frame;
end
Es algo así (obviamente con algo más de código), en ocasiones funciona bien, desaparece el cursor cuando no pulsas, y otras se le va la cabeza y representa el fondo de pantalla (version de fenix: 092a, queda claro que estoy haciendo algo de pantalla tactil para GP2X :D).
Ya digo que lo he solucionado asignando un grafico inexistente en el fpg, tampoco es algo crítico. Y es curioso porque en este mismo código, implementado en la 084 me dió muchísimos problemas las primitivas gráficas ¿estará maldito el código o algo?
es raro, eso te pasa en gp2x decis?