Tutorial muy básico de C para Master System

kusfo79 escribió:
Gammenon escribió:La Master System tiene enteros de 16 bits de forma nativa? Es decir, si hago un
int a = 15000;

las operaciones que haga con ese entero tendrán contrapartidas en las instrucciones del Z80 o bien el compilador los imitará por software?


Es capaz de hacerlas nativamente por hardware, pego la descripción de la oepración ADD de assmbler del Z80

The Z80 processor is able to directly add or subtract both 8 and 16-bit numbers.


Gracias kusfo79. El Z80 de la SMS es la Z80 "real" o es algo recortado como el de la Game Boy? El tema de las divisiones y multiplicaciones lo lleva bastante mal, no? Hay librerías de punto fijo?
@Diskover

Las structs son muy útiles, y las uso profusamente, en este tutorial no las he usado por que para las 4 cosas que estamos haciendo ya nos basta con unas pocas variables globales. Eso si, ojo que en maquinas de 8 bits como la master o la nes, se nota la diferencia entre programar de forma "clara" o de forma "eficiente". Por ejemplo, es mucho más eficiente a nivel del ensamblador generado, usar variables globales que no contengan structs, y no pasarlos por parámetro. Al final yo hago como una especia de compromiso, y pongo cosas como las posiciones de scroll, las velocidades y posicion del player, etc, como variables globales, y todo lo referente al resto de entidades, suelen ser structs.

@Gammenon Es un Z80 de verdad, como el del Spectrum, el Amstrad o el MSX (de hecho, la master es un derivado del MSX arquitecturalmente). Tema divisiones y multiplicaciones lo lleva bastante mal, claro, es mucho mejor si lo hacemos con desplazamiento de bits, por ejemplo, si queremos multiplicar x*136, esto lo podemos descomponer en x*128 + x*8, que puede hacerse como x<<7 + x<<3 , que es muuucho más eficiente que la multiplicación como tal.

Para hacer lo de punto fijo, puedes hacer lo siguiente, usa una variable unsigned int, y considera que dedicas 8 bits a la parte entera, y 8 bits a la parte decimal. Luego lo puedes convertir con algo así:

#define UFIX(x)      ((unsigned char)((x)>>8))

Y cuando lo quieres usar como unsigned char, haces:
x=UFIX(player_x)
kusfo79 escribió:@Diskover

Las structs son muy útiles, y las uso profusamente, en este tutorial no las he usado por que para las 4 cosas que estamos haciendo ya nos basta con unas pocas variables globales. Eso si, ojo que en maquinas de 8 bits como la master o la nes, se nota la diferencia entre programar de forma "clara" o de forma "eficiente". Por ejemplo, es mucho más eficiente a nivel del ensamblador generado, usar variables globales que no contengan structs, y no pasarlos por parámetro. Al final yo hago como una especia de compromiso, y pongo cosas como las posiciones de scroll, las velocidades y posicion del player, etc, como variables globales, y todo lo referente al resto de entidades, suelen ser structs.


Hombre, eso tambien lo hago yo definiendolas previamente y como globales.

Lo de struct lo comentaba por si alguien quería trabajar parecido a si tuvieramos objetos.

Sobre lo de los desplazamientos de bits... ¿podrías explicarlo mejor? He visto en muchos proyectos de gente que lo usan intensamente, pero yo sigo sin tener muy claro su funcionamiento.

Por ejemplo ¿2*64 como lo pondrias mediante desplazamiento de bits?
Diskover escribió:
kusfo79 escribió:@Diskover

Las structs son muy útiles, y las uso profusamente, en este tutorial no las he usado por que para las 4 cosas que estamos haciendo ya nos basta con unas pocas variables globales. Eso si, ojo que en maquinas de 8 bits como la master o la nes, se nota la diferencia entre programar de forma "clara" o de forma "eficiente". Por ejemplo, es mucho más eficiente a nivel del ensamblador generado, usar variables globales que no contengan structs, y no pasarlos por parámetro. Al final yo hago como una especia de compromiso, y pongo cosas como las posiciones de scroll, las velocidades y posicion del player, etc, como variables globales, y todo lo referente al resto de entidades, suelen ser structs.


Hombre, eso tambien lo hago yo definiendolas previamente y como globales.

Lo de struct lo comentaba por si alguien quería trabajar parecido a si tuvieramos objetos.

Sobre lo de los desplazamientos de bits... ¿podrías explicarlo mejor? He visto en muchos proyectos de gente que lo usan intensamente, pero yo sigo sin tener muy claro su funcionamiento.

Por ejemplo ¿2*64 como lo pondrias mediante desplazamiento de bits?


Cada desplazamiento de bits a la izquierda multiplica por 2 el valor, y a la derecha lo divide por la misma cantidad. Por ejemplo si tengo el valor 5 y lo desplazo 2 veces a la izquierda:

int a = 5;
a = a << 2; // O bien a <<= 2;
// Aquí "a" vale 20 (5 * 2 * 2)


2 * 64 sería:

int a = 64;
a <<= 1;
Gammenon escribió:Cada desplazamiento de bits a la izquierda multiplica por 2 el valor, y a la derecha lo divide por la misma cantidad. Por ejemplo si tengo el valor 5 y lo desplazo 2 veces a la izquierda:

int a = 5;
a = a << 2; // O bien a <<= 2;
// Aquí "a" vale 20 (5 * 2 * 2)


2 * 64 sería:

int a = 64;
a <<= 1;


¿Por qué pones <<=? ¿no valdría con <<?
Vaya que envidia, una pregunta, ¿tenéis estudios relacionados con la informática, o esto es todo en plan autodidacta?

Gracias!
Diskover escribió:
Gammenon escribió:Cada desplazamiento de bits a la izquierda multiplica por 2 el valor, y a la derecha lo divide por la misma cantidad. Por ejemplo si tengo el valor 5 y lo desplazo 2 veces a la izquierda:

int a = 5;
a = a << 2; // O bien a <<= 2;
// Aquí "a" vale 20 (5 * 2 * 2)


2 * 64 sería:

int a = 64;
a <<= 1;


¿Por qué pones <<=? ¿no valdría con <<?


En C tienes varios operadores como +, -, *, /, <<, >>, etc. Si los usas "sueltos" estas creando un valor temporal. Por ejemplo:

int a = 0;
a + 1;
// Aquí "a" no vale 1, vale 0 porque no has asignado un valor a "a", solo le has sumado 1 pero ese valor no lo ha "recogido" nadie.


Para que "a" valga 1 lo puedes hacer así:

int a = 0;
a = a + 1;


O bien

int a = 0;
a += 1;


En ambos casos "a" vale 1. El ejemplo ha sido con + y +=, pero los demas operadores también tiene su contrapartida "contraída": -=, *=, /=, <<=, >>=, etc

@aranya Yo hice la carrera de informática pero antes ya intenté aprender todo lo posible por mi cuenta para hacer juegos o programillas.
El compi @Gammenon lo ha explicado perfectamente :-)

Realmente, todo lo que sean multiplicaciones y divisiones es mucho mejor con desplazamiento de bits. Por ejemplo, para conocer en que columna de tiles está un sprite, puedes hacer algo tan simple como column_x = player_x >> 3; (Dividir entre 8)

PD: Yo también soy informático, aunque trastee un rato con assembler y basic con el Amstrad CPC cuando tenía 12 años o así.
@Gammenon, @kusfo79 , me lo imaginaba. Yo estoy en plan autodidacta con C. Desde pequeño he soñado con hacer algo para mí querida MS, y ahora que está el devkit, el tutorial de @kusfo79 , algunos compañeros como vosotros, y algún que otro español por el panorama de nuestra MS, pues creo que es el momento de lanzarse.

Además, ayer precisamente leí en SMSPower, en el hilo de Silver Valley, que ERuiz eligió la MS porque le permitía hacerlo todo el. Precisamente ayer también estuve jugando al The Incredible Hulk de MS, y en los créditos, hay un programador solo, y 2 personas en gráficos. Si ERuiz dice que le ha costado 4 meses de noches hacer Silver Valley el solo, ¿en cuanto tiempo hicieron el Hulk?, ¿3 semanas?.
kusfo79 escribió:Por ejemplo, para conocer en que columna de tiles está un sprite, puedes hacer algo tan simple como column_x = player_x >> 3; (Dividir entre 8)


Me acabas de solucionar la vida.
@aranya No tan rápido, por que en esa época, aparte que probar las roms era más coñazo, tenían que trabajar en asm e intentar conseguir una rom lo más pequeña posible para ahorrar costes.

@Diskover You're welcome :-)

Por cierto, estoy pensando en que, después de la lección de sonido que voy a colgar próximamente, no queda mucho que explicar directamente con este ejemplo, y molaría hacer más ejemplos con las nuevas versiones de la libreria, la nueva tool assets2bank, etc. Estoy pensando que quizá estaría bien hacer un minijuego entero, que permitiría enseñar más cosas. Que os parecería?
kusfo79 escribió:@aranya No tan rápido, por que en esa época, aparte que probar las roms era más coñazo, tenían que trabajar en asm e intentar conseguir una rom lo más pequeña posible para ahorrar costes.

@Diskover You're welcome :-)

Por cierto, estoy pensando en que, después de la lección de sonido que voy a colgar próximamente, no queda mucho que explicar directamente con este ejemplo, y molaría hacer más ejemplos con las nuevas versiones de la libreria, la nueva tool assets2bank, etc. Estoy pensando que quizá estaría bien hacer un minijuego entero, que permitiría enseñar más cosas. Que os parecería?


A mi me parecería de puta madre, qué me va a parecer! XD De hecho estaba pensando en hacer un Columns como primer juego para coger práctica con la SMS y hacer un hilo explicándolo todo lo detallado posible.
kusfo79 escribió:Por cierto, estoy pensando en que, después de la lección de sonido que voy a colgar próximamente, no queda mucho que explicar directamente con este ejemplo, y molaría hacer más ejemplos con las nuevas versiones de la libreria, la nueva tool assets2bank, etc. Estoy pensando que quizá estaría bien hacer un minijuego entero, que permitiría enseñar más cosas. Que os parecería?


A mí me parece perfecto. Sería ideal para asentar conocimientos y comprenderlo todo mucho mejor. [oki]
@Gammenon
Hombre, si lo quieres hacer tu, ningún problema!! :-D
kusfo79 escribió:@Gammenon
Hombre, si lo quieres hacer tu, ningún problema!! :-D


Lo que no sé es cuándo podré hacerlo, pero bueno, así sabes qué juego no hacer ya que lo haré yo ;-)
@kusfo79 , a mi me parece genial, cuanto mas completo el tutorial mejor. Muy grande el hilo.
Hola, @kusfo79

Yo tengo una dudilla, pero es sobre OpenGL y C++. Imagino que tendrás conocimientos. Perdón por el offtopic. Mi duda es:

Cómo hacer que el color de todo lo dibujado en pantalla cambie de colores grises claros a más oscuros, por ejemplo, cuando se da al botón pausa en el Super Mario Land 2. Estoy preparando un videojuego y me gustaría saber cómo hacer que los sprites cambien de color, sin necesidad de dibujar unos nuevos con los colores que quiero.

Y cómo es que te metiste en el mundillo? Programando por vía libre con algunos compañeros? Ánimo con tus proyectos.
Promis escribió:Hola, @kusfo79

Yo tengo una dudilla, pero es sobre OpenGL y C++. Imagino que tendrás conocimientos. Perdón por el offtopic. Mi duda es:

Cómo hacer que el color de todo lo dibujado en pantalla cambie de colores grises claros a más oscuros, por ejemplo, cuando se da al botón pausa en el Super Mario Land 2. Estoy preparando un videojuego y me gustaría saber cómo hacer que los sprites cambien de color, sin necesidad de dibujar unos nuevos con los colores que quiero.

Y cómo es que te metiste en el mundillo? Programando por vía libre con algunos compañeros? Ánimo con tus proyectos.


No soy kusfo79 pero ese efecto lo puedes conseguir por ejemplo pintando un quad (2 triángulos formando un cuadrado) semitransparente a pantalla completa encima de todo lo demás. Por cierto que si quieres hacer un juego 2D con C++ te recomiendo las librerías SFML, una capa sobre openGL que te facilita muchísimo el trabajo y además es multiplataforma.
Gracias, @Gammenon

Pues el caso es que tengo ligeramente avanzado el juego y lo estoy haciendo con Glut. Había oído que SFML tenía muy buenas librerías pero no me puse con él de primeras.

Aún así, gracias por lo del cuadrado, en cuanto toque la sección de hacer la pausa y otras cosillas lo probaré a ver.

Un saludo!
Como siempre, @Gammenon ya te ha contestado muy bien, jejeje.

En estás máquinas de 8 y 16 bits, al contar con una paleta definida, es muy fácil hacer efectos cambiando la paleta a una gama de grises o verdes.
Gracias @kusfo79

Algo estuve mirando de la paleta de Gameboy, marcando los colores en tripletas (creo) de 0 a 255. En caso de coger invencibilidad o darle a pausa, habría que cambiar los números de la paleta y ya está.

En mi caso al tener sprites definidos que se recortan del total de animaciones, tendré que poner el cuadrito encima del personaje, o de toda la pantalla para que se cambie su color completo.

Pero he entendido lo que decíais. :-)

Gracias de nuevo a los dos.
Buenas!

Con algo de prisa (acabo de ser padre, y la pequeña bicharraca quita una de tiempo que para qué), añado la octava lección al tutorial: Sonido!
Felicidades hombre. A disfrutar de la natividad de tu hija. :)
kusfo79 escribió:Buenas!

Con algo de prisa (acabo de ser padre, y la pequeña bicharraca quita una de tiempo que para qué), añado la octava lección al tutorial: Sonido!

Felicidades @kusfo79! Justo hoy he empezado a darle al tema de programar la máster system siguiendo tu tutorial ;-)
Guai! Dime si te encuentras cosas que no te funcionen. Han cambiado bastantes cosas desde que empecé, e igual hay cosas no retrocompatibles!
kusfo79 escribió:Guai! Dime si te encuentras cosas que no te funcionen. Han cambiado bastantes cosas desde que empecé, e igual hay cosas no retrocompatibles!


Pues estoy teniendo problemas con la resolución de 256x224. Descubrí que para que rule no basta con activar el "feature" VDPFEATURE_224LINES sino que hay que activar también el VDPFEATURE_EXTRAHEIGHT, o al menos así es cómo he conseguido activar esa resolución. Sin el segundo feature el emulador sólo mostraba una pantalla en negro, incluso el visor de tiles mostraba todo 100% negro.

El tema es que activando esas dos features obtengo la resolución pero no consigo centrar el scroll Y. De ésta imagen:

Imagen

Obtengo esta en el juego:

Imagen

Estoy trasteando con SMS_setBGScrollY() pero estoy obteniendo resultados muy raros. Quizás me esté haciendo un lío con el antes y después de esperar al vsync o qué se yo. Han actualizado la libreria devkitSMS? Quizás bajando una nueva versión se arregle esto.

Edito: salseando algo más he llegado a este codigo:

void main()
{
   Byte dt = 0;

   initConsole();
   loadGraphicsToVRAM();

   for(;;)
   {
      SMS_waitForVBlank();

      SMS_setBGScrollY(32);

      if(dt < 8 * 4)
      {
         dt++;
      }
   }
}


El efecto que hace es que el scroll sube hasta dejarlo como toca. Cómo es posible que pasándole 32 siempre a SMS_setBGScrollY() el scroll se mueve en vertical?

Adjuntos

mmm, pues no te se decir, pero yo no he trasteado con los modos PAL de 224 pixeles. Tengo curiosidad por saber si las filas "añadidas", van al principio o al final del tilemap. Por la imagen de lo que te sale, diría que las añade al principio, y estas posiciones están llenas de basurilla.

Por otro lado, lo que explicas del SMS_setBGScrollY es bien raro, pero puede estar relacionado con que este modo de doble altura no está bien implementado en la librería.

Voy a ver si descubro algo. Por otro lado, el que mejor nos puede contestar esto es sverx, si no lo descubro, le pregunto en smspower o en el twitter, a ver que dice!

Edit: si me pasas la rom, la miro en emulicious, a ver
kusfo79 escribió:mmm, pues no te se decir, pero yo no he trasteado con los modos PAL de 224 pixeles. Tengo curiosidad por saber si las filas "añadidas", van al principio o al final del tilemap. Por la imagen de lo que te sale, diría que las añade al principio, y estas posiciones están llenas de basurilla.

Por otro lado, lo que explicas del SMS_setBGScrollY es bien raro, pero puede estar relacionado con que este modo de doble altura no está bien implementado en la librería.

Voy a ver si descubro algo. Por otro lado, el que mejor nos puede contestar esto es sverx, si no lo descubro, le pregunto en smspower o en el twitter, a ver que dice!

Edit: si me pasas la rom, la miro en emulicious, a ver


Ahí tienes la ROM, a ver si sacas algo. Necesito el modo de 224 píxeles de altura para poder usar directamente los gráficos de Mega Drive, sino tendría que bajar el tamaño de los bloques y quedaría igual de feo que el Columns que sacaron en su día para la Master System }:/

Adjuntos

Vale, ya he visto el problema:

En el modo normal de 192 pixeles de resolucion, tenemos 24 filas visibles, y todo el tilemap tiene 28. La dirección del primer tile, el situado en 0,0, es $3800.

En el modo de altura extendida, tenemos 28 filas visibles, con un tilemap de 32. La dirección del primer tile es $3700. Como la función de carga parece que no lo tiene en cuenta, sigue cargando el tilemap en la posición $3800, con lo que las 4 primeras filas están llenas de "basurilla".

Lo que no se por que ocurre, es el tema del scroll, lo tendré que mirar a ver...
kusfo79 escribió:Vale, ya he visto el problema:

En el modo normal de 192 pixeles de resolucion, tenemos 24 filas visibles, y todo el tilemap tiene 28. La dirección del primer tile, el situado en 0,0, es $3800.

En el modo de altura extendida, tenemos 28 filas visibles, con un tilemap de 32. La dirección del primer tile es $3700. Como la función de carga parece que no lo tiene en cuenta, sigue cargando el tilemap en la posición $3800, con lo que las 4 primeras filas están llenas de "basurilla".

Lo que no se por que ocurre, es el tema del scroll, lo tendré que mirar a ver...


Tiene sentido eso de las direcciones. Si quieres cuando vuelva a casa esta tarde te puedo pasar todo el proyecto para que puedas comprobar lo del scroll.
estupendo, pasameloy me lo miro!
Después de estar toqueteando el código el scroll aún se resiste. Teniendo éste código:

void main()
{
    initConsole();
    loadGraphicsToVRAM();

    SMS_setBGScrollX(0);
    SMS_setBGScrollY(32);
    SMS_displayOn();

    for(;;)
    {
        SMS_waitForVBlank();
    }
}


El emulador muestra esto:
Imagen

Adjuntos

Cojones!.

Te pongo en un link mi directorio tal cual, a ver que te pasa si lo compilas tu directamente, y
te adjunto la imagen de lo que veo.

https://www.dropbox.com/s/jh7hepm1yxfnh ... s.zip?dl=0

He bajado el zip y lo he descomprimido en su directorio, le he dado a "build.bat" y ha hecho todo el proceso. Resultado: lo puto mismo [carcajad] [carcajad] [carcajad] Pongo el zip con la rom que ha generado el zip de tu dropbox, kusfo79, por si acaso...

Adjuntos

joder que raro...

lo que veo con tu rom, es que el scroll se queda fijo en 82, 82.

Me puedes pasar el archivo columns_sms.asm?
tocate los cojones, los asm son iguales...entonces el problema ha de estar en el linkage posterior. A ver si encuentro una herramienta para comparar binarios
Winmerge por ejemplo te dice si son iguales o no, pero no la diferencia.

Me he metido con los sprites y ya pongo cosas en pantalla. Cómo le indico a bmp2tile el color transparente que tiene que usar?

Edito de nuevo: @kusfo79, ya he resuelto el misterio: el tema es que el SMSlib.lib que se estaba linkando a mi ROM era uno que parece ser que no era el que tocaba. Tengo los lib y rel en la carpeta SDCC\lib\z80 y los cogía de ahí. El crt0_sms.rel sí lo tenía en la ruta del proyecto y quizás era por esto, que las versiones no coincidían. Ahora fijo el scroll en (0, 32) y se ve bien. Menos mal [+risas] En todo caso muchas gracias por toda la ayuda de estos días [oki]
Guai que lo hayas encontrado! Como el asm del main era igual, tenia que ser algo con las librerias, jeje
kusfo79 escribió:Guai que lo hayas encontrado! Como el asm del main era igual, tenia que ser algo con las librerias, jeje


Sabes lo del bmp2tile para decirle que use tal color como transparente?
Como Bmp2Tile saca las paletas tal cual, necesitaras que el color transparente esté en la posición 0 de la paleta.

Obviamente, esto solo afecta a sprites.
kusfo79 escribió:Como Bmp2Tile saca las paletas tal cual, necesitaras que el color transparente esté en la posición 0 de la paleta.

Obviamente, esto solo afecta a sprites.


Pero entonces cómo hago para controlar eso? Porque igual el color que me pilla el bmp2tile es uno que uso en píxeles opacos.
Con que manejas los gráficos?

Siempre has de usar una app que te permita definir paletas de 8 bits (16 colores), y puedas poner la paleta exactamente como tu quieras?

Por qué? por que aparte del tema del color transparente, si quieres realizar efectos de paleta, vas a necesitar que las paletas estén en posiciones determinadas, no puedes dejar que los colores estén en posiciones "random" de la paleta.

Hay varias apps que te permiten esto. Yo uso MtPaint por que hace tiempo que la usaba, aunque es un poco caca, pero tienes otras opciones como AseSprite, Pro Motion Go o GraphicsGale.
kusfo79 escribió:Con que manejas los gráficos?

Siempre has de usar una app que te permita definir paletas de 8 bits (16 colores), y puedas poner la paleta exactamente como tu quieras?

Por qué? por que aparte del tema del color transparente, si quieres realizar efectos de paleta, vas a necesitar que las paletas estén en posiciones determinadas, no puedes dejar que los colores estén en posiciones "random" de la paleta.

Hay varias apps que te permiten esto. Yo uso MtPaint por que hace tiempo que la usaba, aunque es un poco caca, pero tienes otras opciones como AseSprite, Pro Motion Go o GraphicsGale.


Ah vale, yo uso paint.NET que obviamente no deja toquetear la paleta, creía que bmp2tile me permitiría de alguna manera elegir un color como transparente (que por cierto hay documentación de ésta herramienta en alguna parte? No he encontrado nada). Miraré los programas que me has comentado, gracias! [oki]
De Bmp2Tile hay basicamente lo poco que pone Maxim en su web y en el github:

http://www.smspower.org/maxim/Software/BMP2Tile

Yo también uso mucho Paint.net, por que como soy muy muñón dibujando, lo que hago es usar el paint.net para recortar capturas, etc, ordenar los frames, y cuando tengo la imagen lista, la exporto en png de 8 bits, la abro con el mtpaint, y le edito la paleta desde allí.

Yo en el brawler que hice para lo de fnac en 8 horas, me hice un script en python para exportar los sprites directamente en un formato que me interesaba, etc, pero eso ya es hacky a saco xD

https://github.com/kusfo/mastersystembrawler/blob/master/tools/spriter-tiles.py
Si se puede hacer así perfecto, usaré el paint.NET para manejar todo y ya el tuneo de la paleta lo hago con un programa de esos, que será toquetear un par de cosas y ya XD

La cosa está saliendo para adelante pero tengo una duda: cómo se suele hacer los displays de puntuación y demás? No me refiero a la gestión de tiles, eso lo tengo claro. A lo que me refiero es, ¿Cómo se guarda esta información para que la conversión de puntuación -> índices de tiles sea rápida? Se suele usar BCD? Se coge el int o el tipo que sea y se sacan los índices al vuelo? Pienso usar éste último método en mi juego para empezar, no creo que de problemas de velocidad aunque tenga que hacer divisiones.
Por cierto, Psidum, un miembro de smspower, ha publicado una librería de scroll multidireccional para master system que está la mar de bien. Dicha librería puede usarse en C (juntamente con devkitSMS) y permite importar casi directamente mapas creados con Tiled, y ejecutarlos en la master system.

http://www.smspower.org/forums/16800-GeneralScrollLibraryGSLib

Si os bajais los dos zips del primer mensaje, hay una demo la mar de chula (no os hago spoiler de lo que es), con código incluído, y aparte la librería y la app para importar mapas de Tiled.

A ver si lo pongo pronto en el tutorial!
kusfo79 escribió:Por cierto, Psidum, un miembro de smspower, ha publicado una librería de scroll multidireccional para master system que está la mar de bien. Dicha librería puede usarse en C (juntamente con devkitSMS) y permite importar casi directamente mapas creados con Tiled, y ejecutarlos en la master system.

http://www.smspower.org/forums/16800-GeneralScrollLibraryGSLib

Si os bajais los dos zips del primer mensaje, hay una demo la mar de chula (no os hago spoiler de lo que es), con código incluído, y aparte la librería y la app para importar mapas de Tiled.

A ver si lo pongo pronto en el tutorial!


Golden Axe Warrior, eh kusfo? XD Este motor tiene una pinta buenísima, gracias por el chivatazo ;-)
mola que te cagas! Algún día haré un Zelda clon en master :-)
1022 respuestas
14, 5, 6, 7, 821