Holas!!
Aquí os dejo con un juego-chorra que he hecho. Básicamente se trata de explotar los sprites con el stylus lo más rápido posible. Hay un error que todavía no he conseguido arreglar, y es que si explotas el primer sprite cuando aún quedan otros sprites, crea fallos gráficos y de funcionamiento... Si alguien quiere echarle un ojo al source, está muy sucio y muy guarro, porque en este homebrew apenas he usado funciones
Algunas capturas:
Descargar Xplosion Time! 1.0 (Megaupload)// Includes
#include <PA9.h> // Include for PA_Lib
#include "gfx/all_gfx.c" // Incluimos gráficos
#include "gfx/all_gfx.h"
#include "choque.h"
#include "tetrisa.h"
#include "tetrisb.h"
// Función para cargar sprites
void carga_nivel(int nivel){
int x = 0, y = 0, sprite = 0;
switch (nivel){
case 1:
PA_LoadSpritePal(0,0,(void*)lv1pal_Pal);
for (x=20; x<250;x+=77){
for (y=26; y<173; y+=74){
PA_CreateSprite(0,sprite,(void*)lv1_Sprite,OBJ_SIZE_64X64,1,0,x,y);
PA_SetSpritePrio(0,sprite,2);
PA_StartSpriteAnim(0,sprite,0,3,5);
sprite++;
}
}
break;
case 2:
PA_LoadSpritePal(0,1,(void*)lv2pal_Pal);
for (x=12; x<218;x+=39){
for (y=10; y<184; y+=35){
PA_CreateSprite(0,sprite,(void*)lv2_Sprite,OBJ_SIZE_32X32,1,1,x,y);
PA_SetSpritePrio(0,sprite,2);
PA_StartSpriteAnim(0,sprite,0,3,5);
sprite++;
}
}
break;
case 3:
PA_LoadSpritePal(0,2,(void*)lv3pal_Pal);
for (x=13; x<241;x+=18){
for (y=14; y<184; y+=19){
PA_CreateSprite(0,sprite,(void*)lv3_Sprite,OBJ_SIZE_16X16,1,2,x,y);
PA_SetSpritePrio(0,sprite,2);
PA_StartSpriteAnim(0,sprite,0,3,5);
sprite++;
}
}
break;
default:
PA_OutputSimpleText(0,1,5,"Error al cargar nivel");
//exit();
break;
}
}
// Function: main()
int main(int argc, char ** argv)
{
// Iniciamos
PA_Init(); // Initializes PA_Lib
PA_InitVBL(); // Initializes a standard VBL
PA_InitFat(); // Iniciamos FAT para escritura de hiscores
PA_InitSound(); // Iniciamos sonido
PA_SetSoundVol (255);
PA_PlaySimpleSound(1,tetrisa);
PA_InitText(0,0); // Iniciamos texto en la capa principal
PA_InitText(1,0);
PA_SetTextTileCol(0,3); // Color azul oscuro
PA_SetTextTileCol(1,3);
// Variables
int level = 0, boton = 1, sprites_activos = 0, auxiliar = 0, auxiliar2 = 0;
int Vsprites[118];
int hitemp = 0;
int hi11 = 100000, hi12 = 100000, hi13 = 100000, hi14 = 100000, hi15 = 100000;
int hi21 = 100000, hi22 = 100000, hi23 = 100000, hi24 = 100000, hi25 = 100000;
int hi31 = 100000, hi32 = 100000, hi33 = 100000, hi34 = 100000, hi35 = 100000;
//Cargamos fondos
PA_EasyBgLoad(1,3,bg1);
PA_EasyBgLoad(0,3,bg0);
PA_EasyBgLoad(0,2,botonesbg);
PA_EasyBgLoad(0,1,facil);
// Infinite loop to keep the program running
while (1){
while (level == 0){ // Menu
if (Stylus.Newpress && PA_StylusInZone(39,15,133,54)){
if (boton == 1){
// NIVEL 1 (6)
PA_PlaySimpleSound(0,choque);
PA_StopSound(1);
PA_PlaySimpleSound(1,tetrisb);
sprites_activos = 6;
for(auxiliar=0; auxiliar < sprites_activos; auxiliar++) //llenamos el vector
Vsprites[auxiliar]=auxiliar;
Vsprites[sprites_activos]=666;
level = 1;
PA_ResetBgSysScreen(0);
PA_EasyBgLoad(0,3,bg0game);
PA_InitText(0,0);
PA_SetTextTileCol(0,1);
Stylus.X=1; Stylus.Y=1;
carga_nivel(level);
PA_OutputText(0,8,1,"Toca para empezar");
PA_WaitFor(Stylus.Newpress);
// Empezamos a contar
PA_VBLCounterStart(0);
while (level == 1){
PA_ClearTextBg(0);
PA_OutputText(0,3,22,"Puntuacion:%d",PA_VBLCounter[0]);
PA_OutputText(0,19,22,"Faltan:%d",sprites_activos);
for (auxiliar = 0; auxiliar < sprites_activos; auxiliar ++){ // Comprueba si se ha tocado algun sprite
if (PA_SpriteTouched(Vsprites[auxiliar])){ // Si toca el sprite, eliminalo
PA_DeleteSprite(0,Vsprites[auxiliar]);
PA_PlaySimpleSound(0,choque);
sprites_activos--;
//actualizamos vector
for (auxiliar2 = auxiliar; auxiliar2 <= sprites_activos; auxiliar2++){
if (Vsprites[auxiliar] != 666){
Vsprites[auxiliar2]=Vsprites[auxiliar2+1];
}
}
}
}
// Si pulsa select sal de la partida
if (Pad.Newpress.Select){
PA_ClearTextBg(0);
Stylus.X=0; Stylus.Y=0;
PA_ResetBgSysScreen(0);
PA_EasyBgLoad(1,3,bg1);
PA_EasyBgLoad(0,3,bg0);
PA_EasyBgLoad(0,2,botonesbg);
PA_EasyBgLoad(0,1,facil);
level=0;
PA_ResetSpriteSys();
PA_StopSound(1);
PA_PlaySimpleSound(1,tetrisa);
}
// Si pulsa Start, pausa
if (Pad.Newpress.Start){
PA_VBLCounterPause(0);
PA_EasyBgLoad(0,1,pausa);
PA_WaitFor(Stylus.Newpress);
PA_DeleteBg(0,1);
PA_VBLCounterUnpause(0);
}
if (sprites_activos == 0){
// Pausamos contador y mostramos puntos
PA_ResetSpriteSys();
PA_VBLCounterPause(0);
PA_ClearTextBg(0);
PA_SetTextTileCol(0,3);
PA_OutputText(0,6,11,"¡Fin de la partida!");
PA_OutputText(0,2,13,"Tu puntuacion: %d puntos",PA_VBLCounter[0]);
PA_WaitFor(Stylus.Newpress);
// Comprobamos si está en el hall de la fama
hitemp = PA_VBLCounter[0];
PA_VBLCountersReset();
if (hitemp<=hi11){
hi15 = hi14;
hi14 = hi13;
hi13 = hi12;
hi12 = hi11;
hi11 = hitemp;
}else if (hitemp<=hi12){
hi15 = hi14;
hi14 = hi13;
hi13 = hi12;
hi12 = hitemp;
}else if (hitemp<=hi13){
hi15 = hi14;
hi14 = hi13;
hi13 = hitemp;
}else if (hitemp<=hi14){
hi15 = hi14;
hi14 = hitemp;
}else if (hitemp<=hi15)
hi15 = hitemp;
// Mostramos Hall de la fama
PA_ClearTextBg(0);
PA_OutputText(0,5,6,"HALL DE LA FAMA (Lv1)");
PA_OutputText(0,10,8,"1");
PA_OutputText(0,12,8,"%d",hi11);
PA_OutputText(0,10,9,"2");
PA_OutputText(0,12,9,"%d",hi12);
PA_OutputText(0,10,10,"3");
PA_OutputText(0,12,10,"%d",hi13);
PA_OutputText(0,10,11,"4");
PA_OutputText(0,12,11,"%d",hi14);
PA_OutputText(0,10,12,"5");
PA_OutputText(0,12,12,"%d",hi15);
PA_OutputText(0,6,22,"Toca para continuar");
PA_WaitFor(Stylus.Newpress);
//Volvemos al menú
PA_ClearTextBg(0);
Stylus.X=0; Stylus.Y=0;
PA_ResetBgSysScreen(0);
PA_EasyBgLoad(1,3,bg1);
PA_EasyBgLoad(0,3,bg0);
PA_EasyBgLoad(0,2,botonesbg);
PA_EasyBgLoad(0,1,facil);
level = 0;
PA_StopSound(1);
PA_PlaySimpleSound(1,tetrisa);// salimos a menu
}
PA_CheckLid ();
PA_WaitForVBL();
}
}else{
PA_DeleteBg(0,1);
PA_EasyBgLoad(0,1,facil);
boton = 1;
}
}else
if (Stylus.Newpress && PA_StylusInZone(151,39,244,79)){
if (boton == 2){
// NIVEL 2
PA_PlaySimpleSound(0,choque);
PA_StopSound(1);
PA_PlaySimpleSound(1,tetrisb);
sprites_activos = 30;
for(auxiliar=0; auxiliar < sprites_activos; auxiliar++) //llenamos el vector
Vsprites[auxiliar]=auxiliar;
Vsprites[sprites_activos]=666;
level = 2;
PA_ResetBgSysScreen(0);
PA_EasyBgLoad(0,3,bg0game);
PA_InitText(0,0);
PA_SetTextTileCol(0,1);
Stylus.X=1; Stylus.Y=1;
carga_nivel(level);
PA_OutputText(0,8,0,"Toca para empezar");
PA_WaitFor(Stylus.Newpress);
// Empezamos a contar
PA_VBLCounterStart(0);
while (level == 2){
PA_ClearTextBg(0);
PA_OutputText(0,3,23,"Puntuacion:%d",PA_VBLCounter[0]);
PA_OutputText(0,19,23,"Faltan:%d",sprites_activos);
for (auxiliar = 0; auxiliar < sprites_activos; auxiliar ++){ // Comprueba si se ha tocado algun sprite
if (PA_SpriteTouched(Vsprites[auxiliar])){ // Si toca el sprite, eliminalo
PA_DeleteSprite(0,Vsprites[auxiliar]);
PA_PlaySimpleSound(0,choque);
sprites_activos--;
//actualizamos vector
for (auxiliar2 = auxiliar; auxiliar2 <= sprites_activos; auxiliar2++){
if (Vsprites[auxiliar] != 666){
Vsprites[auxiliar2]=Vsprites[auxiliar2+1];
}
}
}
}
// Si pulsa select sal de la partida
if (Pad.Newpress.Select){
PA_ClearTextBg(0);
Stylus.X=0; Stylus.Y=0;
PA_ResetBgSysScreen(0);
PA_EasyBgLoad(1,3,bg1);
PA_EasyBgLoad(0,3,bg0);
PA_EasyBgLoad(0,2,botonesbg);
PA_EasyBgLoad(0,1,facil);
level=0;
PA_ResetSpriteSys();
PA_StopSound(1);
PA_PlaySimpleSound(1,tetrisa);
}
// Si pulsa Start, pausa
if (Pad.Newpress.Start){
PA_VBLCounterPause(0);
PA_EasyBgLoad(0,1,pausa);
PA_WaitFor(Stylus.Newpress);
PA_DeleteBg(0,1);
PA_VBLCounterUnpause(0);
}
if (sprites_activos == 0){
// Pausamos contador y mostramos puntos
PA_ResetSpriteSys();
PA_VBLCounterPause(0);
PA_ClearTextBg(0);
PA_SetTextTileCol(0,3);
PA_OutputText(0,6,11,"¡Fin de la partida!");
PA_OutputText(0,2,13,"Tu puntuacion: %d puntos",PA_VBLCounter[0]);
PA_WaitFor(Stylus.Newpress);
// Comprobamos si está en el hall de la fama
hitemp = PA_VBLCounter[0];
PA_VBLCountersReset();
if (hitemp<hi21){
hi25 = hi24;
hi24 = hi23;
hi23 = hi22;
hi22 = hi21;
hi21 = hitemp;
}else if (hitemp<hi22){
hi25 = hi24;
hi24 = hi23;
hi23 = hi22;
hi22 = hitemp;
}else if (hitemp<hi23){
hi25 = hi24;
hi24 = hi23;
hi23 = hitemp;
}else if (hitemp<hi24){
hi25 = hi24;
hi24 = hitemp;
}else if (hitemp<hi25)
hi25 = hitemp;
// Mostramos Hall de la fama
PA_ClearTextBg(0);
PA_OutputText(0,5,6,"HALL DE LA FAMA (Lv2)");
PA_OutputText(0,10,8,"1");
PA_OutputText(0,12,8,"%d",hi21);
PA_OutputText(0,10,9,"2");
PA_OutputText(0,12,9,"%d",hi22);
PA_OutputText(0,10,10,"3");
PA_OutputText(0,12,10,"%d",hi23);
PA_OutputText(0,10,11,"4");
PA_OutputText(0,12,11,"%d",hi24);
PA_OutputText(0,10,12,"5");
PA_OutputText(0,12,12,"%d",hi25);
PA_OutputText(0,6,22,"Toca para continuar");
PA_WaitFor(Stylus.Newpress);
//Volvemos al menú
PA_ClearTextBg(0);
Stylus.X=0; Stylus.Y=0;
PA_ResetBgSysScreen(0);
PA_EasyBgLoad(1,3,bg1);
PA_EasyBgLoad(0,3,bg0);
PA_EasyBgLoad(0,2,botonesbg);
PA_EasyBgLoad(0,1,facil);
level = 0; // salimos a menu
PA_StopSound(1);
PA_PlaySimpleSound(1,tetrisa);
}
PA_CheckLid ();
PA_WaitForVBL();
}
}else{
PA_DeleteBg(0,1);
PA_EasyBgLoad(0,1,medio);
boton = 2;
}
}else
if (Stylus.Newpress && PA_StylusInZone(20,70,113,109)){
if (boton == 3){
// NIVEL 3
PA_PlaySimpleSound(0,choque);
PA_StopSound(1);
PA_PlaySimpleSound(1,tetrisb);
sprites_activos = 117;
for(auxiliar=0; auxiliar < sprites_activos; auxiliar++) //llenamos el vector
Vsprites[auxiliar]=auxiliar;
Vsprites[sprites_activos]=666;
level = 3;
PA_ResetBgSysScreen(0);
PA_EasyBgLoad(0,3,bg0game);
PA_InitText(0,0);
PA_SetTextTileCol(0,1);
Stylus.X=1; Stylus.Y=1;
carga_nivel(level);
PA_OutputText(0,8,1,"Toca para empezar");
PA_WaitFor(Stylus.Newpress);
// Empezamos a contar
PA_VBLCounterStart(0);
while (level == 3){
PA_ClearTextBg(0);
PA_OutputText(0,3,23,"Puntuacion:%d",PA_VBLCounter[0]);
PA_OutputText(0,19,23,"Faltan:%d",sprites_activos);
for (auxiliar = 0; auxiliar < sprites_activos; auxiliar ++){ // Comprueba si se ha tocado algun sprite
if (PA_SpriteTouched(Vsprites[auxiliar])){ // Si toca el sprite, eliminalo
PA_DeleteSprite(0,Vsprites[auxiliar]);
PA_PlaySimpleSound(0,choque);
sprites_activos--;
//actualizamos vector
for (auxiliar2 = auxiliar; auxiliar2 <= sprites_activos; auxiliar2++){
if (Vsprites[auxiliar] != 666){
Vsprites[auxiliar2]=Vsprites[auxiliar2+1];
}
}
}
}
// Si pulsa select sal de la partida
if (Pad.Newpress.Select){
PA_ClearTextBg(0);
Stylus.X=0; Stylus.Y=0;
PA_ResetBgSysScreen(0);
PA_EasyBgLoad(1,3,bg1);
PA_EasyBgLoad(0,3,bg0);
PA_EasyBgLoad(0,2,botonesbg);
PA_EasyBgLoad(0,1,facil);
level=0;
PA_ResetSpriteSys();
PA_StopSound(1);
PA_PlaySimpleSound(1,tetrisa);
}
// Si pulsa Start, pausa
if (Pad.Newpress.Start){
PA_VBLCounterPause(0);
PA_EasyBgLoad(0,1,pausa);
PA_WaitFor(Stylus.Newpress);
PA_DeleteBg(0,1);
PA_VBLCounterUnpause(0);
}
if (sprites_activos == 0){
// Pausamos contador y mostramos puntos
PA_ResetSpriteSys();
PA_VBLCounterPause(0);
PA_ClearTextBg(0);
PA_SetTextTileCol(0,3);
PA_OutputText(0,6,11,"¡Fin de la partida!");
PA_OutputText(0,2,13,"Tu puntuacion: %d puntos",PA_VBLCounter[0]);
PA_WaitFor(Stylus.Newpress);
// Comprobamos si está en el hall de la fama
hitemp = PA_VBLCounter[0];
PA_VBLCountersReset();
if (hitemp<hi31){
hi35 = hi34;
hi34 = hi33;
hi33 = hi32;
hi32 = hi31;
hi31 = hitemp;
}else if (hitemp<hi32){
hi35 = hi34;
hi34 = hi33;
hi33 = hi32;
hi32 = hitemp;
}else if (hitemp<hi33){
hi35 = hi34;
hi34 = hi33;
hi33 = hitemp;
}else if (hitemp<hi34){
hi35 = hi34;
hi34 = hitemp;
}else if (hitemp<hi35)
hi35 = hitemp;
// Mostramos Hall de la fama
PA_ClearTextBg(0);
PA_OutputText(0,5,6,"HALL DE LA FAMA (Lv3)");
PA_OutputText(0,10,8,"1");
PA_OutputText(0,12,8,"%d",hi31);
PA_OutputText(0,10,9,"2");
PA_OutputText(0,12,9,"%d",hi32);
PA_OutputText(0,10,10,"3");
PA_OutputText(0,12,10,"%d",hi33);
PA_OutputText(0,10,11,"4");
PA_OutputText(0,12,11,"%d",hi34);
PA_OutputText(0,10,12,"5");
PA_OutputText(0,12,12,"%d",hi35);
PA_OutputText(0,6,22,"Toca para continuar");
PA_WaitFor(Stylus.Newpress);
//Volvemos al menú
PA_ClearTextBg(0);
Stylus.X=0; Stylus.Y=0;
PA_ResetBgSysScreen(0);
PA_EasyBgLoad(1,3,bg1);
PA_EasyBgLoad(0,3,bg0);
PA_EasyBgLoad(0,2,botonesbg);
PA_EasyBgLoad(0,1,facil);
level = 0; // salimos a menu
PA_StopSound(1);
PA_PlaySimpleSound(1,tetrisa);
}
PA_CheckLid ();
PA_WaitForVBL();
}
}else{
PA_DeleteBg(0,1);
PA_EasyBgLoad(0,1,dificil);
boton = 3;
}
}else
if (Stylus.Newpress && PA_StylusInZone(131,97,225,136)){
if (boton == 4){
PA_PlaySimpleSound(0,choque);
PA_ResetBgSysScreen(0);
PA_EasyBgLoad(0,3,bg0game);
PA_InitText(0,0);
PA_SetTextTileCol(0,1);
// Hi-Scores lv1
PA_ClearTextBg(0);
PA_OutputText(0,5,6,"HALL DE LA FAMA (Lv1)");
PA_OutputText(0,10,8,"1");
PA_OutputText(0,12,8,"%d",hi11);
PA_OutputText(0,10,9,"2");
PA_OutputText(0,12,9,"%d",hi12);
PA_OutputText(0,10,10,"3");
PA_OutputText(0,12,10,"%d",hi13);
PA_OutputText(0,10,11,"4");
PA_OutputText(0,12,11,"%d",hi14);
PA_OutputText(0,10,12,"5");
PA_OutputText(0,12,12,"%d",hi15);
PA_OutputText(0,6,22,"Toca para continuar");
PA_WaitFor(Stylus.Newpress);
PA_PlaySimpleSound(0,choque);
// Hi-Scores lv2
PA_ClearTextBg(0);
PA_OutputText(0,5,6,"HALL DE LA FAMA (Lv2)");
PA_OutputText(0,10,8,"1");
PA_OutputText(0,12,8,"%d",hi21);
PA_OutputText(0,10,9,"2");
PA_OutputText(0,12,9,"%d",hi22);
PA_OutputText(0,10,10,"3");
PA_OutputText(0,12,10,"%d",hi23);
PA_OutputText(0,10,11,"4");
PA_OutputText(0,12,11,"%d",hi24);
PA_OutputText(0,10,12,"5");
PA_OutputText(0,12,12,"%d",hi25);
PA_OutputText(0,6,22,"Toca para continuar");
PA_WaitFor(Stylus.Newpress);
PA_PlaySimpleSound(0,choque);
// Hi-Scores lv3
PA_ClearTextBg(0);
PA_OutputText(0,5,6,"HALL DE LA FAMA (Lv3)");
PA_OutputText(0,10,8,"1");
PA_OutputText(0,12,8,"%d",hi31);
PA_OutputText(0,10,9,"2");
PA_OutputText(0,12,9,"%d",hi32);
PA_OutputText(0,10,10,"3");
PA_OutputText(0,12,10,"%d",hi33);
PA_OutputText(0,10,11,"4");
PA_OutputText(0,12,11,"%d",hi34);
PA_OutputText(0,10,12,"5");
PA_OutputText(0,12,12,"%d",hi35);
PA_OutputText(0,6,22,"Toca para continuar");
PA_WaitFor(Stylus.Newpress);
PA_PlaySimpleSound(0,choque);
//Volvemos al menú
PA_ClearTextBg(0);
PA_SetTextTileCol(0,3);
Stylus.X=0; Stylus.Y=0;
PA_ResetBgSysScreen(0);
PA_EasyBgLoad(1,3,bg1);
PA_EasyBgLoad(0,3,bg0);
PA_EasyBgLoad(0,2,botonesbg);
PA_EasyBgLoad(0,1,facil);
level = 0; // salimos a menu
}else{
PA_DeleteBg(0,1);
PA_EasyBgLoad(0,1,hiscores);
boton = 4;
}
}else
if (Stylus.Newpress && PA_StylusInZone(0,153,94,192)){
// Creditos
PA_PlaySimpleSound(0,choque);
PA_ResetBgSysScreen(0);
PA_InitText(0,0);
PA_SetTextTileCol(0,3);
Stylus.X=0; Stylus.Y=0;
PA_EasyBgLoad(0,3,bg0game);
PA_OutputSimpleText(0,5,9," Xplosion Time! 1.0");
PA_OutputSimpleText(0,5,10," Creado, programado");
PA_OutputSimpleText(0,5,11," y disenyado por:");
PA_OutputSimpleText(0,5,13," JAVIER MOYA NAJERA");
PA_OutputSimpleText(0,5,17," 2oo8");
PA_WaitFor(Stylus.Newpress);
PA_ResetBgSysScreen(0);
PA_ClearTextBg(0);
PA_EasyBgLoad(0,3,bg0);
PA_EasyBgLoad(0,2,botonesbg);
PA_EasyBgLoad(0,1,facil);
boton = 1;
}else
if (Stylus.Newpress && PA_StylusInZone(163,153,256,192)){
// Instrucciones
PA_PlaySimpleSound(0,choque);
PA_ResetBgSysScreen(0);
PA_InitText(0,0);
PA_SetTextTileCol(0,3);
Stylus.X=0; Stylus.Y=0;
PA_EasyBgLoad(0,3,bg0game);
PA_OutputSimpleText(0,1,6,"El juego consiste en explotar");
PA_OutputSimpleText(0,1,7,"todas las bolas en el menor");
PA_OutputSimpleText(0,1,8,"tiempo posible. Para ello, usa");
PA_OutputSimpleText(0,1,9,"el Stylus de tu Nintendo DS.");
PA_OutputSimpleText(0,1,11,"Otros botones:");
PA_OutputSimpleText(0,1,12," Select - Abandonar partida");
PA_OutputSimpleText(0,1,13," Start - Pausar partida");
PA_WaitFor(Stylus.Newpress);
PA_ResetBgSysScreen(0);
PA_ClearTextBg(0);
PA_EasyBgLoad(0,3,bg0);
PA_EasyBgLoad(0,2,botonesbg);
PA_EasyBgLoad(0,1,facil);
boton = 1;
}
PA_CheckLid ();
PA_WaitForVBL();
}
PA_CheckLid ();
PA_WaitForVBL();
}
return 0;
} // End of main()