Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
 

Autor Hilo: TUTORIAL 1985ALTERNATIVO SOBRE PROGRAMACION EN C DE LA GAMEBOY (Leído 49659 veces)

Balthier

  • T-70
  • Mensajes: 100
El tema es probe a cambiarlo con alguna otra sentencia random como por ewjemplo if(!HIDE_SPRITES) y sigue funcionando perfectamente. xD
"...7 secrets, 7 sins, this is where the end begins..."

pocket_lucho

  • T-500
  • Mensajes: 1 117
Pq a lo mejor estas en 8x8, prueba a quitar eso usando sprites de 8x16 a ver...

Balthier

  • T-70
  • Mensajes: 100
Efectivamente con sprites de 8x16 hace "extraños" al intentar mostrarlos en pantalla. Entonces damos por hecho que se refiere a cuando el modo de SPRITES esté puesto a 8x8.
"...7 secrets, 7 sins, this is where the end begins..."

ManiacMorden

  • Humano
  • Mensajes: 42
Buenas!

Mirando en un documento de especificaciones de la consola:
http://www.emulatronia.com/doctec/consolas/gameboy/gameboy.txt
(el mismo documento está disponible en muchos otros sitios, creo)

vemos que:
Citar
Address  - $FF40
Name     - LCDC
Contents - LCD Control (R/W)

[...]

Bit 2 - OBJ Construction
0: 8*8
1: 8*16

Definitivamente se refiere al tamaño de los sprites :)

pocket_lucho

  • T-500
  • Mensajes: 1 117
Pues misterio resuelto entonces!!

Por cierto, vídeo grabado del taller de GB del RetroConsolas Alicante... http://vertice.cpd.ua.es/126068 El material lo tenéis aquí https://dl.dropboxusercontent.com/u/33369593/gbdk.rar

No me tiréis piedras que estaba bajo los efectos de drogas duras (frenadol, jarabe de la tos... xD).

pocket_lucho

  • T-500
  • Mensajes: 1 117
Ah, descargarse el RAR con el material es interesante ya que allí está la versión en PDF de los tutos todos juntitos en un único fichero!

Balthier

  • T-70
  • Mensajes: 100
"...7 secrets, 7 sins, this is where the end begins..."

GameMaster

  • T-600
  • Mensajes: 2 525
  • Insert Coin
    • www.gecasoft.no.sapo.pt

pocket_lucho

  • T-500
  • Mensajes: 1 117
En la web del link hay un botón para descargar... 2 gigas creo que son xDD

Balthier

  • T-70
  • Mensajes: 100
El enlace que has puesto con lo del PDF no es el correcto. EL GBDK y el pdf están en esta dirección: http://tinyurl.com/o4eesw6
"...7 secrets, 7 sins, this is where the end begins..."


stage7

  • Humano
  • Mensajes: 1
    • http://stg7.net
Hola, pocket_lucho:

En primer lugar gracias por ofrecer algo como este cursillo por la patilla ya que lo que es en GB me cuesta horrores tener los recursos a mano y con esto lo he podido centralizar un poco.

En segundo vaya por delante que soy prácticamente un negado en lenguajes compilados (soy más de PHP y JS, pero guardad los tomates, por favor) y en programar consolas y me metí hace poco a investigar sobre GB a resultas de comprar un Everdrive. Por supuesto empecé con GBDK y no voy a decir qué tengo pensado hacer con todo esto pero sí que me gustaría aprovecharlo, por lo que me surgen un par de dudas de entrada y leyendo los tutoriales por encima.

1) Tenía entendido que por alguna limitación, no sé si del GBDK o del LCC, el tamaño máximo de las ROMs que podía compilar era de 32 kilobytes, sin embargo hay algún ejemplo en el curso que compila a 64 o a 128 kilobytes, y Antonio Niño tiene demos a 256 kilobytes (¡esa Second Reality!). ¿Cómo es esto posible? ¿Bank switching? ¿Zonas separadas para lógica y tiles? ¿Permite esto crear juegos más complejos o la lógica va a estar igual de limitada a 32 kilobytes?

2) Con la música tengo aproximaciones distintas a las habituales. De las pocas pruebas que he hecho hasta ahora siempre he compuesto mi música programada a pelo en MML (Music Macro Language), y compilada a ROM usando XPMCK, pero nunca he llegado a trastear lo suficiente como para ver si el reproductor que incorpora XPMCK se puede incorporar a la cadena de compilado de GBDK ya que me resulta más cómodo "programar" la música (o sacarla al formato nativo GBS de Game Boy) que componerla sobre tracker y compilarla a GBT. ¿Sabes si es posible utilizar alternativas como ésta para meter música en homebrew en lugar de MOD2GBT? Ya de la gente que consigue reproducir música salida del Littlesounddj no digo nada, esos tipos para mí juegan en otra liga.

Gracias por tu trabajo y por tomarte el tiempo de responder lo que puedas saber de esto.

pocket_lucho

  • T-500
  • Mensajes: 1 117
Holaaa! Disculpa la tardanza, no habia visto el mensaje xD

1: La respuesta es banking por supuesto, usando esto que yo sepa se pueden hacer roms con las GBDK de hasta 512 kb!

2: Buff, ahí si que no te puedo decir nada.., sobre GBDK solo he encontrado para añadir música el tema del MD2GBT, pero vamos, viendo otros sistemas rero de la época que conozco, tarde o temprano te tendrás que meter con trackers... tampoco sno tan difíles hombre!

Cualquier cosa más ya sabes ;)

Un saludo!

retromaquinitas

  • Humano
  • Mensajes: 2
  • For everlasting peace!
    • RetroMaquinitas
Buenas a todos,

Todo un honor poder dejar mis líneas en este foro. Algunos ya me conoceréis, otros no tanto (tampoco es que sea nadie importante), pero a lo que vamos. Llevaba tiempo con ganas de ponerme con la programación de alguno de nuestros queridos trastos y aunque mi fin "final" será tocar algo más de NES, con la que hace tiempo me puse en ensamblador, es cierto que a la que hay que ponerse con los tiles, diseños, colores y demás todo se complica. O más que complicar, es simplemente más trabajo.

Aprovechando la situación, me he animado a empezar con Game Boy con este tutorial de Pocket Lucho. Y la verdad, es todo un hallazgo, porque la parte inicial de setup, que suele ser la más pesada, se hace en un momento - y luego todo es seguir el tutorial y animarse a toquetear. Tengo que añadir que el propio GBDK trae algunos ejemplos muy interesantes (y didácticos) que también va bien aprovechar.

Os muestro a continuación el trabajo hecho hasta ahora, para ver si os animáis a publicar vuestros avances. Este es el trabajo de, aproximadamente, dos días. Empecé con la idea de programar un juego bastante distinto de lo que se puede ver ahora, pero he ido optando por la simplicidad por el simple hecho de poder ver algo en funcionamiento. No tengo ni idea de diseño, con lo que soy consciente que si quisiera seguir necesitaría ayuda de alguien más capaz en dibujo y con más visión artística. Menos idea musical tengo todavía, así que el capítulo de música ni lo he empezado ni implementado. Pero cogiendo de un sitio y de otro al menos tengo algo que muestra unos marcadores, tiene una sensación de velocidad por el movimiento del background, un personajillo o nave que se mueve horizontalmente y que, además, puede disparar un proyectil. No hay enemigos ni nada más por ahora.

Pues aquí voy, he intentado comentar como buenamente he podido; notad que hay reciclaje de código y de "mecánica" de varios lados, especialmente de los propios ejemplos de Pocket Lucho y de los dos ejemplos más "juego" del paquete (galaxy y dscan). Creo que es una buena forma de ver una manera distinta de encajar las piezas que nos ha dado Lucho:


En sprites.c, solo tengo las tiles que hice yo. Que no haría falta tenerlas por separado. Son la araña y el disparo.

Código: [Seleccionar]
/* Start of tile array. */
const unsigned char sprite_data[] =
{
  0x00,0x00,0x02,0x00,0x32,0x20,0x09,0x01,
  0x05,0x01,0x02,0x07,0x75,0x4E,0x0B,0x0D,
  0x00,0x00,0x40,0x00,0x4C,0x04,0x90,0x80,
  0xA0,0x80,0x40,0xE0,0xAE,0x72,0xD0,0xB0,
  0xD0,0xB0,0xAE,0x72,0x40,0xE0,0x90,0x80,
  0x08,0x00,0x08,0x08,0x00,0x00,0x00,0x00,
  0x0B,0x0D,0x75,0x4E,0x02,0x07,0x09,0x01,
  0x10,0x00,0x10,0x10,0x00,0x00,0x00,0x00,
  0x00,0x00,0x80,0x80,0x80,0x00,0x80,0x00,
  0x40,0x80,0x80,0x00,0x80,0x00,0x80,0x00,
  0x00,0x00,0x01,0x01,0x01,0x00,0x01,0x00,
  0x02,0x01,0x01,0x00,0x01,0x00,0x01,0x00
};

/* End of SPRITES.C */

El resto está en main.c, que reconozco que no es ni de lejos un código limpio, ni eficiente, ni a prueba de bombas. De la facultad ya me habrían echado, pero ¡hay que empezar por algún lado!

Código: [Seleccionar]
#include <gb/gb.h>
#include "sprites.c"

#define FONT_OFFSET 128

/////////////////////////////////////////////////////
//
//  listado de tiles.
//  std_data y bkg_data/bkg_tiles han sido tomadas del ejemplo galaxy.c de GBDK
//  fonts viene de la imagen del tutorial de Pocket Lucho
//  sprites es de creacion propia, con la araña y el disparo
// 
/////////////////////////////////////////////////////

const unsigned char std_data[] = {

  /* Basic tiles (0xFC to 0xFF) */
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,
  0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};


const unsigned char bkg_data[] = {

  /* Tile 0x00 */
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xF7,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xDF,0xFF,0xEF,0xFF,0xFF,0xF7,0xFF,0xFB,0xFF,0xFD,0xFF,0xFE,0xFE,0xFF,

  /* Tile 0x08 */
  0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7D,0xFE,0x7C,0x39,
  0xFF,0xFF,0xF7,0xFF,0xEF,0xFF,0xFF,0xDF,0xFF,0xBF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFE,0xFF,0xFD,
  0xBB,0x01,0xC7,0x83,0xC7,0x83,0xC7,0x83,0xBB,0x01,0x7C,0x39,0x7D,0xFE,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,
  0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFB,0xAF,0x77,0x27,0x8F,0xDF,0x8F,0x27,0x8F,

  /* Tile 0x10 */
  0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFB,0xFF,0xF7,0xEF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xBF,0xFF,0xDF,0xEF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFE,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xAF,0x77,0xFF,0xFB,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,

  /* Tile 0x18 */
  0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x7D,0xFE,0x7C,0x39,
  0xFF,0xFF,0xF7,0xFF,0xEF,0xFF,0xFF,0xDF,0xFF,0xBF,0xFF,0x7F,0x7F,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFD,

  /* Tile 0x20 */
  0xFF,0xFF,0xDF,0xFF,0xEF,0xFF,0xFF,0xF7,0xFF,0xFB,0xFE,0xFD,0xFD,0xFE,0xFE,0xFF,
  0xAB,0x11,0xC7,0x83,0x83,0xC7,0xC7,0x83,0xAB,0x11,0x7C,0x39,0x7D,0xFE,0xFE,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFB,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0x7F,
  0xFB,0xFF,0xFF,0xFD,0xFE,0xFE,0xFE,0xFF,0xFE,0xFE,0xFF,0xFD,0xFB,0xFF,0xFF,0xFF,
  0xEF,0xFF,0xFF,0xDF,0x3F,0xBF,0x3F,0x7F,0x3F,0xBF,0xFF,0xDF,0xEF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFB,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFD,0xFE,0xFE,0xFD,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,

  /* Tile 0x28 */
  0xF7,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};

/*
 * Image size: 0x40 x 0x40
 * Number of tiles (total - unique): 0x40 - 0x2D
 */

const unsigned char bkg_tiles[] = {
  0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC,
  0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A,
  0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC,
  0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14,
  0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC,
  0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20,
  0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26,
  0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11
};

const unsigned char font[] ={
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x38,0x08,0x38,0x08,0x38,0x08,0x38,0x08,0x38,0x38,0x38,0x08,0x38,0x08,0x38,0x38,
  0x00,0x00,0x36,0x12,0x36,0x12,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x3E,0x02,0x7F,0x3D,0xFF,0x66,0xFF,0x5A,0xF7,0x52,0xFF,0x61,0xFF,0xBF,0x7F,0x41,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x1E,0x02,0x1C,0x14,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
  0x18,0x08,0x3C,0x04,0xFF,0x01,0xFE,0x82,0x7E,0x02,0x7E,0x12,0x7E,0x3A,0x66,0x66,
  0x00,0x00,0x0C,0x04,0x18,0x08,0x18,0x08,0x18,0x08,0x18,0x08,0x1C,0x14,0x0C,0x0C,
  0x00,0x00,0x18,0x08,0x1C,0x14,0x0C,0x04,0x0C,0x04,0x0C,0x04,0x1C,0x0C,0x18,0x18,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x18,0x08,0x18,0x08,0x7E,0x02,0x7E,0x6E,0x18,0x08,0x18,0x18,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x04,0x1C,0x04,0x1C,0x14,0x18,0x08,
  0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x02,0x7E,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x04,0x1C,0x04,0x1C,0x1C,
  0x00,0x00,0x06,0x02,0x0E,0x02,0x1E,0x06,0x3C,0x0C,0x78,0x18,0x70,0x30,0x60,0x60,
  0x7E,0x02,0xFF,0x39,0xE7,0x21,0xE7,0x21,0xE7,0x21,0xE7,0x21,0xFF,0x83,0x7E,0x7E,
  0x1C,0x04,0x3C,0x04,0x3C,0x24,0x1C,0x04,0x1C,0x04,0x1C,0x04,0x3E,0x02,0x3E,0x3E,
  0x7E,0x02,0xFF,0x39,0xC7,0xC1,0x1E,0x02,0x7C,0x0C,0xF0,0x30,0xFF,0x01,0xFF,0xFF,
  0x7E,0x02,0xFF,0x39,0xC7,0xC1,0x3E,0x02,0x3F,0x39,0xC7,0x01,0xFF,0x83,0x7E,0x7E,
  0x0E,0x02,0x1E,0x02,0x3E,0x12,0x6E,0x22,0xFF,0x01,0xFF,0xF3,0x1F,0x01,0x1F,0x1F,
  0xFE,0x02,0xFE,0x3E,0xE0,0x20,0xFE,0x02,0xFF,0xF9,0xE7,0x21,0xFF,0x83,0x7E,0x7E,
  0x7E,0x02,0xFF,0x39,0xE7,0x27,0xFE,0x02,0xFF,0x39,0xE7,0x21,0xFF,0x83,0x7E,0x7E,
  0x7F,0x01,0xFF,0x79,0x8E,0x82,0x1C,0x04,0x1C,0x04,0x1C,0x04,0x1C,0x04,0x1C,0x1C,
  0x7E,0x02,0xFF,0x39,0xE7,0x21,0x7F,0x03,0xFF,0x39,0xE7,0x21,0xFF,0x83,0x7E,0x7E,
  0x7E,0x02,0xFF,0x39,0xE7,0x21,0x7F,0x01,0x0F,0x09,0xFF,0x39,0xFF,0x83,0x7E,0x7E,
  0x00,0x00,0x1C,0x04,0x1C,0x04,0x1C,0x1C,0x1C,0x04,0x1C,0x04,0x1C,0x1C,0x00,0x00,
  0x00,0x00,0x1C,0x04,0x1C,0x04,0x1C,0x1C,0x1C,0x04,0x1C,0x04,0x1C,0x14,0x18,0x08,
  0x00,0x00,0x0C,0x04,0x18,0x08,0x18,0x08,0x18,0x08,0x18,0x08,0x1C,0x14,0x0C,0x0C,
  0x00,0x00,0x00,0x00,0x7F,0x01,0x7F,0x7F,0x7F,0x01,0x7F,0x7F,0x00,0x00,0x00,0x00,
  0x00,0x00,0x18,0x08,0x1C,0x14,0x0C,0x04,0x0C,0x04,0x0C,0x04,0x1C,0x0C,0x18,0x18,
  0x3C,0x04,0x7E,0x3A,0x66,0x22,0x4E,0x46,0x1C,0x0C,0x18,0x18,0x18,0x08,0x18,0x18,
  0x7E,0x02,0xFF,0x7D,0xFF,0x41,0xFF,0x41,0xFF,0x41,0xFF,0x7D,0x7F,0x03,0x7E,0x7E,
  0x1C,0x04,0x1C,0x04,0x3E,0x02,0x3E,0x1A,0x7F,0x01,0x7F,0x3D,0xF7,0x10,0xFF,0xFF,
  0xFE,0x02,0xFF,0x99,0x77,0x11,0x7E,0x02,0x7F,0x19,0x77,0x11,0xFF,0x03,0xFE,0xFE,
  0x3E,0x02,0x7F,0x19,0x77,0x11,0x77,0x17,0x77,0x11,0x77,0x11,0x7F,0x43,0x3E,0x3E,
  0xFE,0x02,0xFF,0x99,0x77,0x11,0x77,0x11,0x77,0x11,0x77,0x11,0xFF,0x03,0xFE,0xFE,
  0xFE,0x02,0xFF,0x9D,0x73,0x13,0x7C,0x04,0x7C,0x1C,0x72,0x10,0xFF,0x03,0xFE,0xFE,
  0xFE,0x02,0xFF,0x9D,0x73,0x13,0x7C,0x04,0x7C,0x1C,0x70,0x10,0xF8,0x08,0xF8,0xF8,
  0x7E,0x02,0xFF,0x39,0xE7,0x21,0xE7,0x27,0xEF,0x21,0xEF,0x29,0xFF,0x81,0x7F,0x7F,
  0xFF,0x00,0x77,0x11,0x77,0x11,0x7F,0x01,0x77,0x11,0x77,0x11,0xFF,0x00,0x77,0x77,
  0x3E,0x02,0x3E,0x26,0x1C,0x04,0x1C,0x04,0x1C,0x04,0x1C,0x04,0x3E,0x02,0x3E,0x3E,
  0x1F,0x01,0x0F,0x03,0x0E,0x02,0x0E,0x02,0xEE,0x22,0xEE,0x22,0xFE,0x86,0x7C,0x7C,
  0xFF,0x09,0x7F,0x13,0x7C,0x04,0x78,0x08,0x7C,0x04,0x7E,0x12,0xFF,0x09,0xFF,0xFF,
  0xF0,0x00,0xF0,0x90,0x70,0x10,0x70,0x10,0x70,0x10,0x73,0x11,0xFF,0x03,0xFE,0xFE,
  0xE7,0x24,0xFF,0x99,0x7F,0x01,0x7F,0x01,0x7F,0x19,0x7F,0x19,0xFF,0x18,0xFF,0xFF,
  0xE7,0x20,0x77,0x11,0x7F,0x09,0x7F,0x01,0x7F,0x11,0x7F,0x19,0xF7,0x14,0x77,0x77,
  0x7E,0x02,0xFF,0x39,0xE7,0x21,0xE7,0x21,0xE7,0x21,0xE7,0x21,0xFF,0x83,0x7E,0x7E,
  0xFE,0x02,0x7F,0x19,0x77,0x11,0x77,0x11,0x7F,0x03,0x7E,0x1E,0xF8,0x08,0xF8,0xF8,
  0x7E,0x02,0xFF,0x39,0xE7,0x21,0xE7,0x21,0xFF,0x25,0xFF,0x3B,0xFF,0x85,0x7E,0x7E,
  0xFE,0x02,0xFF,0x99,0x77,0x11,0x7E,0x02,0x7F,0x19,0x77,0x11,0xFF,0x08,0xFF,0xFF,
  0x7E,0x02,0xFF,0x39,0xE7,0x27,0xFE,0x82,0x7F,0x79,0xE7,0x21,0xFF,0x83,0x7E,0x7E,
  0x7E,0x00,0xFF,0x66,0x1D,0x05,0x1C,0x04,0x1C,0x04,0x1C,0x04,0x3E,0x02,0x3E,0x3E,
  0xFF,0x10,0xFF,0x99,0x77,0x11,0x77,0x11,0x77,0x11,0x77,0x11,0x7F,0x43,0x3E,0x3E,
  0xE7,0x21,0xE7,0xA3,0x7E,0x12,0x7E,0x56,0x3C,0x04,0x3C,0x2C,0x18,0x08,0x18,0x18,
  0xFF,0x18,0xFF,0x99,0x7F,0x19,0x7F,0x01,0x7F,0x01,0x7F,0x19,0x77,0x35,0x63,0x63,
  0xF7,0x10,0xFF,0x99,0x7E,0x42,0x3C,0x24,0x3E,0x02,0x7F,0x19,0xF7,0x10,0xF7,0xF7,
  0xF7,0x10,0xF7,0x91,0x7E,0x42,0x3C,0x24,0x1C,0x04,0x1C,0x04,0x3E,0x02,0x3E,0x3E,
  0x7F,0x01,0xFF,0x73,0x1C,0x04,0x38,0x08,0x70,0x10,0xE2,0x20,0xFF,0x03,0xFE,0xFE,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0xFF,0x00,0x7F,0x7F,0xE7,0x20,0x77,0x11,0x7F,0x09,0x7F,0x11,0xF7,0x14,0x77,0x77,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x02,0x7E,0x7E};

/*
 * Image size: 0x10 x 0x70
 * Number of tiles (total - unique): 0x1C - 0x1C
 */
 
UBYTE time;         /* Global "time" value (counter) */
fixed bposx, bposy; /* Background position (fixed point) */
fixed bspx, bspy;   /* Background speed (fixed point) */
fixed sposx, sposy; /* Sprite position (fixed point) */
fixed sspx, sspy;   /* Sprite speed (fixed point) */

UBYTE pf, px, pp, pl,pbombs,plives; /*contadores diversos, de vidas, bombas, etc. Sin uso por ahora */
UWORD pw;
UWORD ps;


UBYTE missilex,missiley; /*posicion del mísil*/

void scroll();


(sigue a continuación, aunque los ficheros adjuntos están en este post)
Aprendiendo.

retromaquinitas

  • Humano
  • Mensajes: 2
  • For everlasting peace!
    • RetroMaquinitas
Código: [Seleccionar]
/////////////////////////////////////////////////////
//  (del ejemplo de Pocket Lucho, lo aprovecharé en varios sitios)
//  void drawString(char str[], UBYTE x, UBYTE y){
//  dibuja la cadena str en la posicion x, y
//  en BKG si flag es 0 y en WIN si es 1
//  si una palabra no entra en la linea, la dibuja
//  en la siguiente
//
/////////////////////////////////////////////////////
void drawString( char *str, UBYTE x, UBYTE y, UBYTE flag ){

    UBYTE posx, strx, nextlen;
    UBYTE posy, e;
    UBYTE c;

    strx = 0;
    posx = x;
    posy = y;

    // mientras la cadena no termine
    while(str[strx] != 0){

        // comprueba la longitud de la palabra actual de la cadena
        nextlen = 0;
        for( e = strx; (str[e] != ' ') && (str[e] != 0); e++)
            nextlen++;

        // si no cabe en pantalla bajamos de linea
        if ( posx + nextlen > 20){
            posx = 0;
            posy++;
        }

        // dibuja la palabra en la posicion que corresponda
        for(;(str[strx] != ' ') && (str[strx] != 0); strx++){
            c = str[strx] + FONT_OFFSET - 32;
            if( !flag )
                set_bkg_tiles( posx, posy, 1, 1, (unsigned char *) &c);
            else
                set_win_tiles( posx, posy, 1, 1, (unsigned char *) &c);
            posx++;
        }

        // dibuja un espacio en blanco entre las palabras de la cadena
        if ( posx != 0 ){
            c = ' ' + FONT_OFFSET - 32;
            if( !flag )
                set_bkg_tiles( posx, posy, 1, 1, (unsigned char *) &c);
            else
                set_win_tiles( posx, posy, 1, 1, (unsigned char *) &c);
            posx++;
        }

        // si no es el final de la cadena incrementamos la posicion
        if(str[strx] != 0 )
          strx++;
    }
}

//scroll para el background. Adaptación de galaxy.c

void scroll()
{
  /* Update background */
  bposx.w += bspx.w;
  bposy.w += bspy.w;
  SCX_REG = bposx.b.h;
  SCY_REG = bposy.b.h;
}

//muestra los diversos contadores: de nivel, de puntuación, de vidas y de bombas. Sin uso todavía.
//en realidad la mayoría de estas funciones no son necesarias por ahora;
//pero está preparado para cuando haga falta.

void show_level( UBYTE i )
{
  unsigned char level[1];

  if( i < 9 ) {
    level[0] = 0x31+i;
  } else {
    level[0] = 0x41+i-9;
  }
  //set_win_tiles( 19, 0, 1, 1, level );
  drawString("LV", 8, 0, 1);
  drawString(level, 10, 0, 1);
  //set_level( i );
}

void show_lives( UBYTE i )
{
  unsigned char lives[1];

  if( i < 9 ) {
    lives[0] = 0x31+i;
  } else {
    lives[0] = 0x41+i-9;
  }
  drawString("L", 12, 0, 1);
  drawString(lives, 13, 0, 1);
}

void show_bombs( UBYTE i )
{
  unsigned char bombs[1];

  if( i < 9 ) {
    bombs[0] = 0x31+i;
  } else {
    bombs[0] = 0x41+i-9;
  }
  drawString("B", 15, 0, 1);
  drawString(bombs, 16, 0, 1);
}

void show_score( UWORD s )
{
  UWORD m;
  UBYTE i, n, f;
  unsigned char score[6];

  f = 0; m = 10000;
  for( i=0; i<5; i++ ) {
    n = s/m; s = s%m; m = m/10;
    if( (n==0)&&(f==0) ) {
      score[i] = 0x20;      /* ' ' */
    } else {
      f = 1;
      score[i] = 0x30+n;    /* '0' - '9' */
    }
  }
  score[5] = 0x30;      /* '0' */
  drawString(score, 1, 0, 1);
  //set_win_tiles( 4, 0, 6, 1, score );
}

//inicializa

void init_score()
{
  ps = 0;
  show_score( ps );
  pp = 0; pl = 0;
  show_level( pl );
  pbombs=2;plives=2;
  show_lives(plives);
  show_bombs(pbombs);
}

//animación para el mísil

void animar_missile()
{
missiley=missiley-8;
move_sprite( 4, missilex, missiley );
move_sprite( 5, missilex-8, missiley );
}

//////////////////////////////////////////////////////
//
//  void main(){
//  punto de entrada
//
//////////////////////////////////////////////////////
void main(){

UBYTE i,j,winposx, winposy,c;
    UBYTE PosX = 80;
/* Initialize the background */
set_bkg_data(0xFC, 0x04, std_data);
set_bkg_data(0x00, 0x2D, bkg_data);
// cargamos los tiles de la fuente
set_bkg_data( FONT_OFFSET, 64,(unsigned char *)font);
  /*
   * Draw the background (y poner su correspondiente velocidad)
   *
   * Width  = 0x100 = 0x20 * 8
   * Height = 0x100 = 0x20 * 8
   */
  for(i = 0; i < 32; i+=8)
for(j = 0; j < 32; j+=8)
  set_bkg_tiles(i, j, 8, 8, bkg_tiles);
  bposx.w = 0;
  SCX_REG = 0;
  bposy.w = 0;
  SCY_REG = 0;
  bspx.w = 0x0000UL;
  bspy.w = 0xF800UL;
 
//aquí preparo la ventana. De base, lo pongo "en blanco". No creo que sea la forma más limpia de hacerlo.
c = ' ' + FONT_OFFSET - 32;
for( i=0; i<=20; i++ ) {
set_win_tiles( i, 0, 1, 1, FONT_OFFSET);
}
init_score();

//preparo los sprites
set_sprite_data( 0, 6, sprite_data);
set_sprite_tile( 0, 0);
set_sprite_tile( 1, 1);
set_sprite_tile( 2, 2);
set_sprite_tile( 3, 3);
set_sprite_tile( 4, 4);
set_sprite_tile( 5, 5);


//y coloco la nave (o araña). El argumento está por definir, jaja.
move_sprite( 0, 72, 136 );
move_sprite( 1, 80, 136 );
move_sprite( 2, 80, 144 );
move_sprite( 3, 72, 144 );


//muestro todo
        SHOW_BKG;
SHOW_WIN;
SHOW_SPRITES;
DISPLAY_ON;
enable_interrupts();

// bucle infinito

//las posiciones de la window (que solo se vea una línea) y el mísil no tiene posición.
winposx = 0; winposy = 136;
missiley=0;
while(1) {
// sincroniza la pantalla
for(i = 0; i < 4; i++)
wait_vbl_done();
time++;

//ejecuto scroll.

scroll();

//la velocidad del scroll se puede modificar con arriba/abajo mientras se presiona B.
//Está chulo. Incluso se invierte.
i = joypad();
if(i & J_B) {
  if(i & J_UP)
bspy.w -= 0x0010UL;
  if(i & J_DOWN)
bspy.w += 0x0010UL;
}

        // mueve el jugador
// mueve el sprite a la posicion x, y, siempre respectando el límite.
// lo hago a saltos de 16 aposta. La idea original para el juego tenía que ser así.
if(( i & J_LEFT )&& ( PosX > 16)){
PosX=PosX-16;
move_sprite( 0, PosX-8, 136 );
move_sprite( 1, PosX, 136 );
move_sprite( 2, PosX, 144 );
move_sprite( 3, PosX-8, 144 );
}
if(( i & J_RIGHT )&& ( PosX < 158)){
PosX=PosX+16;
move_sprite( 0, PosX-8, 136 );
move_sprite( 1, PosX, 136 );
move_sprite( 2, PosX, 144 );
move_sprite( 3, PosX-8, 144 );
}

//si se pulsa A, se dispara un mísil. Mantengo la posición X original almacenada
//para que el mísil no se mueva con la nave.
if(( i & J_A )){
missilex=PosX;
missiley=128;
move_sprite( 4, missilex, missiley );
move_sprite( 5, missilex-8, missiley );
}

//siempre que el mísil no haya llegado "al final", sigo animándolo.
if (missiley>0){
animar_missile();
}

//la ventana se tiene que mover para que no tape el background
move_win( winposx, winposy);
}
}

Pues eso es todo. Os adjunto los dos ficheros usados (en el post anterior), se puede compilar como cualquiera de los .bat de otros ejemplos del tutorial. El resultado debería ser el siguiente:

https://vine.co/v/OdeTDKwvdqE

Muchas funciones quedan todavía para implementar y la idea que tendría en mente es algo distinta. Ahora faltará más tiempo.

El caso es que si yo he podido hacer esto en unas cuantas horas, aquí hay más de uno que sabe mucho más que yo y que será capaz de programar el próximo Link's Awakening en unos pocos meses ;)

Espero que os animéis a subir más cosillas y así las vamos probando,

Marçal.
Aprendiendo.