CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Programando el Amstrad en BASIC, C, etc.
Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor ronaldo » Jue 27 Jul , 2017 10:18 am

En efecto, te comentaba que sólo puedes pintar con transparencias usando tabla si el color transparente es el 0, porque así es como está implementada la función de pintado con transparencias de tabla. Pero también te comenté, aunque quizá no coincidí mucho, que eso no es motivo para que pete.

Lo más importante cuando algo peta y no es obvio es depurar. Tenemos mucho reparo a depurar porque parece que es más lento porque hay que hacerlo en ensamblador, pero en realidad es varios órdenes de magnitud más rápido y, además, más instructivo. Depurando entiendes claramente lo que sucede y aprendes más sobre el proceso. Por tanto, ponte un punto de ruptura en main y traza el programa hasta ver donde peta (probablemente al llamar a alguna función). Después, parte de ese punto hacia atrás y revisa concienzudamente que los datos estén bien. Lo más probable es que algún dato no sea válido (tamaños, posiciones de pantalla, punteros, etc).

En estos casos, si sigues necesitando ayuda, lo mejor es que nos postees el proyecto para que podamos verlo. Con comentarios generales sobre lo que haces y lo que crees que peta sólo podemos especular y posiblemente te marearemos más que ayudarte.

Por último, no te preocupes. Es muy normal que estas cosas pasen al principio, cuando muchos detalles se nos escapan o no están claros. Te echaremos una mano en lo que haga falta y enseguida estarás a tope ;)

Avatar de Usuario
AmstradGamer
Forero habitual
Forero habitual
Mensajes: 189
Registrado: Dom 08 Jun , 2014 10:08 am

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor AmstradGamer » Jue 27 Jul , 2017 10:25 am

Pero el sprite es diferente si incluye la máscara o no la incluye.

Voy a suponer que tienes un sprite sin máscara y lo pintas con y sin transparencia.

Lo que dice ronaldo, enseña el código o date de golpes hasta que lo saques, que es como se aprende. ](*,)

Avatar de Usuario
jgonza
Keeper of The Forum
Keeper of The Forum
Mensajes: 962
Registrado: Mié 04 Abr , 2007 9:21 pm
Ubicación: Alboraya (Valencia)

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor jgonza » Jue 27 Jul , 2017 11:56 am

Pero el sprite es diferente si incluye la máscara o no la incluye.

Voy a suponer que tienes un sprite sin máscara y lo pintas con y sin transparencia.
Exacto, el sprite es sin máscara.

Lo pinto normal con "cpct_drawSprite(prota.sprite, pvmem, PRE_PLAYER_0_W, PRE_PLAYER_0_H);" y va perfecto.

Luego añado (después de los include) "cpctm_createTransparentMaskTable(pre_masktable, 0x0100, M0, 0);" y sustituyo la línea de arriba por "cpct_drawSpriteMaskedAlignedTable(prota.sprite, pvmem, PRE_PLAYER_0_W, PRE_PLAYER_0_H, pre_masktable);" y el emulador se reinicia al ejecutarlo.

Mi sprite es de 8x39 bytes, no sé si eso puede tener algo que ver con el problema...
Última edición por jgonza el Jue 27 Jul , 2017 12:48 pm, editado 1 vez en total.
Visita mi canal de YouTube http://www.youtube.com/c/jgonza

Avatar de Usuario
AmstradGamer
Forero habitual
Forero habitual
Mensajes: 189
Registrado: Dom 08 Jun , 2014 10:08 am

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor AmstradGamer » Jue 27 Jul , 2017 12:24 pm

Para pintar usando tabla de transparencias usas cpct_drawSpriteMaskedAlignedTable, supongo que te has colao al escribir.

Pues... ¿en qué dirección carga tu programa? ¿dónde tienes la pila?

Por defecto estos valores son 0x4000 y 0xC000 si no recuerdo mal.

La tabla de transparencias va de 0x0100 a 0x0200 en tu caso.

A ver si machacas algo...

Entiendo que, si usas varios ficheros, utilizas cpctm_declareMaskTable para declarar la tabla, si no no compilaría vamos.

Al final será una tontería.

Avatar de Usuario
jgonza
Keeper of The Forum
Keeper of The Forum
Mensajes: 962
Registrado: Mié 04 Abr , 2007 9:21 pm
Ubicación: Alboraya (Valencia)

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor jgonza » Jue 27 Jul , 2017 12:39 pm

Para pintar usando tabla de transparencias usas cpct_drawSpriteMaskedAlignedTable, supongo que te has colao al escribir.
Sí, :roll: ahora corrijo la errata en el post
Pues... ¿en qué dirección carga tu programa? ¿dónde tienes la pila?

Por defecto estos valores son 0x4000 y 0xC000 si no recuerdo mal.
Sí, 0x4000 y lo de la pila no sé lo que es :? C000 es donde empieza la memoria de vídeo si te refieres a eso
La tabla de transparencias va de 0x0100 a 0x0200 en tu caso.
Correcto.
Entiendo que, si usas varios ficheros, utilizas cpctm_declareMaskTable para declarar la tabla, si no no compilaría vamos.
No, la que uso es cpctm_createTransparentMaskTable(pre_masktable, 0x0100, M0, 0); (la que usa Fran en el tutorial)
Visita mi canal de YouTube http://www.youtube.com/c/jgonza

Avatar de Usuario
AmstradGamer
Forero habitual
Forero habitual
Mensajes: 189
Registrado: Dom 08 Jun , 2014 10:08 am

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor AmstradGamer » Jue 27 Jul , 2017 1:09 pm

La pila es una zona de memoria que se utiliza, principalmente, para almacenar los parámetros que se pasan entre funciones. Está bien que tengas localizada donde la tienes e incluso cómo funciona, pero de momento no creo que sea tu problema.

No sé! Me tienes en ascuas a ver si lo solucionas.

Avatar de Usuario
jgonza
Keeper of The Forum
Keeper of The Forum
Mensajes: 962
Registrado: Mié 04 Abr , 2007 9:21 pm
Ubicación: Alboraya (Valencia)

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor jgonza » Jue 27 Jul , 2017 1:15 pm

Lo único que estoy haciendo diferente del tutorial es no poner un fondo, es decir, uso el fondo por defecto del cpc...

Al principio del código pinto de azul toda la pantalla, luego pinto el sprite con su propio fondo en negro (insisto funciona perfecto).

Si hago el cambio indicado para que el negro del sprite se pinte como transparente, y por tanto se vea el azul del fondo, el resultado es un reset...
Visita mi canal de YouTube http://www.youtube.com/c/jgonza

Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor ronaldo » Jue 27 Jul , 2017 1:42 pm

Lo único que estoy haciendo diferente del tutorial es no poner un fondo, es decir, uso el fondo por defecto del cpc...

Al principio del código pinto de azul toda la pantalla, luego pinto el sprite con su propio fondo en negro (insisto funciona perfecto).

Si hago el cambio indicado para que el negro del sprite se pinte como transparente, y por tanto se vea el azul del fondo, el resultado es un reset...
Perdóname que insista. Con explicaciones en post pierdes el tiempo. Haz un zip con la carpeta de tu proyecto de CPCtelera y postealo. No hay nada que nos vaya a dar ni el 1% de información de la que hay en el propio código.

O, en su defecto, depura. Los pensamientos del tipo "No hago nada, sólo X" no sirven para resolver problemas en contextos de bajo nivel. En estos contextos hay muchos detalles a tener en cuenta y es muy fácil que se escape lo que realmente pasa. Por eso la recomendación es dejar de pensar en lo que haces y empezar a depurar lo que sucede.

Avatar de Usuario
jgonza
Keeper of The Forum
Keeper of The Forum
Mensajes: 962
Registrado: Mié 04 Abr , 2007 9:21 pm
Ubicación: Alboraya (Valencia)

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor jgonza » Jue 27 Jul , 2017 2:05 pm

Sí, te entiendo Fran, pero créeme, estoy siguiendo tus tutoriales a pies juntillas...

Acabo de comentar todo el código salvo lo que os pongo aquí y sigue pasando lo mismo, es decir,
ahora toda la pantalla está en negro y el sprite se pinta con su propio fondo en negro (cuando se pinta sin máscara).

Si descomento las líneas comentadas y comento la línea de drawSprite, el resultado debería ser el mismo (es decir, en lugar de pintar negro sobre negro, debería pintar el negro del sprite como si fuera transparente, dando como resultado que se viera el negro del fondo). Pero la emulación del winape se reinicia...

main.c

#include <cpctelera.h>
#include "player.h"

//cpctm_createTransparentMaskTable(pre_masktable, 0x0100, M0, 0);

typedef struct {
u8 x, y;
u8 *sprite;
u8 mover;
} TProta;

TProta prota;

void dibujarProta() {
u8 *pvmem; // Pointer to video memory
pvmem = cpct_getScreenPtr(CPCT_VMEM_START, prota.x, prota.y);
cpct_drawSprite(prota.sprite, pvmem, PRE_PLAYER_0_W, PRE_PLAYER_0_H);
// cpct_drawSpriteMaskedAlignedTable(prota.sprite, pvmem, PRE_PLAYER_0_W, PRE_PLAYER_0_H, pre_masktable);
}

void main(void) {
cpct_disableFirmware();
cpct_setVideoMode(0);
cpct_setBorder(HW_BLACK);
cpct_setPalette(pre_palette, 16);

prota.x = 0;
prota.y = 161;
prota.mover = 0;
prota.sprite = pre_player_0;

dibujarProta();

// Loop forever
while (1);
}

Luego si eso os paso todo el código comprimido.

Gracias!
Visita mi canal de YouTube http://www.youtube.com/c/jgonza

Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor ronaldo » Jue 27 Jul , 2017 2:31 pm

¿Dices que tu prota tiene 39 píxeles de altura?
¿Qué tal si pruebas a pintarlo en la línea 160 en lugar de la 161?

Cuando pases el proyecto completo le echo un ojo al resto, sobre todo porque los datos del sprite pueden ser relevantes.

Avatar de Usuario
jgonza
Keeper of The Forum
Keeper of The Forum
Mensajes: 962
Registrado: Mié 04 Abr , 2007 9:21 pm
Ubicación: Alboraya (Valencia)

Re: RE: Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor jgonza » Jue 27 Jul , 2017 2:43 pm

¿Dices que tu prota tiene 39 píxeles de altura?
¿Qué tal si pruebas a pintarlo en la línea 160 en lugar de la 161?

Cuando pases el proyecto completo le echo un ojo al resto, sobre todo porque los datos del sprite pueden ser relevantes.
En la 161 se queda a ras de borde (está comprobado). Además el sprite iría desde la 161 hasta la 199, dentro de rango entiendo yo.

Como digo el sprite se pinta bien (sin máscara) el problema es cuando quiero pintarlo con transparencia.

Enviado desde mi Aquaris U mediante Tapatalk
Visita mi canal de YouTube http://www.youtube.com/c/jgonza

Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor ronaldo » Jue 27 Jul , 2017 3:23 pm

He creado un proyecto con un sprite de pega, usando el código que has pasado y he estado depurando.

Para que veas hasta que punto es importante depurar y ver las cosas sobre el código: el problema que sucede es algo nuevo, que no había visto hasta ahora y bastante serio. Tiene toda la pinta de ser algún tipo de bug en iDSK. Paso a paso:
  • Al poner un breakpoint en _main y ejecutar, es evidente que sucede algo extraño. La ejecución comienza en una zona de memoria donde todo son "FF FF FF FF FF". En este caso, coincide con los datos de mi sprite de pega, que era todo FF.
  • Es evidente que ahí no es donde debe empezar la ejecución del programa.
  • Mirando la memoria, veo que el código de main() no aparece por ningún sitio. No está cargado en memoria.
  • Me voy al binario generado por CPCtelera y veo que el binario es correcto. El código de main está donde tiene que estar.
  • He abierto el DSK generado con un editor hexadecimal y he comprobado que todo el binario está en los sectores del DSK, la cabecera Amsdos es correcta y marca el tamaño adecuado del binario.
  • Sin embargo, lo que se carga en memoria en el emulador no es correcto.
  • He probado a añadir manualmente otra copia del mismo binario al DSK.
  • La segunda copia del mismo binario carga correctamente y ejecuta sin problemas. Importante: es exactamente el mismo binario.
  • Si se pide a iDSK que liste los contenidos del DSK, aparece esto: kk.bin 20 Kb, newkk.bin 17Kb. Son el mismo binario, pero uno ocupa 20K y otro 17K en el disco. El primero no carga bien, el segundo sí. El segundo es el que tiene el tamaño correcto (el tamaño real es 16655 bytes).
Conclusión: lo más probable es que se trate de un bug en la generación del DSK por parte de iDSK. Podría ser un error del emulador al interpretar el DSK, pero lo considero mucho menos probable dados los datos mostrados. De todas formas, adjunto el DSK por si queréis probarlo en otros emuladores y comprobar que da el mismo resultado.

Importante: Siempre depurar cuando sucenden cosas extrañas. Se localiza el problema mucho antes que haciendo presuposiciones. La mayoría de las veces, las presuposiciones son incorrectas y sólo nos hacen perder el tiempo.

Consecuencia: Muy probablemente el problema sucede debido al tamaño concreto del fichero. Soluciones posibles para este caso: 1) añadir un fichero al dsk en la generación (cualquiera vale) usando la carpeta dsk_files. 2) Hacer más grande el binario añadiendo más código, datos o llamadas a funciones. Probablemente el problema desaparezca.

Mientras tanto, veré si puedo saber cuál es el problema que sucede y se lo reportaré a Pulkomandy a ver si podemos resolverlo. Verdaderamente, es muy extraño. Después de 2 años usando CPCtelera, nunca había visto pasar un caso así.
kk.dsk
Disco de prueba con potencial generación incorrecta por parte de iDSK
(199.75 KiB) Descargado 44 veces

Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor ronaldo » Jue 27 Jul , 2017 5:19 pm

Bueno, chicos. Después de revisar más a conciencia, tengo que admitir mi parte de culpa en este interesante bug. Hay un detalle interesante, y es que el bug sólo sucede con DSKs previamente creados. Es decir: si hacemos "make cleanall", el bug desaparece, porque el DSK se vuelve a crear de nuevo.

Aquí es donde entra mi parte de la culpa: se supone que el DSK se recreaba en CPCtelera cada vez que se compilaba. Pues bien, revisando me he dado cuenta de que no. En algún momento hice un cambio a una macro que no recrea el DSK, sino que añade ficheros al DSK, creándolo sólo si no existía previamente. Esto es un problema importante, porque ese comportamiento potencia el problema de iDSK. De hecho, me consta que muchos problemas de gente se han resuelto haciendo "make cleanall". Pues bien, es por esto.

Conclusión: a todos nos toca recibir nuestro merecido de vez en cuando. Esta vez me toca a mi. Lo bueno, eso sí, gracias a la insistencia de @jgonza y a la participación de todos, tenemos este bug corregido. A partir de ahora, la compilación incremental será más útil que antes porque no producirá bugs por culpa de iDSK (por lo menos, no estos bugs).

Tenéis el parche subido a la rama master. Pensaré en hacer una bugfix release para que esté disponible por defecto en quienes se bajen la 1.4.2.

Gracias, chicos! :)

Avatar de Usuario
jgonza
Keeper of The Forum
Keeper of The Forum
Mensajes: 962
Registrado: Mié 04 Abr , 2007 9:21 pm
Ubicación: Alboraya (Valencia)

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor jgonza » Jue 27 Jul , 2017 5:56 pm

He creado un proyecto con un sprite de pega, usando el código que has pasado y he estado depurando.

Para que veas hasta que punto es importante depurar y ver las cosas sobre el código
Te confieso que sería incapaz de depurar el código tal y como tú lo acabas de hacer =D>
el problema que sucede es algo nuevo, que no había visto hasta ahora y bastante serio. Tiene toda la pinta de ser algún tipo de bug en iDSK. Paso a paso:
  • Al poner un breakpoint en _main y ejecutar, es evidente que sucede algo extraño. La ejecución comienza en una zona de memoria donde todo son "FF FF FF FF FF". En este caso, coincide con los datos de mi sprite de pega, que era todo FF.
  • Es evidente que ahí no es donde debe empezar la ejecución del programa.
  • Mirando la memoria, veo que el código de main() no aparece por ningún sitio. No está cargado en memoria.
  • Me voy al binario generado por CPCtelera y veo que el binario es correcto. El código de main está donde tiene que estar.
  • He abierto el DSK generado con un editor hexadecimal y he comprobado que todo el binario está en los sectores del DSK, la cabecera Amsdos es correcta y marca el tamaño adecuado del binario.
  • Sin embargo, lo que se carga en memoria en el emulador no es correcto.
  • He probado a añadir manualmente otra copia del mismo binario al DSK.
  • La segunda copia del mismo binario carga correctamente y ejecuta sin problemas. Importante: es exactamente el mismo binario.
  • Si se pide a iDSK que liste los contenidos del DSK, aparece esto: kk.bin 20 Kb, newkk.bin 17Kb. Son el mismo binario, pero uno ocupa 20K y otro 17K en el disco. El primero no carga bien, el segundo sí. El segundo es el que tiene el tamaño correcto (el tamaño real es 16655 bytes).
Conclusión: lo más probable es que se trate de un bug en la generación del DSK por parte de iDSK. Podría ser un error del emulador al interpretar el DSK, pero lo considero mucho menos probable dados los datos mostrados. De todas formas, adjunto el DSK por si queréis probarlo en otros emuladores y comprobar que da el mismo resultado.
Como comprenderás, para mi todo esto es prácticamente una caja negra (de hecho, creo que ese es el objetivo último de CPCtelera, librerías que le permitan al programador abstraerse de la mejor manera posible), a lo máximo que llego a estas alturas es a reportar los problemas encontrados :wink: quizá algún día con el tiempo llegue a dominar todo lo que comentas :roll:
Importante: Siempre depurar cuando sucenden cosas extrañas. Se localiza el problema mucho antes que haciendo presuposiciones. La mayoría de las veces, las presuposiciones son incorrectas y sólo nos hacen perder el tiempo.
Vas a tener que hacer un tutorial para depurar :mrgreen: no en serio, mi experiencia aquí es prácticamente nula, aún no sé distinguir lo que es un error extraño de lo que sería un error normal jejeje
Consecuencia: Muy probablemente el problema sucede debido al tamaño concreto del fichero. Soluciones posibles para este caso: 1) añadir un fichero al dsk en la generación (cualquiera vale) usando la carpeta dsk_files. 2) Hacer más grande el binario añadiendo más código, datos o llamadas a funciones. Probablemente el problema desaparezca.
Oscuro no, lo siguiente jajajaja
Mientras tanto, veré si puedo saber cuál es el problema que sucede y se lo reportaré a Pulkomandy a ver si podemos resolverlo. Verdaderamente, es muy extraño. Después de 2 años usando CPCtelera, nunca había visto pasar un caso así.
Ese es el tema, que no me salía de tus tutoriales, por lo que no entendía que estuviera cometiendo ningún error.

Ahora en seguida pruebo el DSK y te cuento.

MUCHAS GRACIAS!
Visita mi canal de YouTube http://www.youtube.com/c/jgonza

Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: CPCtelera, desarrollar juegos para Amstrad de forma sencilla

Mensajepor ronaldo » Jue 27 Jul , 2017 6:02 pm

Vas a tener que hacer un tutorial para depurar :mrgreen: no en serio, mi experiencia aquí es prácticamente nula, aún no sé distinguir lo que es un error extraño de lo que sería un error normal jejeje
Tus deseos son órdenes :D

Aquí lo tienes (https://www.youtube.com/watch?v=Um0g7AH_yfc)


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic