viernes, 20 de febrero de 2009

La ficha siguiente

Para poder mostrar la siguiente ficha que va a salir tendremos que tener dos variables 'ficha' y 'ficha_siguiente'.

Modificaremos la función 'obtener_ficha' para que en vez de asignar a la variable 'ficha' la ficha buscada de forma aleatoria, se le asigne a la variable 'ficha_siguiente'. La función 'obtener_ficha' quedará de la siguiente manera:

u8 obtener_ficha() {
    u8 tipo = PA_RandMax(6); //0..6
    u8 color = PA_RandMinMax(2, 7); //2..7
    ficha.y = 0;
    ficha.x = TABLERO_ANCHO / 2;
    copiar_ficha_siguiente();
    if (tipo == 0) crear_ficha_t(color);
    else if (tipo == 1) crear_ficha_l(color);
    else if (tipo == 2) crear_ficha_o(color);
    else if (tipo == 3) crear_ficha_z(color);
    else if (tipo == 4) crear_ficha_s(color);
    else if (tipo == 5) crear_ficha_j(color);
    else crear_ficha_i(color);
    dibujar_ficha_siguiente();
    return existe_colision(ficha.x, ficha.y);
}

void copiar_ficha_siguiente() {
    u8 i, j;
    ficha.radio = ficha_siguiente.radio;
    for(i = 0; i < FICHA_ANCHO; i++) 
        for(j = 0; j < FICHA_ALTO; j++)
            ficha.ficha[i][j] = ficha_siguiente.ficha[i][j];
}


Con esto ya dejamos más o menos el juego terminado. En está página está disponible el código completo del proyecto.

Hay un tema en cuanto a la forma de programar.

En los dos juegos que hemos programado hasta la fecha, hemos utilizado una serie de variables globales y funciones que trabajan sobre ellas, siendo esto válido para juegos sencillos pero no tanto para juegos más complicados.

Conceptos como el ámbito de las variables han de ser considerados a la hora de realizar este tipo de programas. Por ejemplo, la función obtener_ficha, así como las de rotar deberían de trabajar sobre un parámetro ficha, y no sobre las variables globales. Esto dejaría el código más limpio y daría mayor flexibilidad si se quisieran introducir más funcionalidades.

Por ahora lo dejaremos así, pero si queremos hacer el New Super Mario Bros, deberemos empezar a hacer las cosas más limpias.

Saludos

9 comentarios:

Anónimo dijo...

Genial, sigue asi tio, es muy util!!

Interesante, aunque cuando empieces a enseñar a hacer un plataformas vas a triunfar xD

Unknown dijo...

no se, parace que la mayoria no quiere aprender a programar, si no que quieren copiar el codigo modificar una gilada y decir que lo hacen ellos, yo por mi parte espero la explicacion de la POO en palib, saludos

Inigo dijo...

Gracias por los comentarios.

Creo que en el próximo tutorial, nos vamos a hinchar de plataformas.

En cuanto a lo que comenta Bruno, que le vamos a hacer. Internet es una fuente casi infinita de información y cada uno hace con ella lo que puede o lo que sabe.

Yo por mi parte estoy encantado de realizar estos tutoriales y que la gente ponga comentarios animándome a que siga.

En cuanto a lo de la POO, tengo varias ideas y creo que va a quedar muy bien. Estoy definiendo una pequeña librería que se podrá utilizar en otros proyectos.

Saludos

Anónimo dijo...

Sobre tu proximo tutorial, he estado pensando i primero pensava k un mario estaria bien pero con el tiempo me he dado cuenta k un mario no servira para mucho ia k su forma de matar a los enemigos es saltando encima i si alguien despues se interesa por crear un juego tipo principe de persia la espada no serviria de mucho, por eso creo k en lugar de un mario podriamos hacer algo tipo principe de persia o el juego del zelda k han echoo con el palib de plataformas, se llama newzelda i en la web de homebrew lo puedes encontrar.
tambien estaria bien centrarnos en intros, dialogos para un tutorial "dento del juego" i un menu.
PLANTEATE DE NO HACERLO DEL MARIO I AZLO DE ALGO CON ESPADAS I ARCOS O TIPO NARUTO NINJA COUNCIL!!!

Unknown dijo...

Yo pienso que no importa si es mario, zelda o lo que fuere, lo que importa es aprender nuevas tecnicas y metodos para uno poder hacer su propio juego y no copiar juegos existentes.
pd: ovio que hace lo que mejor te parezca

David Martínez Martínez dijo...

¡Excelente tutorial! Estás realizando un gran trabajo, ¡tengo ganas ya de ver tu librería para orientación a objetos!

PD: la verdad, soy un defensor a muerte de la programación imperativa, la mayoría de las veces el uso de la programación orientada a objetos solo sirve para complicarnos la vida (no uso ni registros ni estructuras, nunca)

PD2: aunque, por supuesto, si el código se complica mucho, las clases y los objetos BIEN USADOS pueden ayudarnos a hacer el código más legible y que sea más eficiente ampliarlo

Inigo dijo...

Gracias por los comentarios.

La POO nos va a permitir centrarnos únicamente en la programación de nuestro juego.

Tendremos un montón de monedas pululando por nuestro juego y para nosotros únicamente será un array de monedas, olvidándonos de que son Sprites, que tienen paleta, etc.

Incluso nos vamos a olvidar de PALib, quedará oculta debajo de nuestras clases (por ahora tengo definidas 4).

No sé, para juegos sencillos no hace falta, pero no me quiero imaginar un NSMB programado 'a pelo', sin ayuda de clases.

Y en cuanto a las ideas sobre el juego... Antes de escribir el tutorial me gusta tener el juego más o menos acabado. Con el tetris no había problemas, es pequeño, pero con el NSMB. Voy a empezar el tutorial sin tenerlo acabado, ni resuelto todo. Espero no tener problemas.

Las ideas son siempre bien recibidas, las apuntaremos e iremos poco a poco.

Saludos

David Martínez Martínez dijo...

Ah, y se me olvidó mencionarlo ayer, al contrario que el del Tetris, ¡este pienso seguirlo a rajatabla! ¿¡Que todavía es miércoles?! ¡Arg! ¡Quiero que sea viernes ya!

Anónimo dijo...

Al anonimo este del naruto y principe de persia...


...Acaso no deberias aprender lo basico? digo yo que, antes que meterte en algo profundo ( aunque tenga el nombre de naruto... ) tendras que tener nociones basicas de como mover al personaje y la propia fase.

Aparte no seas tan remilgado con lo que quieres, Iñigo hará lo que vea oportuno y propio. Todo eso lo digo sin querer ofenderte o hacerte sentir mal, pero no deberias exigir tanto.