Tutorial muy básico de C para Master System

1, 2, 3, 4, 521
Ya tenemos la lección de sprites con animación colgada!!
Qué buena pinta está cogiendo el tutorial :)
Yo, por mi parte, lo retomaré en cuanto sepa algo más de programación en C, que ando un poco pez.
Pero lo tengo muy presente.
Gracias @kusfo79 por tu gran trabajo.
buen curro, tengo mucho que leer, gracias.
gracias a vosotros por seguirlo!
Por si a alguien le sirve, el editor de imágenes bmp2tile me pedía msvcp120.dll con un windows XP sp3
Lo he solucionado instalando esto.

Parece que en Windows 2000 también hace falta.
theelf escribió:Eso si, en windows 2000, me dio por saco el bmp2tile, xq requiere las runtime 2013 del visual... ahhh... odio cuando requieren librerias inecesariamente... :-|


Gracias por el tuto!

Imagen

Algo hice mal hahah [+risas] [carcajad] [+risas]
ostras! jejeje

Puedes mirar el contenido de la VRAM? puede ser que el fondo ocupe demasiado
Muchas gracias de nuevo por tu trabajo kusfo79. A ver si un día de estos puedo ponerme y crear algo para devolver el favor que le estás haciendo a la comunidad [tadoramo]
Me gustaría ponerme un día a probar a hacer cualquier tontería ya que estás haciendo el tuto para dummies XD

theelf, genial también [jaja]
kusfo79 escribió:Puedes mirar el contenido de la VRAM? puede ser que el fondo ocupe demasiado

Creo que sí era cosa de lla imagen de fondo, ocupaba demasiado. Dejo anotado lo que hice:

He intentado ver la VRAM... pero no sabía que es lo que tenía que buscar o donde. He usado el Bmp2tile para abrir el archivo, en la pestaña Messages encontré una pista: "483 tiles converted". En el hilo escribiste que máximo son utilizables unos 440 tiles, así que le quité detalles. Con 442 conseguí que se vea decente :D
ueee! jejeje

Es que vi que usas el meka, tanto en el meka como en el emulicious puedes ver el contenido actual de la VRAM, con lo qual puedes ver si has llenado demasiado la VRAM y no te ha cabido la imagen, etc
ueee, que rápido! :-D
Bueno, más o menos
Imagen

ROM: https://www.dropbox.com/s/gkl41pkp8v6fj ... e.sms?dl=0

Me parece bastante enrevesado la forma de crear metatiles, aunque supongo que sea todo acostumbrarse.

Y ahora mi pregunta ¿que función se usa para mover sprites?

EDITO: vale, lo he hecho con if(SMS_getKeysStatus() & PORT_A_KEY_RIGHT)

Por otro lado ¿no existe tabla de atributos para el color? ¿a la hora de formar un fondo no puedo usar un mismo tile con distintas paletas para poder componer un fondo? ¿hay alguna herramienta que facilite esto?

Bueno, vamos progresando. Ahora se puede manejar el sprite, aunque las animaciones tengo que estudiar a ver como mejorarlo. Vaya cacao.

También tengo que ver como hacer cambios de pantalla con "cierre a negro" y "apertura a color".

Imagen

ROM: https://www.dropbox.com/s/yl90asivuhib0 ... 1.sms?dl=0
Los fondos pueden tener dos paletas, la propia del fondo o la de sprites. Se selecciona una o otra cambiando el bit de la paleta en la entrada correspondiente del tilemap.

Imagen

Recuerda que hay dos paletas de 16 colores en la master, una exclusiva para fondos, y otra usable por fondos y sprites.
Estoy por la lección 3 :P
Tengo un fondo con un scroll ( https://takeafile.com/?f=seravixoka )

Lo que se ve a la izquierda, entiendo que es el dibujado del fondo... eso es siempre asi? a que se debe?
Gracias :)
Si, esto suele ocurrir cuando tienes un scroll en el que vas haciendo recarga de tiles, y se nota en esa columna (aunque entiendo que en tu fondo no estas recargando nada).

Para quitarlo, nada tan facil como poner esto cuando inicializas la consola:

SMS_VDPturnOnFeature(VDPFEATURE_HIDEFIRSTCOL);

esto esconde la primera columna de la izquierda, y permite evitar estos artefactos.
Ké bueno... meterle mano a la SMS !!
En cuanto acabe con mi proyecto para Spectrum, me pongo con estos tutos.

Gracias por ello, y ánimo.
[me subscribo pero ya !!]
Por cierto ¿no existe forma de fabricar juegos de Master System? ¿nadie vende PCBs?
hay diseños que ha hecho gente (ichigobankai, db-electronics), etc. Creo que este último tiene el archivo Eagle para bajar y mandar a fabricar PCB's. Pero que las vendan hechas creo que no....
kusfo79 escribió:hay diseños que ha hecho gente (ichigobankai, db-electronics), etc. Creo que este último tiene el archivo Eagle para bajar y mandar a fabricar PCB's. Pero que las vendan hechas creo que no....


Gracias.

Me informaré [oki]
Si necesitas ayuda, dime algo, que he hablado bastante con gente en SMSpower, e igual alguno te puede ayudar.

A todo eso, voy a ir preparando la siguiente lección, que he tenido unas semanas complicadas!
A ver si consigo implementar la colisión del escenario. Por ahora me esta constando hacerlo.

Aunque sigo sin entender muy bien el proceso de creación de pantallas. ¿Tengo que hacer captura de cada una de las pantallas del juego para pasarlas luego al formato SMS? ¿no hay alguna herramienta para crear los mapas?
eh, depende, como lo hacías en NES?

Yo lo que hago es lo siguiente. Para un cierto nivel, creo el tileset como una hoja con todos los diferentes "metatiles" (normalmente de 16x16) que voy a usar. Monto el escenario con el TILED usando ese mismo tileset de 16x16 , y luego tengo unos scripts en python que lo convierten del .tmx a un array en c, que descompone cada metatile de 16x16 en 4 indices de tile. Lo de hacer los niveles capturando los escenarios se puede hacer, pero es bastante poco optimo si tienes que ir haciendo cambios....
kusfo79 escribió:eh, depende, como lo hacías en NES?

Yo lo que hago es lo siguiente. Para un cierto nivel, creo el tileset como una hoja con todos los diferentes "metatiles" (normalmente de 16x16) que voy a usar. Monto el escenario con el TILED usando ese mismo tileset de 16x16 , y luego tengo unos scripts en python que lo convierten del .tmx a un array en c, que descompone cada metatile de 16x16 en 4 indices de tile. Lo de hacer los niveles capturando los escenarios se puede hacer, pero es bastante poco optimo si tienes que ir haciendo cambios....


Te explico:

Para la colisión con escenarios me base en el tutorial de doug: https://nesdoug.com/2015/11/29/10-backg ... ollisions/

Me pierdo un poco a veces pero por lo poco que entendía, reservó un espacio en la RAM que llamó "MAP" para poner las colisiones. Estas se declaraban mediante un array de 62 (32x30) por cada pantalla, a modo de mascará que luego nuestro player, con sus debidos puntos de colisión declarados, interactuaba.

Para la creación de mapas como bien dices deberé tener un Tileset montado con todos los tiles que voy a usar. En NES el ruso siru creó una herramienta llamada NEStoolScreen que era una pasada, y permitia crear mapas facilmente. Para la SMS he intentado usar un programa llamado MappyMapWin32 pero no me saca ningun array legible, ni nada.

Si pudieras facilitarme la herramienta con la que creas los mapas, te lo agradecería, porque la otra alternativa que tengo es crearlos a mano mediante editor de texto. Cojones sobran. Tiempo no. [+risas]
Hombre, lo que yo tengo es muy guarro, pero ahora te lo comparto por Dropbox (lo tendrás que ajustar a tus necesidades).

En todo caso, si no quieres complicarte, te voy a decir una manera fácil de hacerlo. Con el TILED, puedes crear dos capas, cada una con su tileset. Una con los gráficos y su tileset coincidente con el que exportarás para la master. La otra capa, solo tienes un tileset, que tiene dos piezas, blanca y negra. Si grabas esto, y abres el tmx, este tiene toda la info dentro en formato xml, y lo puedes copiar a mano para ponerlo en un .h.

fase.tmx
colision.py

No se si me he explicado muy bien, pero sinó luego lo intento mejorar. (En el ejemplo que te je puesto, las colisiones, escales, etc, son tiles con numeros 513, 514, 515, 516, cosas del Tiled)
kusfo79 escribió:Hombre, lo que yo tengo es muy guarro, pero ahora te lo comparto por Dropbox (lo tendrás que ajustar a tus necesidades).

En todo caso, si no quieres complicarte, te voy a decir una manera fácil de hacerlo. Con el TILED, puedes crear dos capas, cada una con su tileset. Una con los gráficos y su tileset coincidente con el que exportarás para la master. La otra capa, solo tienes un tileset, que tiene dos piezas, blanca y negra. Si grabas esto, y abres el tmx, este tiene toda la info dentro en formato xml, y lo puedes copiar a mano para ponerlo en un .h.

fase.tmx
colision.py

No se si me he explicado muy bien, pero sinó luego lo intento mejorar. (En el ejemplo que te je puesto, las colisiones, escales, etc, son tiles con numeros 513, 514, 515, 516, cosas del Tiled)


Ok, cuando llegue a casa le echo un vistazo.

Y ahora una pequeña duda. Igual se te queda esta cara Imagen dado que a estas alturas deberia de saberlo, pero... ¿que diferencia un archivo nombrado .c con otro nombrado .h?
Ahora es cuando te sorprendo y te digo que de cara al compilador...NADA! (al compilador en general le da igual)

Ahora hablando en serio, los .h se llaman así por "header", y se supone que ahí pones datos estáticos y prototipos de llamadas. Por tanto, en teoría, ahí puedes tener definidas variables y constantes, y el código que tiene lógica va a estar en los ficheros .c.

Si realmente estas haciendo un desarrollo pequeño, es muy típico poner todo el código en un fichero C gigantesco, y en el .h poner poca cosa (por ejemplo, en mis pruebas en Nes, en los .h están los tilemaps, los mapas de colisiones, etc). El problema es que esto es poco mantenible cuando crece el proyecto.

En un proyecto más grande, dividiras el código en partes, y normalmente cada parte tendrá un fichero C que será compilado en un paso propio, y tendrá sus funciones expuestas en el .h. En el caso de la Master, por ejemplo, si miras en el repositorio, la SMSLib tiene su codigo C y su header H, nosotros incluimos el .h en nuestro proyecto, y cogemos el .rel ya compilado para añadirlo en el paso de linkado. Si hicieramos un cambio personalizado en la SMSLib, necesitariamos compilarla como un paso propio.
@kusfo79 me he instalado el Tiled y he abierto el archivo fase.tmx, pero me pide tres .png que no has incluido (background, blocks y sheetsprites).

¿Puedes proporcionarlos?
ah bueno, era por ponerte un ejemplo. De todas formas ya te lo subo esta tarde cuando esté en el ordenador de casa!
kusfo79 escribió:ah bueno, era por ponerte un ejemplo. De todas formas ya te lo subo esta tarde cuando esté en el ordenador de casa!


Tampoco sabría aplicar el .py

Parece una tontería, pero un pequeño tutorial sobre esto molaría. [beer]

EDITO:

Usado un mapa de bits a modo de titlemap para el TILED.

He creado un pantallazo con los tiles a modo de prueba. Me saca un archivo .csv y dentro hay un array de números. No me sirve. Les he pasado a hexadecimal, pero no me representa en pantalla lo que quiero.

Tampoco se como pasar el titlemap que he cogido a codigo entendible en SMS.
Estoy pensando como poderlo explicar de una forma sencilla sin que te me cortes las venas xDD

La manera más fácil es que uses el tiled con un tileset de piezas de 8x8 pixeles. Dibujas la pantalla (con el mismo tamaño que una pantalla de master). Si abres el tmx con un editor de texto, veras algo del tipo:

<layer name="Capa de Patrones 1" width="64" height="30">
<data encoding="csv">
65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,
65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,
1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,
17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,
.
.
.
.
.
</data>

coges todos esos numeros, los pones dentro de un array de c de esta forma:

const unsigned char map1[1536]={
65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,
65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,
1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,
17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,
.
.
.
.
.
}

Y ya está el tilemap funcionando!

Mi .py es más complicado por que uso metatiles de 16x16, y tengo que convertirlo a los números de tile concretos.
kusfo79 escribió:Estoy pensando como poderlo explicar de una forma sencilla sin que te me cortes las venas xDD

La manera más fácil es que uses el tiled con un tileset de piezas de 8x8 pixeles. Dibujas la pantalla (con el mismo tamaño que una pantalla de master). Si abres el tmx con un editor de texto, veras algo del tipo:

<layer name="Capa de Patrones 1" width="64" height="30">
<data encoding="csv">
65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,
65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,
1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,
17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,
.
.
.
.
.
</data>

coges todos esos numeros, los pones dentro de un array de c de esta forma:

const unsigned char map1[1536]={
65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,
65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,
1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,1,2,3,1,
17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,19,20,17,18,
.
.
.
.
.
}


Exactamente eso es lo que he hecho ayer. Pero no se empareja correctamente con el tileset que tengo. Como pensé que el error igual era que estaban en decimal, los pasé a hexadecimal, pero nada.

Esta tarde probaré otra cosa y te cuento.
Puedes ponerlo en decimal o en hexadecimal, eso da igual (el compilador solo lo interpreta en hexadecimal si hay el 0x delante). Si te pasa eso, asegurate que los números que ves en el tmx coinciden con los números de tile cargados.

Una manera de ver esto, es coger el TILED, y crear un mapa solo con el primer tile de tu tileset. Debería quedarte un montón de ceros (0,0,0,0,0,0,0,0........) dentro el tmx
Nada, no hay manera. Creo que el error se debe a la hora de crear el mapa de tiles.
como estas creando el tileset? prueba de crear un dibujo de 128x128, poner ahí todos los tiles, y usarlo tanto para exportar el tileset, como para usarlo en el tiled.
Por intentar ayudar, a mí alguna vez me ha desaparecido un bug/cuelgue sin origen aparente, pasando las tablas de datos para ROM de C a Asm
kusfo79 escribió:como estas creando el tileset? prueba de crear un dibujo de 128x128, poner ahí todos los tiles, y usarlo tanto para exportar el tileset, como para usarlo en el tiled.


Perdoname, acabo de ver el tileset en el emulador meka y aparece correctamente, por tanto, lo que no me está cogiendo bien es el array del nivel. Y estoy haciéndolo tal como me comentas [buuuaaaa]

Probando a poner todo a 0, veo que me coge los tiles de los sprites, no del background. Ambos tileset aparecen cargados en memoria.

¿No tendrá que tener algún tipo de compresión?
Estas cargando primero los tiles del tilemap?
kusfo79 escribió:Estas cargando primero los tiles del tilemap?


Efectivamente, claro.

Cargo primero los del tilemap y luego los del tilesprite. En el VRAM se ven los dos bancos cargados perfectamente.

Luego probando a poner 0,0,0,0,0,... en el array del mapa, lo que me encuentro es que me está cogiendo los tiles de los sprites y no de los map.
Que raro, si quieres pasamos a privado, y me pasas pantallazos de lo que te pasa.
En el wiki hay imágenes ke no salen... [no deben estar bien linkeadas].
Ánimo con el curso, me pondré con ello en cuanto me desocupe.
Finalmente he encontrado una manera factible de transportar los nametables del videojuego de NES 'The Banketh' a SMS sin tener que rehacerlos a mano.

Cuando desarrollaba The Banketh para NES, usaba el programa NESToolScreen para crear las pantallas del juego. Simplemente abro el nametable que quiero, selecciono los tiles de la pantalla (30x24 al ser SMS, prescindo de los tiles superiores que es donde ponia el marcador en el juego, para este cometido), y lo copio para luego pegarlo en un bloc de notas. Lo que me copia es un array de números que corresponde a la posición de cada tile en la nametable. Tambien exporto como BMP mi tileset. Este tileset al venir del formato NES solo tiene 4 colores de referencia dado que en NES los atributos de color van a aparte, pero nos puede valer para ver los gráficos sin problema.

El tileset lo edito en Photoshop para dar color a los tiles (no más de 16 colores), tomando siempre como ejemplo la paleta de colores de SMS. Además, algunos tiles les debo repetir con colores diferentes dado que en el formato SMS los tileset si guardan la información de color y un mismo tile no me sirve para formar diferentes cosas en el escenario. Lo guardaré en formato PNG de 8 bits.

En NES, por ejemplo, el mismo tile que usaba para la hierba, lo usaba tambien para el agua o la arena. Como los atributos de color iban separados, solo tenía que indicar en el nametable, que paleta de color usaba ese tile en esa posición y ya. En SMS eso no es posible, así que hay que reinventarse.

Luego, con el programa TILED, creo un TMX con los valores de pantalla de SMS (tiles de 8x8 pixeles y pantalla de 30x24 tiles), y lo guardo. Abro mi array de números que cree antes y pego estos en TMX creado, en la posición donde va la pantalla.

Vuelvo a abrir mi TMX con TILED y añado mi tileset ya formado y con colores. Ahora ya veo la pantalla de juego y solo debo sustituir algunos tiles a los que di color antes para arreglarlo un poco, dado que os recuerdo que solo me guardo el nametable con unos pocos colores de referencia. Cuando termine, guardo el TMX.

Luego abro el TMX con el bloc de notas otra vez, copio la posición de las nametables ya arreglado y me lo llevo a un nuevo bloc limpio. He de indicar que detras de cada numero hay que poner el numero de paleta que voy a usar (0 o 1). En mi caso el 0. Para ello uso la función 'Reemplazar' sustituyendo , por ,0,.

Seguidamente con el BMP2TILE paso el tileset en formato PNG que tengo para que me lo transforme en un array entendible por SMS. Además, tambien me creará la paleta de colores que he usado.

Estos tres arrays finales (nametable, tileset y paleta) son los que me serviran para ir creando mis escenarios. Tileset y paleta solo tengo que hacerlo una vez. El resto es ir creando nametables mediante este proceso portandolos desde NES de forma "sencilla".
@Xputo

Ostras, que raro, luego lo reviso!

@Diskover
Bueno, al hacer conversiones a veces se tienen que hacer estos procesos "a les fines herbes", pero suena bien! a ver que tal!
kusfo79 escribió:@Xputo

Ostras, que raro, luego lo reviso!

@Diskover
Bueno, al hacer conversiones a veces se tienen que hacer estos procesos "a les fines herbes", pero suena bien! a ver que tal!


Ahora tengo que mirar lo de las colisiones...
TileD permite girar o espejar un tile? La master no puede hacer flipping de los sprites pero si te los tiles del fondo, así que esa opción vendría muy bien para hacer escenarios consumiendo mucha menos memoria.
No directamente, te has de hacer tus apaños al convertir del tmx a los arrays de C
A las imágenes ke me refiero, son éstas:
Definiremos dos variables globales ....
Sería algo así:
500px <------ sólo aparece el link, pero no la imágen [a no ser ke aun no esté subida]

Entiendo ke ahí debería ir una imágen, no ?

Otro apunte:
El z88dk tiene soporte para todos los cacharros ke llevan un z80 en su interior.
Es el ke yo uso para programar para Spectrum.
Ostras, pues parece que han desaparecido unas cuantas imagenes.....voy a ver de resubirlars

Sobre el z88dk, hasta ahora no podías usar la devkitSMS con z88dk, pero precisamente la semana pasada estuvieron enseñando esto:

SMSTargetForZ88dk

Aún no he tenido tiempo de mirarlo, eso si....
Wowhohooo... muuchas gracias !!
Me lo voy a pegar un repasito del 'güeno'... ke así me evito tener
chorrocientos compiladores repartidos por el sistema.

Aporto una mejora al tuto:
Se podría comentar cada función de la biblioteca principal SMSlib.h, indicando el
uso y parámetros ke reciben cada una. Un pekeño [corto] ejemplo de su
uso estaría bien.
También explicar para ké se usa/rekiere los archivos *.rel.
Más ke nada para los ke no dominan C y son novatos en el tema.
1022 respuestas
1, 2, 3, 4, 521