int main(int argc, char** argv) { PA_Init(); PA_InitVBL(); defaultExceptionHandler(); PA_SetScreenSpace(0); player = new ship(); PA_DualLoadSpritePal(ENEMIES, (void*)ikaruga_Pal); for(int n = ENEMIES; n < BULLETS; n++) { PA_DualCreateSprite(n, (void*)ikaruga_Sprite, OBJ_SIZE_32X32, COLOR256, ENEMIES, -32, -32); PA_DualSetSpriteVflip(n, true); } PA_DualLoadSpritePal(BULLETS, (void*)bullets_Pal); for(int n = BULLETS; n < 128; n++) PA_DualCreateSprite(n, (void*)bullets_Sprite, OBJ_SIZE_8X8, COLOR256, BULLETS, -8, -8); for(int x = 32; x < 224; x+=32) for(int y = 0; y < 32; y+=32) enemies.push_back(new enemy(x, y)); while(true) { player->update(); std::vector<enemy*> temp; for(int n = 0; n < (int)enemies.size(); n++) if(enemies[n]->update()) temp.push_back(enemies[n]); enemies = temp; PA_WaitForVBL(); } return 0; }
void PA_Init(void) { s32 i; for (i = 0; i < 130000>>2; i++) Blank[i] = 0; REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR; // enable & clear FIFO PA_Init2D(); pa_checklid = 1; // Autochecklid by default pa_update_padtimes = 0; // Don't update pad-times by default gh_update_padtimes = 0; // Don't update GuitarHero-pad-times by default Pad.Uptime.Up = 0; Pad.Downtime.Up = 0; Pad.Uptime.Down = 0; Pad.Downtime.Down = 0; Pad.Uptime.Left = 0; Pad.Downtime.Left = 0; Pad.Uptime.Right = 0; Pad.Downtime.Right = 0; Pad.Uptime.A = 0; Pad.Downtime.A = 0; Pad.Uptime.B = 0; Pad.Downtime.B = 0; Pad.Uptime.X = 0; Pad.Downtime.X = 0; Pad.Uptime.Y = 0; Pad.Downtime.Y = 0; Pad.Uptime.L = 0; Pad.Downtime.L = 0; Pad.Uptime.R = 0; Pad.Downtime.R = 0; Pad.Uptime.Start = 0; Pad.Downtime.Start = 0; Pad.Uptime.Select = 0; Pad.Downtime.Select = 0; Pad.Uptime.Anykey = 0; Pad.Downtime.Anykey = 0; //WAIT_CR &= ~(1 << 7); PA_VBLCountersReset(); Stylus.X = 128; Stylus.Y = 96; PA_VBLFunctionReset(); irqInit(); //PA_ResetInterrupts(); IPC->mailData = (u32)(&PA_IPC); for (i = 0; i < 2; i++){ PA_SetBrightness(i, 0); // On affiche les écrans PA_font[i] = 0; // #ifndef TEXT_ALLCHARACTERS PA_textmap[i] = (u16*)PA_text_Map; PA_texttiles[i] = (u8*)PA_text_Tiles; PA_textpal[i] = (u16*)PA_text_Pal; // #endif /* #ifdef TEXT_ALLCHARACTERS PA_textmap[i] = (u16*)PA_text2_Map; PA_texttiles[i] = (u8*)PA_text2_Tiles; PA_textpal[i] = (u16*)PA_text2_Pal; #endif */ } PA_UpdateUserInfo(); PA_ResetRecoSys(); // Reco system init PA_SetScreenSpace(48); // Default spacing PA_GifInfo.StartFrame = 0; // start from the beginning PA_GifInfo.EndFrame = 10000; // random high number MotionVBL = PA_Nothing; PaddleVBL = PA_Nothing; GHPadVBL = PA_Nothing; PA_UpdateRTC(); PA_InitRand(); }
void spaceInvaders() { PA_Init(); PA_InitVBL(); PA_InitText(1,0); PA_InitText(0,0); PA_InitSound(); PA_WaitForVBL();PA_WaitForVBL();PA_WaitForVBL(); PA_SetScreenSpace(8); // ESPACE ENTRE LES 2 écrans = 8 pixels !! // des compteurs utilisables dans des boucles int i,cpt; // les constantes pas globales int nbEnnemisMax=50; PA_EasyBgLoad(0,1,espace);//declaration et initialisation du background PA_EasyBgLoad(1,1,espace); // PA_DualLoadPAGfxLargeBg(1,backg); //pour les deux écrans /* INITIALISATION DES PALETTES */ PA_LoadSpritePal(1,0,(void*)sprites_Pal);// //// pour ecran haut PA_LoadSpritePal(0,0,(void*)sprites_Pal);// //// pour ecran bas PA_LoadSpritePal(1,1,(void*)ennemis_Pal);// //// pour ecran haut PA_LoadSpritePal(0,1,(void*)ennemis_Pal);// //// pour ecran bas PA_LoadSpritePal(1,2,(void*)tir_Pal);// //// pour ecran haut PA_LoadSpritePal(0,2,(void*)tir_Pal);// //// pour ecran bas PA_DualLoadSpritePal(0,(void*)sprites_Pal); PA_DualLoadSpritePal(1,(void*)ennemis_Pal); PA_DualLoadSpritePal(2,(void*)tir_Pal); /* INITIALISATION TYPE-SPRITE ET tabParcours */ TypeSprite tabTS[19]; initialisationTableauTypeSpriteGlobal(tabTS); int /*nbEtapes1=6, nbEtapes2= 6, nbEtapes3=6,*/ nbEtapes1Charles=4, nbEtapes2Charles=4, nbEtapes3Charles=6, nbEtapes4Charles=5, /*nbEtapes5Charles=4, nbEtapes6Charles=4, nbEtapes7Charles=5, nbEtapes8Charles=5,*/ nbEtapes9Charles=4, nbEtapes10Charles=4, vitesse1=1, vitesse2=1, vitesse3=1, //tabParcours1[10][4]={{0,0,5,0},{200,0,vitesse1,0},{200,100,vitesse1,0},{50,100,vitesse1,0},{50,20,vitesse1,0},{150,20,vitesse1,0},{30,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}, // tab[i][1] == x , tab[i][2] == y , tab[i][3] == vitesse, tab[0][3] = nbPV , tab[i][4] = temps entre i et i+1 //tabParcours2[10][4]={{0,0,5,0},{200,0,vitesse2,0},{200,100,vitesse2,0},{50,100,vitesse2,0},{50,20,vitesse2,0},{150,20,vitesse2,0},{30,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}, //tabParcours3[10][4]={{0,0,5,0},{200,0,vitesse3,0},{200,100,vitesse3,0},{50,100,vitesse3,0},{50,20,vitesse3,0},{150,20,vitesse3,0},{30,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}, tabParcours1Charles[10][4]={{0,0,5,0},{210,10,vitesse1,0},{210,100,vitesse1,0},{5,100,vitesse1,0},{-30,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}, tabParcours2Charles[10][4]={{0,0,5,0},{256,90,vitesse1,0},{15,30,vitesse1,0},{232,30,vitesse1,0},{30,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}, tabParcours3Charles[10][4]={{256,128,5,0},{32,128,vitesse1,0},{245,96,vitesse1,0},{130,64,vitesse1,0},{245,32,vitesse1,0},{3,10,vitesse1,0},{-30,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}, tabParcours4Charles[10][4]={{3,32,5,0},{190,32,vitesse1,0},{32,64,vitesse1,0},{190,96,vitesse1,0},{3,126,vitesse1,0},{-30,5,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}, // tabParcours5Charles[10][4]={{117,0,5,0},{117,325,vitesse1,0},{58,245,vitesse1,0},{10,325,vitesse1,0},{-30,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}, // Depart Ligne rouge (117.0) haut de l'écran 1 au centre et fini sa course écran 0 a gauche en son centre (10.325) // tabParcours6Charles[10][4]={{256,325,5,0},{140,325,vitesse1,0},{140,110,vitesse1,0},{205,110,vitesse1,0},{30,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}, // Depart Ligne rouge (256.325) de l'Ecran 0 du centre droit et fini sa course ecran 1 au millieu droit (205.110) //tabParcours7Charles[10][4]={{0,258,5,0},{50,180,vitesse1,0},{100,180,vitesse1,0},{100,32,vitesse1,0},{0,32,vitesse1,0},{-30,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}, // Depart Ligne bleu (0.258) de l'Ecran 0 du centre gauche et fini sa course ecran 1 en haut a gauche (0.32) //tabParcours8Charles[10][4]={{256,32,5,0},{160,32,vitesse1,0},{160,180,vitesse1,0},{205,180,vitesse1,0},{252,258,vitesse1,0},{30,20,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}, // Depart Ligne bleu (256.32) de l'Ecran 1 en haut a droite et fini sa course en haut a droite de l Ecran 0 (252.258) tabParcours9Charles[10][4]={{0,0,5,0},{90,167,vitesse1,0},{220,26,vitesse1,0},{70,167,vitesse1,0},{-30,30,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}, // refait pour faire une étoile branche haut droite tabParcours10Charles[10][4]={{256,0,5,0},{152,167,vitesse1,0},{30,26,vitesse1,0},{174,167,vitesse1,0},{30,30,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; // refait pour faire une étoile branche haut gauche PA_CreateSprite(0,1,(void*)miniTir_Sprite,OBJ_SIZE_32X16,1,0,255,193); PA_SetSpriteXY(0,1,255,193);// un sprite inutile mais qui se prends un bug d'affichage ... // le bug apparait qu'avec le boss et doit venir d'un des trucs touchants aux tirs. Mais impossible à trouver :( /* SPRITE JOUEUR */ // initialisation du Joueur // la position du vaisseau au départ = {x=50} et {y=160} // numEcran = 0 et numSprite = 1 Sprite Joueur; Joueur.numEcran = 0; Joueur.numSprite = 2; Joueur.x=50; Joueur.y=160; Joueur.nbPV=30; Joueur.numEtape=0; Joueur.temps=0; Joueur.typeSprite=&tabTS[11]; // pas de palette pour les sprites 16bits // PA_Create16bitSprite(Joueur.numEcran, // Screen // Joueur.numSprite, // Sprite number // (void*)ship_Sprite, // image to load, 128 pixels wide ! // OBJ_SIZE_32X32, // sprite size // Joueur.x, // x // Joueur.y); //y PA_CreateSprite(Joueur.numEcran,Joueur.numSprite,(void*)ship_Sprite,OBJ_SIZE_32X32,1,0,Joueur.x,Joueur.y); PA_SetSpriteXY(Joueur.numEcran,Joueur.numSprite,(Joueur.x+=50),Joueur.y); // ancien : PA_CreateSprite(Joueur.numEcran,Joueur.numSprite,(void*)yata_Sprite,OBJ_SIZE_32X64,1,0,Joueur.x,Joueur.y); /* ENNEMIS */ int nbEnnemi0=18, nbEnnemi=18, spriteReference=1; // maximum d'ennemis pour écran 0 Sprite tabEnnemi0[nbEnnemisMax], tabEnnemi[nbEnnemisMax]; // tableau d'ennemi, nbEnnemisMax est une constante donner au début du programme cpt=0; PA_WaitForVBL();PA_WaitForVBL(); //* // 45-50 : Crab int nbSpriteDbt=45; for(i=0;i<6;i++) { tabEnnemi0[i].numEcran=0; tabEnnemi0[i].numSprite=(i+nbSpriteDbt); tabEnnemi0[i].x=256; tabEnnemi0[i].y=192; tabEnnemi0[i].nbPV=0; tabEnnemi0[i].numEtape=0; tabEnnemi0[i].temps=0; tabEnnemi0[i].typeSprite=&tabTS[0]; if(i==0) { PA_CreateSprite(tabEnnemi0[i].numEcran,nbSpriteDbt,(void*)Crab_Sprite,OBJ_SIZE_32X32,1,1,tabEnnemi0[i].x,tabEnnemi0[i].y); spriteReference=tabEnnemi0[i].numSprite; } else PA_CloneSprite(tabEnnemi0[i].numEcran,tabEnnemi0[i].numSprite,spriteReference); PA_SetSpriteXY(tabEnnemi0[i].numEcran,tabEnnemi0[i].numSprite,tabEnnemi0[i].x,tabEnnemi0[i].y); PA_StartSpriteAnim(tabEnnemi0[i].numEcran,tabEnnemi0[i].numSprite,0,1,1); } // 51-56 : Octopus for(i=6;i<12;i++) { tabEnnemi0[i].numEcran=0; tabEnnemi0[i].numSprite=(i+nbSpriteDbt); tabEnnemi0[i].x=256; tabEnnemi0[i].y=192; tabEnnemi0[i].nbPV=0; tabEnnemi0[i].numEtape=0; tabEnnemi0[i].temps=0; tabEnnemi0[i].typeSprite=&tabTS[2]; if(i==6) { PA_CreateSprite(tabEnnemi0[i].numEcran,tabEnnemi0[i].numSprite,(void*)Octopus_Sprite,OBJ_SIZE_16X16,1,1,tabEnnemi0[i].x,tabEnnemi0[i].y); spriteReference=tabEnnemi0[i].numSprite; } else PA_CloneSprite(tabEnnemi0[i].numEcran,tabEnnemi0[i].numSprite,spriteReference); PA_SetSpriteXY(tabEnnemi0[i].numEcran,tabEnnemi0[i].numSprite,tabEnnemi0[i].x,tabEnnemi0[i].y); PA_StartSpriteAnim(tabEnnemi0[i].numEcran,tabEnnemi0[i].numSprite,0,1,1); } // 57-62 : Squid for(i=12;i<nbEnnemi0;i++) { tabEnnemi0[i].numEcran=0; tabEnnemi0[i].numSprite=(i+nbSpriteDbt); tabEnnemi0[i].x=256; tabEnnemi0[i].y=192; tabEnnemi0[i].nbPV=0; tabEnnemi0[i].numEtape=0; tabEnnemi0[i].temps=0; tabEnnemi0[i].typeSprite=&tabTS[4]; if(i==12) { PA_CreateSprite(tabEnnemi0[i].numEcran,tabEnnemi0[i].numSprite,(void*)Squid_Sprite,OBJ_SIZE_32X32,1,1,tabEnnemi0[i].x,tabEnnemi0[i].y); spriteReference=tabEnnemi0[i].numSprite; } else PA_CloneSprite(tabEnnemi0[i].numEcran,tabEnnemi0[i].numSprite,spriteReference); PA_SetSpriteXY(tabEnnemi0[i].numEcran,tabEnnemi0[i].numSprite,tabEnnemi0[i].x,tabEnnemi0[i].y); PA_StartSpriteAnim(tabEnnemi0[i].numEcran,tabEnnemi0[i].numSprite,0,1,1); } //*/ // ecran -1 // 63-68 : Crab int nbSpriteDbt2=63; i=0; for(i=0;i<6;i++) { tabEnnemi[i].numEcran=-1; tabEnnemi[i].numSprite=(i+nbSpriteDbt2); tabEnnemi[i].x=256; tabEnnemi[i].y=392; tabEnnemi[i].nbPV=0; tabEnnemi[i].numEtape=0; tabEnnemi[i].temps=0; tabEnnemi[i].typeSprite=&tabTS[0]; if(i==0) { PA_DualCreateSprite(nbSpriteDbt2,(void*)Crab_Sprite,OBJ_SIZE_32X32,1,1,tabEnnemi[i].x,tabEnnemi[i].y); spriteReference=tabEnnemi[i].numSprite; } else PA_DualCloneSprite(tabEnnemi[i].numSprite,nbSpriteDbt2); PA_DualSetSpriteXY(tabEnnemi[i].numSprite,tabEnnemi[i].x,tabEnnemi[i].y); PA_DualStartSpriteAnim(tabEnnemi[i].numSprite,0,1,1); } // 69-74 : Octopus for(i=6;i<12;i++) { tabEnnemi[i].numEcran=-1; tabEnnemi[i].numSprite=(i+nbSpriteDbt2); tabEnnemi[i].x=256; tabEnnemi[i].y=392; tabEnnemi[i].nbPV=0; tabEnnemi[i].numEtape=0; tabEnnemi[i].temps=0; tabEnnemi[i].typeSprite=&tabTS[2]; if(i==6) { PA_DualCreateSprite(tabEnnemi[i].numSprite,(void*)Octopus_Sprite,OBJ_SIZE_16X16,1,1,tabEnnemi[i].x,tabEnnemi[i].y); spriteReference=tabEnnemi[i].numSprite; } else PA_DualCloneSprite(tabEnnemi[i].numSprite,spriteReference); PA_DualSetSpriteXY(tabEnnemi[i].numSprite,tabEnnemi[i].x,tabEnnemi[i].y); PA_DualStartSpriteAnim(tabEnnemi[i].numSprite,0,1,1); } // 75-80 : Squid for(i=12;i<nbEnnemi;i++) { tabEnnemi[i].numEcran=-1; tabEnnemi[i].numSprite=(i+nbSpriteDbt2); tabEnnemi[i].x=256; tabEnnemi[i].y=392; tabEnnemi[i].nbPV=0; tabEnnemi[i].numEtape=0; tabEnnemi[i].temps=0; tabEnnemi[i].typeSprite=&tabTS[4]; if(i==12) { PA_DualCreateSprite(tabEnnemi[i].numSprite,(void*)Squid_Sprite,OBJ_SIZE_32X32,1,1,tabEnnemi[i].x,tabEnnemi[i].y); spriteReference=tabEnnemi[i].numSprite; } else PA_DualCloneSprite(tabEnnemi[i].numSprite,spriteReference); PA_DualSetSpriteXY(tabEnnemi[i].numSprite,tabEnnemi[i].x,tabEnnemi[i].y); PA_DualStartSpriteAnim(tabEnnemi[i].numSprite,0,1,1); } //PA_CreateSprite(0,102,(void*)Squid_Sprite,OBJ_SIZE_32X32,1,0,110,100); //PA_StartSpriteAnim(0,100,0,1,1); //PA_StartSpriteAnim(0,101,0,1,1); //PA_StartSpriteAnim(0,102,0,1,1); //* // boss test Boss boss; boss.nombredeSprite=4; boss.sprite1.numEcran=-1; boss.sprite1.numSprite=124; boss.sprite1.x=-124; boss.sprite1.y=0; boss.sprite1.typeSprite=&tabTS[15]; boss.sprite2.numEcran=-1; boss.sprite2.numSprite=125; boss.sprite2.x=-64; boss.sprite2.y=0; boss.sprite2.typeSprite=&tabTS[16]; boss.sprite3.numEcran=-1; boss.sprite3.numSprite=126; boss.sprite3.x=-124; boss.sprite3.y=32; boss.sprite3.typeSprite=&tabTS[17]; boss.sprite4.numEcran=-1; boss.sprite4.numSprite=127; boss.sprite4.x=-64; boss.sprite4.y=32; boss.sprite4.typeSprite=&tabTS[18]; boss.typeTir=0; boss.typeTir2=2; //origine des tirs boss.origineTir1[0]=64; boss.origineTir1[1]=64; boss.origineTir2[0]=8; boss.origineTir2[1]=32; boss.origineTir3[0]=115; boss.origineTir3[1]=32; PA_DualCreateSprite(boss.sprite1.numSprite,(void*)Boss_Sprite,OBJ_SIZE_64X32,1,1,boss.sprite1.x,boss.sprite1.y); PA_DualCreateSprite(boss.sprite2.numSprite,(void*)Boss2_Sprite,OBJ_SIZE_64X32,1,1,boss.sprite2.x,boss.sprite2.y); PA_DualCreateSprite(boss.sprite3.numSprite,(void*)Boss3_Sprite,OBJ_SIZE_64X32,1,1,boss.sprite3.x,boss.sprite3.y); PA_DualCreateSprite(boss.sprite4.numSprite,(void*)Boss4_Sprite,OBJ_SIZE_64X32,1,1,boss.sprite4.x,boss.sprite4.y); PA_DualSetSpriteXY(boss.sprite1.numSprite,boss.sprite1.x,boss.sprite1.y); PA_DualSetSpriteXY(boss.sprite2.numSprite,boss.sprite2.x,boss.sprite2.y); PA_DualSetSpriteXY(boss.sprite3.numSprite,boss.sprite3.x,boss.sprite3.y); PA_DualSetSpriteXY(boss.sprite4.numSprite,boss.sprite4.x,boss.sprite4.y); //*/ /* TIR */ // initialisation du tableau de tir et le premier tir sera impair int numDebutTir=5, numDebutTirBoss=81, numTir=25, numTirMax=60; Tir tabTir[numTirMax]; // les tirs sont envoyés hors de l'écran. Les numéros 10 à 30 sont réservés aux Tirs. Le Tir est initialement non actif // les indices sont de numTir (ATTENTION : numSPrite = numTir+10) // typeTir : 0=miniTir, 1=salveTir, 2=tir // de 0 à 10 = miniTir for(i=0;i<10;i++) { tabTir[i].coordonnees.numEcran=-1; tabTir[i].coordonnees.numSprite=(numDebutTir+i); tabTir[i].coordonnees.x=256; tabTir[i].coordonnees.y=392; tabTir[i].tirActif=false; tabTir[i].vitesseTir=2; tabTir[i].puissanceTir=2; tabTir[i].typeTir=0; tabTir[i].coordonnees.typeSprite=&tabTS[6]; if(i==0) { PA_DualCreateSprite(tabTir[i].coordonnees.numSprite,(void*)miniTir_Sprite,OBJ_SIZE_8X8,1,2,tabTir[i].coordonnees.x,tabTir[i].coordonnees.y); spriteReference=tabTir[i].coordonnees.numSprite; } else PA_DualCloneSprite((tabTir[i].coordonnees.numSprite),spriteReference); PA_DualSetSpriteXY(tabTir[i].coordonnees.numSprite,tabTir[i].coordonnees.x,tabTir[i].coordonnees.y); // pour l'instant, vitesse et puissance = 2 } // de 10 à 15 = tir for(i=10;i<15;i++) { tabTir[i].coordonnees.numEcran=-1; tabTir[i].coordonnees.numSprite=(numDebutTir+i); tabTir[i].coordonnees.x=256; tabTir[i].coordonnees.y=392; tabTir[i].tirActif=false; tabTir[i].vitesseTir=1; tabTir[i].puissanceTir=10; tabTir[i].typeTir=2; tabTir[i].coordonnees.typeSprite=&tabTS[8]; if(i==10) { PA_DualCreateSprite(tabTir[i].coordonnees.numSprite,(void*)tir_Sprite,OBJ_SIZE_16X16,1,2,tabTir[i].coordonnees.x,tabTir[i].coordonnees.y); spriteReference=tabTir[i].coordonnees.numSprite; } else PA_DualCloneSprite((tabTir[i].coordonnees.numSprite),spriteReference); PA_DualSetSpriteXY(tabTir[i].coordonnees.numSprite,tabTir[i].coordonnees.x,tabTir[i].coordonnees.y); // pour l'instant, vitesse et puissance = 2 } // de 15 à 25 = salveTir for(i=15;i<numTir;i++) { tabTir[i].coordonnees.numEcran=-1; tabTir[i].coordonnees.numSprite=(numDebutTir+i); tabTir[i].coordonnees.x=256; tabTir[i].coordonnees.y=392;//192*2=384+8=392 le 8 est l'espace entre les 2 écrans tabTir[i].tirActif=false; tabTir[i].vitesseTir=2; tabTir[i].puissanceTir=6; tabTir[i].typeTir=1; tabTir[i].coordonnees.typeSprite=&tabTS[7]; //DOUBLESPRITE if(i==15) { PA_DualCreateSprite(tabTir[i].coordonnees.numSprite,(void*)salveTir_Sprite,OBJ_SIZE_16X16,1,2,tabTir[i].coordonnees.x,tabTir[i].coordonnees.y); spriteReference=tabTir[i].coordonnees.numSprite; } else PA_DualCloneSprite((tabTir[i].coordonnees.numSprite),spriteReference); PA_DualSetSpriteXY(tabTir[i].coordonnees.numSprite,tabTir[i].coordonnees.x,tabTir[i].coordonnees.y); // pour l'instant, vitesse et puissance = 2 } // LES TIRS DES BOSS // les structures sont initialisés mais les sprites pas encore créé // ils vont de numSprite=81 à 109 et ils seront créés lorsque les sprites ennemis seront detruits pour faire de la place for(i=30;i<40;i++) { tabTir[i].coordonnees.numEcran=-1; tabTir[i].coordonnees.numSprite=(numDebutTirBoss+i-30); tabTir[i].coordonnees.x=256; tabTir[i].coordonnees.y=392; tabTir[i].tirActif=false; tabTir[i].vitesseTir=2; tabTir[i].puissanceTir=2; tabTir[i].typeTir=0; tabTir[i].coordonnees.typeSprite=&tabTS[6]; } // de 10 à 20 = tir for(i=40;i<50;i++) { tabTir[i].coordonnees.numEcran=-1; tabTir[i].coordonnees.numSprite=(numDebutTirBoss+i-30); tabTir[i].coordonnees.x=256; tabTir[i].coordonnees.y=392; tabTir[i].tirActif=false; tabTir[i].vitesseTir=1; tabTir[i].puissanceTir=10; tabTir[i].typeTir=2; tabTir[i].coordonnees.typeSprite=&tabTS[8]; } // de 20 à 25 = salveTir for(i=50;i<numTirMax;i++) { tabTir[i].coordonnees.numEcran=-1; tabTir[i].coordonnees.numSprite=(numDebutTirBoss+i-30); tabTir[i].coordonnees.x=256; tabTir[i].coordonnees.y=392;//192*2=384+8=392 le 8 est l'espace entre les 2 écrans tabTir[i].tirActif=false; tabTir[i].vitesseTir=2; tabTir[i].puissanceTir=6; tabTir[i].typeTir=1; tabTir[i].coordonnees.typeSprite=&tabTS[7]; } // END SPRITE PA_WaitForVBL();PA_WaitForVBL();PA_WaitForVBL(); int numMusique=1, numMusiqueMax=2; char tabMusique[4][20]={"Pas de Musique","phoenixIngame","lotus","rien"}; // PA_PlayMod(lotus); // lecture d'un fichier Mod // PA_PauseMod(u8); u8 = 0 pour enlever ou 1 pour mettre en pause NE MARCHE PAS, faut une release communautaire ... // PA_StopMod() PA_PlayMod(phoenixIngame); // la condition pour que le jeu continue bool sortir=false; PA_WaitForVBL();PA_WaitForVBL();PA_WaitForVBL();PA_WaitForVBL(); // les variables et instructions necessaire pour gerer le temps sur la DS PA_VBLCounterStart(0); // le début du jeu PA_VBLCounterStart(1); // pour les étapes PA_VBLCounterStart(2); PA_VBLCounterStart(3); //PA_VBLCounterStart(10); // pour le cheat PA_VBLCounterStart(15); // pour les tirs aléatoires des ennemis PA_VBLCounterStart(16); // pour les tirs du Joueur //unsigned int debutDuJeu=getTicks(); // le début du jeu, au cas ou ... int cptTirActif=1, cptTirActifEnnemi=1; // cptTirActif est le nombre (premier, second ...) du prochain tir int niveauTir=0, actionTir=1, numEtape=1, numEtapeBoss1=16, numEtapeMax=17; int debutParcours=1,debutParcours2=1,debutParcours3=1, debutParcours4=1,propreteAffichageTir=0; // = 1 si debut, 0 si jeu en cours, 2 si fini int vitesseBoss=1; // actionTir est à 1 si le tir doit être activé, 0 sinon //int cheatCode=0, tpsDernierEssaiCheatCode=PA_VBLCounter[10]/15; //unsigned int TempsDernierChoix=getTicks();//seconde courante while(!sortir) { // sécurité pour les tirs ennemis if(cptTirActifEnnemi>=50) { cptTirActifEnnemi=0; PA_VBLCounterStart(15); } /* if(Pad.Newpress.A && (cheatCode==1 || cheatCode==2) && tpsDernierEssaiCheatCode!=(PA_VBLCounter[10]/15)) { if(cheatCode==1 && PA_VBLCounter[10]/60!=0) { PA_VBLCounterStart(10); } cheatCode++; tpsDernierEssaiCheatCode=PA_VBLCounter[10]/15; } if(Pad.Newpress.B && (cheatCode==0 || cheatCode==3) && tpsDernierEssaiCheatCode!=(PA_VBLCounter[10]/15)) { cheatCode++; tpsDernierEssaiCheatCode=PA_VBLCounter[10]/15; } if(cheatCode==4) { Joueur.nbPV+=50; cheatCode=0; } if(cheatCode!=0 && PA_VBLCounter[10]/60==3) { cheatCode=0; } //*/ // numEtape nous sert à savoir à quel étape du jeu on se situe // cptTemps nous sert pour savoir ou en est le jeu et pour les déplacements /* PREMIERE ETAPE */ if(numEtape==1 || numEtape==2 || numEtape==3) // Crab { // première étape du jeu if(debutParcours==1) { debutParcours=0; PA_VBLCounterStart(1); // reinitialisation du compteur PA_VBLCounterStart(15); // pour les tirs tabEnnemi[0].x=tabParcours1Charles[0][0]; tabEnnemi[0].y=tabParcours1Charles[0][1]; tabEnnemi[0].nbPV=5; tabEnnemi[0].numEtape=1; PA_DualSetSpriteXY(tabEnnemi[0].numSprite,tabEnnemi[0].x,tabEnnemi[0].y); //PA_SetSpriteXY(tabEnnemi[0].numEcran,tabEnnemi0[0].numSprite,tabEnnemi0[0].x,tabEnnemi0[0].y); } // le premier script if(nouveauParcours(tabEnnemi, 0, 5, tabParcours1Charles, nbEtapes1Charles, 1) && debutParcours!=2) { numEtape++; debutParcours=2; } } if(numEtape==1 || numEtape==2 || numEtape==3) // Octopus { // première étape du jeu if(debutParcours2==1) { debutParcours2=0; PA_VBLCounterStart(2); // reinitialisation du compteur tabEnnemi[6].x=tabParcours2Charles[0][0]; tabEnnemi[6].y=tabParcours2Charles[0][1]; tabEnnemi[6].nbPV=5; tabEnnemi[6].numEtape=1; PA_DualSetSpriteXY(tabEnnemi[6].numSprite,tabEnnemi[6].x,tabEnnemi[6].y); //PA_SetSpriteXY(tabEnnemi0[8].numEcran,tabEnnemi0[8].numSprite,tabEnnemi0[8].x,tabEnnemi0[8].y); } // le premier script if(nouveauParcours(tabEnnemi, 6, 5, tabParcours2Charles, nbEtapes2Charles, 2) && debutParcours2!=2) { numEtape++; debutParcours2=2; } } if(numEtape==1 || numEtape==2 || numEtape==3) // Squid { // première étape du jeu if(debutParcours3==1) { debutParcours3=0; PA_VBLCounterStart(3); // reinitialisation du compteur tabEnnemi[12].x=tabParcours3Charles[0][0]; tabEnnemi[12].y=tabParcours3Charles[0][1]; tabEnnemi[12].nbPV=5; tabEnnemi[12].numEtape=1; PA_DualSetSpriteXY(tabEnnemi[12].numSprite,tabEnnemi[12].x,tabEnnemi[12].y); } // le premier script if(nouveauParcours(tabEnnemi, 12, 5, tabParcours3Charles, nbEtapes3Charles, 3) && debutParcours3!=2) { numEtape++; debutParcours3=2; } } if(actionTir && (numEtape==1 || numEtape==2 || numEtape==3) && cptTirActifEnnemi==(PA_VBLCounter[15]/60)) { // première étape du jeu int spritealeatoire = PA_RandMinMax(0,5), spritealeatoire2 = PA_RandMinMax(6,11), spritealeatoire3 = PA_RandMinMax(12,17); int ylanceur=tabEnnemi[spritealeatoire].y+15, ylanceur2=tabEnnemi[spritealeatoire2].y+15, ylanceur3=tabEnnemi[spritealeatoire3].y+15; if(tabEnnemi[spritealeatoire].numEcran==0) { ylanceur+=200; } if(tabEnnemi[spritealeatoire].numEcran==0) { ylanceur2+=200; } nouveauTir(tabTir,10,2,tabEnnemi[spritealeatoire].x+5,ylanceur); nouveauTir(&tabTir[15],10,2,tabEnnemi[spritealeatoire2].x+5,ylanceur2); nouveauTir(tabTir,10,2,tabEnnemi[spritealeatoire3].x+5,ylanceur3); cptTirActifEnnemi++; } /* DEUXIEME ETAPE */ if(numEtape==4) // initialisation de l'étape 5 et 6 { if(debutParcours==2 && debutParcours2==2 && debutParcours3==2) // si les 3 etapes sont finis { PA_VBLCounterStart(1); // reinitialisation du compteur d'étapes debutParcours=0; debutParcours2=0; debutParcours3=0; PA_OutputText(0,0,10,"NIVEAU 1 TERMINE !!!"); actionTir=false; } if((PA_VBLCounter[1]/60)==3) { PA_ClearTextBg(0); numEtape++; PA_VBLCounterStart(1); debutParcours=1; debutParcours2=1; PA_VBLCounterStart(1); PA_VBLCounterStart(15); PA_VBLCounterStart(16); cptTirActif=0; cptTirActifEnnemi=0; actionTir=true; } } if(numEtape==5 || numEtape==6) // Crab { // deuxième étape du jeu if(debutParcours==1) { debutParcours=0; PA_VBLCounterStart(1); // reinitialisation du compteur tabEnnemi0[0].x=tabParcours9Charles[0][0]; tabEnnemi0[0].y=tabParcours9Charles[0][1]; tabEnnemi0[0].nbPV=5; tabEnnemi0[0].numEtape=1; PA_SetSpriteXY(tabEnnemi0[0].numEcran,tabEnnemi0[0].numSprite,tabEnnemi0[0].x,tabEnnemi0[0].y); } // le premier script if(nouveauParcours(tabEnnemi0, 0, 6, tabParcours2Charles, nbEtapes2Charles, 1) && debutParcours!=2) { numEtape++; debutParcours=2; } } if(numEtape==5 || numEtape==6) // Octopus { // deuxième étape du jeu if(debutParcours2==1) { debutParcours2=0; PA_VBLCounterStart(2); // reinitialisation du compteur tabEnnemi0[6].x=tabParcours10Charles[0][0]; tabEnnemi0[6].y=tabParcours10Charles[0][1]; tabEnnemi0[6].nbPV=5; tabEnnemi0[6].numEtape=1; PA_SetSpriteXY(tabEnnemi0[6].numEcran,tabEnnemi0[6].numSprite,tabEnnemi0[6].x,tabEnnemi0[6].y); } // le premier script if(nouveauParcours(tabEnnemi0, 6, 6, tabParcours3Charles, nbEtapes3Charles, 2) && debutParcours2!=2) { numEtape++; debutParcours2=2; } } if(actionTir && (numEtape==5 || numEtape==6) && cptTirActifEnnemi==(PA_VBLCounter[15]/60)) { // deuxième étape du jeu int spritealeatoire = PA_RandMinMax(0,6), spritealeatoire2 = PA_RandMinMax(6,12); int ylanceur=tabEnnemi0[spritealeatoire].y+15, ylanceur2=tabEnnemi0[spritealeatoire2].y+15; if(tabEnnemi0[spritealeatoire].numEcran==0) { ylanceur+=200; } if(tabEnnemi0[spritealeatoire].numEcran==0) { ylanceur2+=200; } nouveauTir(tabTir,10,2,tabEnnemi0[spritealeatoire].x+5,ylanceur); nouveauTir(&tabTir[15],10,2,tabEnnemi0[spritealeatoire2].x+5,ylanceur2); cptTirActifEnnemi++; } if(numEtape==7) { if(debutParcours==2 && debutParcours2==2) // bricolage { PA_VBLCounterStart(1); // reinitialisation du compteur d'étapes debutParcours=0; PA_OutputText(0,0,10,"NIVEAU 2 TERMINE !!!"); PA_StopMod(); } if((PA_VBLCounter[1]/60)==3) { numMusique=2; PA_PlayMod(lotus); PA_ClearTextBg(0); numEtape++; PA_VBLCounterStart(1); debutParcours=1; debutParcours2=1; debutParcours3=1; debutParcours4=1; PA_VBLCounterStart(1); PA_VBLCounterStart(15); PA_VBLCounterStart(16); cptTirActif=0; cptTirActifEnnemi=0; actionTir=true; } } if(numEtape==8 || numEtape==9 || numEtape==10 || numEtape==11) // sprites en 0 { // troisième étape du jeu if(debutParcours==1) { debutParcours=0; PA_VBLCounterStart(1); // reinitialisation du compteur tabEnnemi0[0].x=tabParcours1Charles[0][0]; tabEnnemi0[0].y=tabParcours1Charles[0][1]; tabEnnemi0[0].nbPV=5; tabEnnemi0[0].numEtape=1; PA_SetSpriteXY(tabEnnemi0[0].numEcran,tabEnnemi0[0].numSprite,tabEnnemi0[0].x,tabEnnemi0[0].y); } // le premier script if(nouveauParcours(tabEnnemi0, 0, 5, tabParcours1Charles, nbEtapes1Charles, 1) && debutParcours!=2) { numEtape++; debutParcours=2; } } if(numEtape==8 || numEtape==9 || numEtape==10 || numEtape==11) // sprites en -1 { // troisième étape du jeu if(debutParcours2==1) { debutParcours2=0; PA_VBLCounterStart(2); // reinitialisation du compteur tabEnnemi[6].x=tabParcours3Charles[0][0]; tabEnnemi[6].y=tabParcours3Charles[0][1]; tabEnnemi[6].nbPV=5; tabEnnemi[6].numEtape=1; PA_SetSpriteXY(tabEnnemi[6].numEcran,tabEnnemi[6].numSprite,tabEnnemi[6].x,tabEnnemi[6].y); } // le premier script if(nouveauParcours(tabEnnemi, 6, 5, tabParcours3Charles, nbEtapes3Charles, 2) && debutParcours2!=2) { numEtape++; debutParcours2=2; } } if(numEtape==8 || numEtape==9 || numEtape==10 || numEtape==11) // sprites en 0 { // troisième étape du jeu if(debutParcours3==1) { debutParcours3=0; PA_VBLCounterStart(1); // reinitialisation du compteur tabEnnemi0[6].x=tabParcours2Charles[0][0]; tabEnnemi0[6].y=tabParcours2Charles[0][1]; tabEnnemi0[6].nbPV=5; tabEnnemi0[6].numEtape=1; PA_SetSpriteXY(tabEnnemi0[6].numEcran,tabEnnemi0[6].numSprite,tabEnnemi0[6].x,tabEnnemi0[6].y); } // le premier script if(nouveauParcours(tabEnnemi0, 6, 5, tabParcours2Charles, nbEtapes2Charles, 1) && debutParcours3!=2) { numEtape++; debutParcours3=2; } } if(numEtape==8 || numEtape==9 || numEtape==10 || numEtape==11) // sprites en -1 { // troisième étape du jeu if(debutParcours4==1) { debutParcours4=0; PA_VBLCounterStart(2); // reinitialisation du compteur tabEnnemi[12].x=tabParcours4Charles[0][0]; tabEnnemi[12].y=tabParcours4Charles[0][1]; tabEnnemi[12].nbPV=5; tabEnnemi[12].numEtape=1; PA_SetSpriteXY(tabEnnemi[12].numEcran,tabEnnemi[12].numSprite,tabEnnemi[12].x,tabEnnemi[12].y); } // le premier script if(nouveauParcours(tabEnnemi, 12, 5, tabParcours4Charles, nbEtapes4Charles, 2) && debutParcours4!=2) { numEtape++; debutParcours4=2; } } if(actionTir && (numEtape==8 || numEtape==9 || numEtape==10 || numEtape==11) && cptTirActifEnnemi==(PA_VBLCounter[15]/60)) { // troisième étape du jeu int spritealeatoire = PA_RandMinMax(0,5), spritealeatoire2 = PA_RandMinMax(6,11), spritealeatoire3 = PA_RandMinMax(6,11), spritealeatoire4 = PA_RandMinMax(12,17); int ylanceur=tabEnnemi0[spritealeatoire].y+15, ylanceur2=tabEnnemi[spritealeatoire2].y+15, ylanceur3=tabEnnemi0[spritealeatoire3].y+15, ylanceur4=tabEnnemi[spritealeatoire4].y+15; if(tabEnnemi0[spritealeatoire].numEcran==0) { ylanceur+=200; } if(tabEnnemi[spritealeatoire2].numEcran==0) { ylanceur2+=200; } if(tabEnnemi0[spritealeatoire3].numEcran==0) { ylanceur3+=200; } if(tabEnnemi[spritealeatoire4].numEcran==0) { ylanceur4+=200; } nouveauTir(tabTir,10,2,tabEnnemi0[spritealeatoire].x+5,ylanceur); nouveauTir(tabTir,10,2,tabEnnemi[spritealeatoire2].x+5,ylanceur2); nouveauTir(&tabTir[15],10,2,tabEnnemi0[spritealeatoire3].x+5,ylanceur3); nouveauTir(&tabTir[15],10,2,tabEnnemi[spritealeatoire4].x+5,ylanceur4); cptTirActifEnnemi++; } if(numEtape==12) { if(debutParcours==2 && debutParcours2==2 && debutParcours3==2 && debutParcours4==2) // bricolage { PA_VBLCounterStart(1); // reinitialisation du compteur d'étapes debutParcours=0; PA_OutputText(0,0,10,"NIVEAU 3 TERMINE !!!"); } if((PA_VBLCounter[1]/60)==3) { PA_ClearTextBg(0); numEtape++; PA_VBLCounterStart(1); debutParcours=1; debutParcours2=1; PA_VBLCounterStart(1); PA_VBLCounterStart(15); PA_VBLCounterStart(16); cptTirActif=0; cptTirActifEnnemi=0; actionTir=true; } } if(numEtape==13 || numEtape==14) // Crab { // quatrième étape du jeu if(debutParcours==1) { debutParcours=0; PA_VBLCounterStart(1); // reinitialisation du compteur tabEnnemi[0].x=tabParcours9Charles[0][0]; tabEnnemi[0].y=tabParcours9Charles[0][1]; tabEnnemi[0].nbPV=5; tabEnnemi[0].numEtape=1; PA_SetSpriteXY(tabEnnemi[0].numEcran,tabEnnemi[0].numSprite,tabEnnemi[0].x,tabEnnemi[0].y); } // le premier script if(nouveauParcours(tabEnnemi, 0, 6, tabParcours9Charles, nbEtapes9Charles, 1) && debutParcours!=2) { numEtape++; debutParcours=2; } } if(numEtape==13 || numEtape==14) // Octopus { // quatrième étape du jeu if(debutParcours2==1) { debutParcours2=0; PA_VBLCounterStart(2); // reinitialisation du compteur tabEnnemi[6].x=tabParcours10Charles[0][0]; tabEnnemi[6].y=tabParcours10Charles[0][1]; tabEnnemi[6].nbPV=5; tabEnnemi[6].numEtape=1; PA_SetSpriteXY(tabEnnemi[6].numEcran,tabEnnemi[6].numSprite,tabEnnemi[6].x,tabEnnemi[6].y); } // le premier script if(nouveauParcours(tabEnnemi, 6, 6, tabParcours10Charles, nbEtapes10Charles, 2) && debutParcours2!=2) { numEtape++; debutParcours2=2; } } if(actionTir && (numEtape==13 || numEtape==14) && cptTirActifEnnemi==(PA_VBLCounter[15]/60)) { // quatrième étape du jeu int spritealeatoire = PA_RandMinMax(0,6), spritealeatoire2 = PA_RandMinMax(6,12); int ylanceur=tabEnnemi[spritealeatoire].y+15, ylanceur2=tabEnnemi[spritealeatoire2].y+15; if(tabEnnemi[spritealeatoire].numEcran==0) { ylanceur+=200; } if(tabEnnemi[spritealeatoire].numEcran==0) { ylanceur2+=200; } nouveauTir(tabTir,10,2,tabEnnemi[spritealeatoire].x+5,ylanceur); nouveauTir(&tabTir[15],10,2,tabEnnemi[spritealeatoire2].x+5,ylanceur2); cptTirActifEnnemi++; } if(numEtape==numEtapeBoss1-1) // BOSS { // cinquième étape du jeu if(debutParcours==2 && debutParcours2==2) // bricolage { PA_VBLCounterStart(1); // reinitialisation du compteur d'étapes debutParcours=0; PA_OutputText(0,0,10,"NIVEAU 4 TERMINE !!!"); } if((PA_VBLCounter[1]/60)==3) { PA_ClearTextBg(0); numEtape++; debutParcours=1; debutParcours2=1; debutParcours3=1; debutParcours4=1; PA_VBLCounterStart(1); PA_VBLCounterStart(15); PA_VBLCounterStart(16); cptTirActif=0; cptTirActifEnnemi=0; actionTir=true; boss.sprite1.nbPV=90; boss.sprite2.nbPV=90; boss.sprite3.nbPV=90; boss.sprite4.nbPV=90; preparationBoss(tabTir); /*for(i=51;i<62;i++)// destruction de tout les ennemis du bas { PA_DeleteSprite(0,i); } for(i=63;i<80;i++)// destruction de tout les ennemis en haut { PA_DualDeleteSprite(i); } // CREATION DES TIRS DU BOSS PA_DualCreateSprite(tabTir[30].coordonnees.numSprite,(void*)miniTir_Sprite,OBJ_SIZE_8X8,1,2,tabTir[30].coordonnees.x,tabTir[30].coordonnees.y); spriteReference=tabTir[30].coordonnees.numSprite; PA_DualSetSpriteXY(tabTir[30].coordonnees.numSprite,tabTir[30].coordonnees.x,tabTir[30].coordonnees.y); for(i=31;i<40;i++) { PA_DualCloneSprite((tabTir[i].coordonnees.numSprite),spriteReference); PA_DualSetSpriteXY(tabTir[i].coordonnees.numSprite,tabTir[i].coordonnees.x,tabTir[i].coordonnees.y); } PA_DualCreateSprite(tabTir[40].coordonnees.numSprite,(void*)tir_Sprite,OBJ_SIZE_16X16,1,2,tabTir[40].coordonnees.x,tabTir[40].coordonnees.y); spriteReference=tabTir[40].coordonnees.numSprite; PA_DualSetSpriteXY(tabTir[40].coordonnees.numSprite,tabTir[40].coordonnees.x,tabTir[40].coordonnees.y); for(i=41;i<50;i++) { PA_DualCloneSprite((tabTir[i].coordonnees.numSprite),spriteReference); PA_DualSetSpriteXY(tabTir[i].coordonnees.numSprite,tabTir[i].coordonnees.x,tabTir[i].coordonnees.y); } PA_DualCreateSprite(tabTir[50].coordonnees.numSprite,(void*)salveTir_Sprite,OBJ_SIZE_16X16,1,2,tabTir[50].coordonnees.x,tabTir[50].coordonnees.y); spriteReference=tabTir[50].coordonnees.numSprite; PA_DualSetSpriteXY(tabTir[50].coordonnees.numSprite,tabTir[50].coordonnees.x,tabTir[50].coordonnees.y); for(i=51;i<numTirMax;i++) { PA_DualCloneSprite((tabTir[i].coordonnees.numSprite),spriteReference); PA_DualSetSpriteXY(tabTir[i].coordonnees.numSprite,tabTir[i].coordonnees.x,tabTir[i].coordonnees.y); } */ } } if(numEtape==numEtapeBoss1) { // cinquième étape du jeu if(debutParcours2==1) { // les premiers paternes (déplacements) switch(PA_VBLCounter[1]/60)// permet un affichage plus propre de la vie du joueur { // ici debutParcours indique la direction à prendre case 0 : debutParcours=6;vitesseBoss=1;break; case 2 : debutParcours=6;vitesseBoss=1;break; case 4 : debutParcours=1;vitesseBoss=1;break; case 6 : debutParcours=3;vitesseBoss=1;break; case 7 : debutParcours=5;vitesseBoss=1;break; case 10 : debutParcours=8;vitesseBoss=2;break; case 11 : debutParcours=5;vitesseBoss=1;break; case 12 : debutParcours=5;vitesseBoss=1;break; case 15 : debutParcours=6;vitesseBoss=1;break; case 17 : debutParcours=7;vitesseBoss=1;break; case 19 : debutParcours=1;vitesseBoss=1;break; case 21 : debutParcours=6;vitesseBoss=1;break; case 23 : debutParcours=5;vitesseBoss=1;actionTir=2;break; case 28 : debutParcours=5;actionTir=1;break; case 30 : debutParcours2++;PA_VBLCounterStart(1);break;// 6-60 == 6 secondes. On boucle sur le parcours default: break; } } else { // paternes qui se répétent switch(PA_VBLCounter[1]/60)// permet un affichage plus propre de la vie du joueur { // ici debutParcours indique la direction à prendre case 0 : debutParcours=1;vitesseBoss=1;break; case 1 : debutParcours=8;vitesseBoss=1;break; case 2 : debutParcours=3;vitesseBoss=2;break; case 3 : debutParcours=8;vitesseBoss=1;break; case 4 : debutParcours=5;vitesseBoss=1;break; case 7 : debutParcours=7;vitesseBoss=2;actionTir=2;break; case 8 : debutParcours=1;vitesseBoss=1;actionTir=1;break; case 9 : debutParcours=5;vitesseBoss=1;break; case 12 : debutParcours=3;vitesseBoss=1;break; case 13 : debutParcours=6;vitesseBoss=1;break; case 14 : debutParcours=5;vitesseBoss=1;break; case 18 : debutParcours=6;vitesseBoss=1;break; case 20 : debutParcours=7;vitesseBoss=1;actionTir=2;break; case 22 : debutParcours=1;vitesseBoss=1;actionTir=1;break; case 24 : debutParcours=6;actionTir=1;break; case 26 : debutParcours=8;actionTir=1;actionTir=2;break; case 27 : debutParcours=5;actionTir=1;actionTir=1;break; case 30 : PA_VBLCounterStart(1);debutParcours2++; break; default: break; } } //* if(debutParcours!=5) { deplacementBoss(&boss,debutParcours,vitesseBoss); } if(boss.sprite1.nbPV<=0 && boss.sprite2.nbPV<=0 && boss.sprite3.nbPV<=0 && boss.sprite4.nbPV<=0) { numEtape++;//il est mort debutParcours=2; } } if(actionTir && numEtape==numEtapeBoss1 && cptTirActifEnnemi==(PA_VBLCounter[15]/15)) { // cinquième étape du jeu int X=boss.sprite1.x, Y=boss.sprite1.y; int lanceurX1=X+boss.origineTir1[0], lanceurY1=Y+boss.origineTir1[1], lanceurX2=X+boss.origineTir2[0], lanceurY2=Y+boss.origineTir2[1], lanceurX3=X+boss.origineTir3[0], lanceurY3=Y+boss.origineTir3[1]; if(actionTir==1 && (cptTirActifEnnemi)%2 == 0)// tirs normaux et moment de les tirer { if(boss.sprite4.nbPV>0){nouveauTir(&tabTir[50],10,2, lanceurX3, lanceurY3);}//celui du milieu // 2 fois moins de grosse boulette if(boss.sprite3.nbPV>0){nouveauTir(&tabTir[30],10,2, lanceurX2, lanceurY2);}//celui à gauche if((cptTirActifEnnemi)%4 == 0){nouveauTir(&tabTir[40],10,2, lanceurX1-15, lanceurY1-15);}//celui à droite } else { if(actionTir==2)// boulettes 2 fois plus souvent { if(boss.sprite4.nbPV>0){nouveauTir(&tabTir[50],10,2, lanceurX3, lanceurY3);}//celui du milieu // 2 fois moins de grosse boulette if(boss.sprite3.nbPV>0){nouveauTir(&tabTir[30],10,2, lanceurX2, lanceurY2);}//celui à gauche if((cptTirActifEnnemi)%2 == 0){nouveauTir(&tabTir[40],10,2, lanceurX1-15, lanceurY1-15);}//celui à droite } } //*/ cptTirActifEnnemi++; } if(numEtape==numEtapeBoss1+1 && debutParcours2==2) { destructionBoss(tabTir); debutParcours=1; } if(numEtape==numEtapeMax)//fin du jeu { if(debutParcours!=0) // bricolage { PA_VBLCounterStart(1); // reinitialisation du compteur d'étapes debutParcours=0; PA_OutputText(0,0,10,"DERNIER NIVEAU TERMINE !!!"); } if((PA_VBLCounter[1]/60)==3) { PA_ClearTextBg(0); numEtape++; PA_VBLCounterStart(1); debutParcours=1; debutParcours2=1; debutParcours3=1; PA_VBLCounterStart(1); PA_VBLCounterStart(15); PA_VBLCounterStart(16); cptTirActif=0; cptTirActifEnnemi=0; actionTir=true; PA_OutputText(1,1,17," END GAME\nMerci d'avoir joué \nSi tu a vu des bugs-problèmes \nMerci de me les parvenir\nMail : [email protected]\nStart -> Quitter"); } } /* DETECTION DES COLLISIONS !!! */ //deplacementSprite(0,100,&(sprite1.x),&(sprite1.y)); if(niveauTir!=0) // si peace, alors juste observation { for(i=0;i<numTir;i++)// pour tout les tirs { if(tabTir[i].tirActif)// si le tir est à l'écran { if(tabTir[i].directionTir==1)// il doit attaquer les ennemis { if(numEtape==numEtapeBoss1)//combat contre boss { if(boss.sprite1.nbPV>0) { detectionCollisionSprite_tir_et_destruction(&(boss.sprite1),&(tabTir[i])); } if(boss.sprite2.nbPV>0) { detectionCollisionSprite_tir_et_destruction(&(boss.sprite2),&(tabTir[i])); } if(boss.sprite3.nbPV>0) { detectionCollisionSprite_tir_et_destruction(&(boss.sprite3),&(tabTir[i])); } if(boss.sprite4.nbPV>0) { detectionCollisionSprite_tir_et_destruction(&(boss.sprite4),&(tabTir[i])); } } else//detection normale { for(cpt=0;cpt<nbEnnemi0;cpt++)// detection pour les ennemis du bas { if(tabEnnemi0[cpt].nbPV>0) { detectionCollisionSprite_tir_et_destruction(&(tabEnnemi0[cpt]),&(tabTir[i])); } } for(cpt=0;cpt<nbEnnemi;cpt++)// et du haut { if(tabEnnemi[cpt].nbPV>0) { detectionCollisionSprite_tir_et_destruction(&(tabEnnemi[cpt]),&(tabTir[i])); } } } } else { if(tabTir[i].directionTir==2 && numEtape!=numEtapeBoss1)// il doit attaquer le Joueur et hors combat contre boss { detectionCollisionSprite_tir_et_destruction(&(Joueur),&(tabTir[i])); } } } } if(numEtape==numEtapeBoss1)// si combat contre boss, y'a plein d'autres tirs menaçant pour le joueur ... { int compteurDeTir; for(compteurDeTir=30;compteurDeTir<numTirMax;compteurDeTir++) { detectionCollisionSprite_tir_et_destruction(&(Joueur),&(tabTir[compteurDeTir])); } } } //*/ switch(propreteAffichageTir)// permet un affichage plus propre de la vie du joueur { case 0 : if(Joueur.nbPV<=1000){propreteAffichageTir++;PA_ClearTextBg(1);}break; case 1 : if(Joueur.nbPV<=100){propreteAffichageTir++;PA_ClearTextBg(1);}break; case 2 : if(Joueur.nbPV<=10){propreteAffichageTir++;PA_ClearTextBg(1);}break; case 3 : if(Joueur.nbPV<=0){propreteAffichageTir++;PA_OutputText(1,0,0,"VIE 0",Joueur.nbPV);}break; case 4 : propreteAffichageTir=0;break; default: break; } PA_OutputText(1,0,0,"VIE %d",Joueur.nbPV); /* DETECTION DES TIRS DU JOUEUR !!! */ //if(PA_CheckLid()) // Checks the lid, and pauses if closed... Returns 1 when it unpauses // PA_WaitForVBL(); if(niveauTir==0) { PA_OutputText(0,27,23,"peace"); } // verification des tirs pour les miniTirs if(actionTir && niveauTir==1 && Pad.Newpress.A && (PA_VBLCounter[16]/15)>=cptTirActif) // PA_VBLCounter[1]/30 = toutes les 1/2 secondes { nouveauTir(tabTir,10,1,Joueur.x+10,Joueur.y+200);//un tir a été tiré, +200 car joueur est dans écran du bas cptTirActif++; PA_OutputText(0,31,23,"*"); if(cptTirActif<(PA_VBLCounter[16]/30)) { cptTirActif=0; PA_VBLCounterStart(16); } } // verification des tirs pour les salveTirs if(actionTir && niveauTir==2 && Pad.Newpress.A && (PA_VBLCounter[16]/60)>=cptTirActif)// toutes les secondes { nouveauTir(&(tabTir[15]),10,1,Joueur.x+10,Joueur.y+200);//un tir a été tiré, +200 car joueur est dans écran du bas cptTirActif++; PA_OutputText(0,30,23,"**"); if(cptTirActif<(PA_VBLCounter[16]/60)) { cptTirActif=0; PA_VBLCounterStart(16); } } if(Pad.Newpress.B) { PA_ClearTextBg(0); // pour réinitialisé les indications de tirs PA_ClearTextBg(1); niveauTir++; PA_VBLCounterStart(16); // reinitialisation cptTirActif=1; if(niveauTir==3) { niveauTir=0; } // maximim atteint, on reprends de 0 } /* DEPLACEMENT DE TOUT LES TIRS !!! */ // verification des tirActif de tout les tirs for(i=0;i<numTir;i++) { deplacementTir(&tabTir[i]); } if(numEtape==numEtapeBoss1) { for(i=30;i<numTirMax;i++) { deplacementTir(&tabTir[i]); } } /* DEPLACEMENT DU JOUEUR !!! */ if(Joueur.nbPV>0) { // deplacement du vaisseau grâce au stylet //deplacementSpriteStylet (Joueur.numEcran,Joueur.numSprite,&Joueur.x,&Joueur.y); // ou des touches gauches et droite de la DS deplacementSpritePad (Joueur.numEcran,Joueur.numSprite,&Joueur.x,&Joueur.y); } /* SORTIE DU JEU !!! */ // appuie de Start pour confirmer la fin du jeu if(Pad.Newpress.Start || Joueur.nbPV<=0) { PA_ClearTextBg(1); PA_ClearTextBg(0); int compteur0=PA_VBLCounter[0], compteur1=PA_VBLCounter[1], compteur2=PA_VBLCounter[2], compteur3=PA_VBLCounter[3], compteur10=PA_VBLCounter[10]; PA_StopMod(); // neccessaire pour quitter le jeu : // verif = verifie si un choix a été effectué bool verif=false; PA_OutputText(1,2,20,"Appuyez sur A pour continuer\n B pour quitter le jeu\n X pour les options"); if(Joueur.nbPV<=0) { for(i=0;i<60;i++) { PA_WaitForVBL(); } } while(!verif) { PA_WaitForVBL(); // A pour quitter if(Pad.Newpress.B) { PA_ClearTextBg(1); sortir=true; verif=true; } // B pour quitter if(Pad.Newpress.A) { PA_ClearTextBg(1); verif=true; } if(Pad.Newpress.X) { PA_ClearTextBg(1); while(!verif) { PA_OutputText(1,2,20,"Appuyez sur GAUCHE ou DROITE\n A pour sortir des options"); if(Pad.Newpress.Left) // changement { PA_ClearTextBg(1); if((numMusique-1)>=0) { numMusique--; } } if(Pad.Newpress.Right) { PA_ClearTextBg(1); if((numMusique+1)<=numMusiqueMax) { numMusique++; } else { PA_OutputText(1,2,17,"Musique Max atteinte !"); } } if(Pad.Newpress.A) // on sort { PA_ClearTextBg(1); verif=true; } if(numMusique>=0 && numMusique<=numMusiqueMax) { PA_OutputText(1,2,18,"Musique : %s", tabMusique[numMusique]); } PA_WaitForVBL(); } PA_ClearTextBg(1); PA_OutputText(1,2,20,"Appuyez sur A pour continuer\n B pour quitter le jeu\n X pour les options"); verif=false; } } if(Joueur.nbPV<=0 && !sortir) // nouvelle partie { // mise à jour du Joueur Joueur.x=100; Joueur.y=160; Joueur.nbPV=50; Joueur.numEtape=0; Joueur.temps=0; PA_SetSpriteXY(Joueur.numEcran,Joueur.numSprite,Joueur.x,Joueur.y); // mise à jour des tirs PA_ClearTextBg(0); // pour réinitialisé les indications de tirs PA_ClearTextBg(1); } // le cheat code est remis à 0 //cheatCode=0; if(!sortir) // MUSIQUES { switch(numMusique) { case 1 : PA_PlayMod(phoenixIngame);break; case 2 : PA_PlayMod(lotus);break; default : numMusique=0; } } // compteur remis par défaut PA_VBLCounter[0]=compteur0; PA_VBLCounter[1]=compteur1; PA_VBLCounter[2]=compteur2; PA_VBLCounter[3]=compteur3; PA_VBLCounter[10]=compteur10; PA_VBLCounterStart(16);cptTirActifEnnemi=1;// pour les tirs des ennemis PA_VBLCounterStart(15);cptTirActif=0; // pour les tirs du Joueur } PA_WaitForVBL(); } // fin du while(!sortir) // suppression des sprites utilisés pour le jeu PA_DeleteSprite(0,1); for(i=0;i<128;i++) { PA_DeleteSprite(0,i); PA_DeleteSprite(1,i); PA_DualDeleteSprite(i); if(i%10==0)PA_WaitForVBL(); } //sans ces WaitForVBL, on a un bug d'algo for(i=0;i<10;i++) { PA_WaitForVBL(); } PA_StopMod();// fin de la musique //PA_OutputText(1,2,18,"Ce jeu vidéo est fini !!", tabMusique[numMusique]); //PA_OutputText(1,0,19,"Veuillez eteindre votre console et reprendre une activité normale ...", tabMusique[numMusique]); }