Développement NDS avec PALIB

samedi 8 octobre 2011
par  Yann
popularité : 19%

Projet Starshooter

Archive du projet complet
Archive zip du programme NDS

Paramètres NDS

Paramètres importants pour la console

Star Shooter

en image

Star Shooter

en vidéo

Sprites utilisé dans le programme

Arrière plan
Sprite animé d’une explosion
Sprite Tie 1
Sprite Tie 2
Sprite Tie 3
Sprite X-wing complet avec animation propulsion
Sprite laser jaune

Code source de l’application

#include < PA9.h >

// PAGfxConverter Include
//#include "../gfx/all_gfx.c"
#include "../gfx/all_gfx.h"

#include <PA_BgStruct.h> //necessaire pour le scrollBG

//Just be sure the Makefile for your project has ARM7_MAXMOD_DSWIFI
//as the selected ARM7 binary.
#include <maxmod9.h> // Maxmod include

// Include the soundbank created by the ARM7_MAXMOD_DSWIFI directive in Makefile
#include "soundbank_bin.h"
#include "soundbank.h"

//globals
s32 x = 127-32;    s32 y = 383-32; // sprite position...
s32 speed = 2;
s32 gunspeed = 4;
int Sprites[256];
/*
typedef struct{
        int x,y;
        int width, height;
        int palette;
        int active;
        int type; //sprite type : 0 x-wing, 1 2 3 tie,4 explosion,5 yellowlaser, 6 redlaser
} SpriteBlack, SpriteWhite;

SpriteBlack tabSpriteB[128]; //for ennemies
SpriteWhite XWing[10]; //for good guys
*/
// needed for scrollbg (the new structure PAGfx_struct does not work)
const PA_BgStruct BG3Dual = {
        PA_BgNormal,
        256, 256,

        BG3_Tiles,
        BG3_Map,
        {BG3_Pal},

        65536,
        {2048}
};

int main(void){

        PA_Init(); //PAlib inits
        PA_InitVBL();
       
        int lazer_x = 0, lazer_y = 0;
        int i=0;
        //Sound part
        // Initialize Maxmod
        mmInitDefaultMem((mm_addr)soundbank_bin);

        // Load and play the music
        mmLoad(MOD_SPACE);
        mmStart(MOD_SPACE, MM_PLAY_LOOP);
        mmSetModuleVolume( 128 ); //volume : 0->1024 representing 0%->100% volume
       
        // Load the sounds
        // Please note that they are regular .wav
        // files put into the audio folder
        mmLoadEffect(SFX_WLKRSHT2);
        mmLoadEffect(SFX_BLKFOOT4);
        mmEffectVolume( SFX_WLKRSHT2, 255 ); //volume : 0..255 = silent..normal
       
        //Graphic Part
        // Load the dual background...
        PA_DualLoadBackground(3,     //bg number
                             &BG3Dual); //background name (struct name)

        s32 scrollx = 0; // No X scroll by default...
        s32 scrolly = 0; // No Y scroll by default...

        PA_LoadDefaultText(0, 0);  //if text need to be displayed

        // fix the space between screens to 0 -> as one big screen
        PA_SetScreenSpace(0);

        //Dual Version allow to use the two screen as one for Sprites
        //Palette Load
        // Loads x-wing sprite palette as 0
        PA_DualLoadSpritePal(
                        0, // Palette number
                        (void*)xwing_Pal);        // Palette name
        //XWing[0].palette = 0;
                // Creates x-wing sprites as 0 : top level sprite
        PA_DualCreateSprite(
                        0, // Sprite number
                        (void*)xwing_sprite_64_v4_Sprite, // Sprite name
                        OBJ_SIZE_64X64, // Sprite size
                        1, // 256 color mode
                        0, // Sprite palette number
                        20, 20); // X and Y position on the screen
/*
        //tabSprite[0]={20,20,64,64,0,1,0};
        XWing[0].x= 20;
        XWing[0].y= 20;
        XWing[0].width= 64;
        XWing[0].height= 64;
        XWing[0].active = 1;
        XWing[0].type = 1;
*/       
        Sprites[0]=1;

       
        //Loads explosion palette
        PA_DualLoadSpritePal(
                1, // Palette number
                (void*)explosion_Pal);        // Palette name
                       
        // Loads laser sprite palette as 2
        PA_DualLoadSpritePal(
                        2, // Palette number
                        (void*)laseryellow_Pal);        // Palette name
        //Loads tie1 sprite palette
        PA_DualLoadSpritePal(
                        4, // Palette number
                        (void*)tie1_Pal);        // Palette name
        //Loads tie2 sprite palette
        PA_DualLoadSpritePal(
                        5, // Palette number
                        (void*)tie2_Pal);        // Palette name
        //Loads tie3 sprite palette
        PA_DualLoadSpritePal(
                        6, // Palette number
                        (void*)tie3_Pal);        // Palette name
        //Loads explosion palette
        PA_DualLoadSpritePal(
                7, // Palette number
                (void*)explosion_Pal);        // Palette name

        //Loads explosion palette
        PA_DualLoadSpritePal(
                        8, // Palette number
                        (void*)explosion_Pal);        // Palette name
                       
        // Sprite Creation               
        //sprite init (no sprite in tab)
        for (i=0;i++;i<256)
                Sprites[i]=0;
       
        //explosion
        PA_DualCreateSprite(
                                1, // Sprite number
                                (void*)explosion_Sprite, // Sprite name
                                OBJ_SIZE_32X32, // Sprite size
                                1, // 256 color mode
                                1, // Sprite palette number
                                80+16, 20); // X and Y position on the screen                               
        Sprites[1]=1;
                        // One shot at a time
                        //Create Laser sprites
        PA_DualCreateSprite(2, // Sprite number
                        (void*)yellow_Sprite, // Sprite name
                        OBJ_SIZE_8X8, // Sprite size
                        1, // 256 color mode
                        2, // Sprite palette number
                        0, 0); // X and Y position on the screen
        Sprites[2]=1;
                        //PA_DualCloneSprite(2,3);  //does not function
                       
        PA_DualCreateSprite(3, // Sprite number
                        (void*)yellow_Sprite, // Sprite name
                        OBJ_SIZE_8X8, // Sprite size
                        1, // 256 color mode
                        2, // Sprite palette number
                        0, 0); // X and Y position on the screen
        Sprites[3]=1;               
        PA_DualCreateSprite(4, // Sprite number
                        (void*)tie1_64_Sprite, // Sprite name
                        OBJ_SIZE_64X64, // Sprite size
                        1, // 256 color mode
                        4, // Sprite palette number
                        80, 20); // X and Y position on the screen
        Sprites[4]=1;
        PA_DualCreateSprite(5, // Sprite number
                        (void*)tie2_64_Sprite, // Sprite name
                        OBJ_SIZE_64X64, // Sprite size
                        1, // 256 color mode
                        5, // Sprite palette number
                        140, 20); // X and Y position on the screen
        Sprites[5]=1;
        PA_DualCreateSprite(6, // Sprite number
                        (void*)tie3_64_Sprite, // Sprite name
                        OBJ_SIZE_64X64, // Sprite size
                        1, // 256 color mode
                        6, // Sprite palette number
                        200, 20); // X and Y position on the screen
        Sprites[6]=1;
        PA_DualCreateSprite(
                7, // Sprite number
                (void*)explosion_Sprite, // Sprite name
                OBJ_SIZE_32X32, // Sprite size
                1, // 256 color mode
                7, // Sprite palette number
                140+16, 20); // X and Y position on the screen
        Sprites[8]=1;                       
        PA_DualCreateSprite(
                8, // Sprite number
                (void*)explosion_Sprite, // Sprite name
                OBJ_SIZE_32X32, // Sprite size
                1, // 256 color mode
                8, // Sprite palette number
                200+16, 20); // X and Y position on the screen
        Sprites[8]=1;

       
        while(1) // Infinite loops
                {

                // Update the position according to the keypad...
                x += (Pad.Held.Right - Pad.Held.Left) * speed;
                y += (Pad.Held.Down - Pad.Held.Up) * speed;
               
                if(((Pad.Newpress.Up )||(Pad.Newpress.Down)) && (!(Pad.Held.Right || Pad.Held.Left)))
                                PA_DualStartSpriteAnim(0, // sprite number
                                                1, // first frame is 0
                                                3, // last frame is 8, since we have 9 frames...
                                                4); // Speed, set to 8 frames per second
                if(Pad.Newpress.Right)
                        {
                                PA_DualStartSpriteAnim(0, 5, 8, 4);       
                                PA_DualSetSpriteHflip(0, 1); // we only create le left turn, right turn is made with Horizontal Flip
                        }
                if(Pad.Newpress.Left)
                        {
                                PA_DualStartSpriteAnim(0, 5, 8, 4);       
                                PA_DualSetSpriteHflip(0, 0);
                        }
                if(!((Pad.Held.Left)||(Pad.Held.Up)||(Pad.Held.Down)||(Pad.Held.Right)))  
                        PA_DualSetSpriteAnimFrame(0,0); //1st frame, ship without motors
                        //PA_DualSpriteAnimPause(0, 1);

                // bounds testing for x-wing
                if (x < -8)
                        x = -8;
                if (x > (255 - 56)) //screen width - sprite width
                        x = 255 - 56;
                if (y < 0)
                        y = 0;
                if (y > 383 - 48) //screen height - sprite height
                        y = 383 - 48;
                       
                // Set the X-Wing sprite's position
                PA_DualSetSpriteXY(
                                           0, // sprite 0 : x-wing
                                           x, // x position
                                           y); // y...

                //Backgroud Scrolling
                // We'll modify scrollx and scrolly according to the keys pressed
                scrollx -= (Pad.Held.Left - Pad.Held.Right) * 1; // Move 1 pixels per press
//                scrolly -= (Pad.Held.Up - Pad.Held.Down) * 1; // Move 1 pixels per press
                scrolly -= (Pad.Held.Up ) * 1; // Move 1 pixels per press without going backward
                // Scroll the background to scrollx, scrolly...
                PA_DualBGScrollXY(3, // Background number
                                                scrollx, // X scroll
                                                scrolly-=1); // Y scroll Ship is always going forward
                //Create new enemies
                if (Pad.Newpress.B)
                        {
                                if (Sprites[4]==0)
                                        {
                                        PA_DualCreateSprite(4, // Sprite number
                                                (void*)tie1_64_Sprite, // Sprite name
                                                OBJ_SIZE_64X64, // Sprite size
                                                1, // 256 color mode
                                                4, // Sprite palette number
                                                80, 20); // X and Y position on the screen
                                        Sprites[4]=1;
                                        }
                                if (Sprites[5]==0)
                                        {                                       
                                        PA_DualCreateSprite(5, // Sprite number       
                                                (void*)tie2_64_Sprite, // Sprite name
                                                OBJ_SIZE_64X64, // Sprite size
                                                1, // 256 color mode
                                                5, // Sprite palette number
                                                140, 20); // X and Y position on the screen
                                        Sprites[5]=1;
                                        }
                                if (Sprites[6]==0)
                                        {                                       
                                        PA_DualCreateSprite(6, // Sprite number
                                                (void*)tie3_64_Sprite, // Sprite name
                                                OBJ_SIZE_64X64, // Sprite size
                                                1, // 256 color mode
                                                6, // Sprite palette number
                                                200, 20); // X and Y position on the screen
                                        Sprites[6]=1;
                                        }
                        }
                       
               
                if         (lazer_y <= -8)  //gun shot are out of the screen
                        {

                        //Guns management
                        if(Pad.Newpress.A) //if fire is pressed
                                {
                                        //Gun sound
                                        mmEffect(SFX_WLKRSHT2);
                                       
                                        // put the sprites just above the guns :-)       
                                        lazer_x = x + 48;
                                        lazer_y = y + 24;
                                        if (Sprites[2]==0) //need to create gun sprite
                                        {
                                        PA_DualCreateSprite(2, // Sprite number
                                                (void*)yellow_Sprite, // Sprite name
                                                OBJ_SIZE_8X8, // Sprite size
                                                1, // 256 color mode
                                                2, // Sprite palette number
                                                0, 0); // X and Y position on the screen
                                                Sprites[2]=1;
                                        }
                                        if (Sprites[3]==0) //need to create gun sprite
                                        {
                                        PA_DualCreateSprite(3, // Sprite number
                                                (void*)yellow_Sprite, // Sprite name
                                                OBJ_SIZE_8X8, // Sprite size
                                                1, // 256 color mode
                                                2, // Sprite palette number
                                                0, 0); // X and Y position on the screen
                                                Sprites[3]=1;       
                                        }
                                       
                                        PA_DualSetSpriteXY(
                                                           2, // sprite
                                                           lazer_x, // x position
                                                           lazer_y); // y...
                                        PA_DualSetSpriteXY(
                                                           3, // sprite
                                                           lazer_x-40, // x position
                                                           lazer_y); // y...
                                }    
                        }
                else
                        {
                        // Laser move management
                        lazer_y -= gunspeed;
                        if (Sprites[2]==1) //test if gun1 is active (not destroyed)
                        PA_DualSetSpriteXY(
                                2,
                                lazer_x,
                                lazer_y);
                        if (Sprites[3]==1) //test if gun1 is active (not destroyed)
                        PA_DualSetSpriteXY(
                                3,
                                lazer_x-40,
                                lazer_y); //already add gun speed :-)
                       
               
                //colision with fixed obstacle
                //need to manage obstacle liste in a table, and foreach...
                if (Sprites[4]==1)
                        {
                        if (Sprites[2]==1) //test if gun1 is active (not destroyed)
                                if (PA_Distance(lazer_x, lazer_y, 80+32, 20) < 8*8)
                                        {
                                        mmEffect(SFX_BLKFOOT4);
                                        PA_DualStartSpriteAnimEx(1, 0, 7, 8,ANIM_ONESHOT);       
                                        PA_DualDeleteSprite(4);
                                        Sprites[4]=0;
                                        PA_DualDeleteSprite(2);
                                        Sprites[2]=0;
                                        }
                        if (Sprites[3]==1) //test if gun2 is active (not destroyed)       
                                if (PA_Distance(lazer_x-40, lazer_y, 80+32, 20) < 8*8)
                                        {
                                        mmEffect(SFX_BLKFOOT4);
                                        PA_DualStartSpriteAnimEx(1, 0, 7, 8,ANIM_ONESHOT);       
                                        PA_DualDeleteSprite(4);
                                        Sprites[4]=0;
                                        PA_DualDeleteSprite(3);
                                        Sprites[3]=0;
                                }
                        }
                       
                if (Sprites[5]==1)    
                {
                        if (Sprites[2]==1) //test if gun1 is active (not destroyed)
                                if (PA_Distance(lazer_x, lazer_y, 140+32, 20) < 8*8)
                                        {
                                        mmEffect(SFX_BLKFOOT4);
                                        PA_DualStartSpriteAnimEx(7, 0, 7, 8,ANIM_ONESHOT);       
                                        PA_DualDeleteSprite(5);
                                        Sprites[5]=0;
                                        PA_DualDeleteSprite(2);
                                        Sprites[2]=0;
                                        }
                        if (Sprites[3]==1) //test if gun2 is active (not destroyed)       
                                if (PA_Distance(lazer_x-40, lazer_y, 140+32, 20) < 8*8)
                                        {
                                        mmEffect(SFX_BLKFOOT4);
                                        PA_DualStartSpriteAnimEx(7, 0, 7, 8,ANIM_ONESHOT);       
                                        PA_DualDeleteSprite(5);
                                        Sprites[5]=0;
                                        PA_DualDeleteSprite(3);
                                        Sprites[3]=0;
                                }
                }
                if (Sprites[6]==1)  
                {
                        if (Sprites[2]==1) //test if gun1 is active (not destroyed)
                                if (PA_Distance(lazer_x, lazer_y, 200+32, 20) < 8*8)
                                        {
                                        mmEffect(SFX_BLKFOOT4);
                                        PA_DualStartSpriteAnimEx(8, 0, 7, 8,ANIM_ONESHOT);       
                                        PA_DualDeleteSprite(6);
                                        Sprites[6]=0;
                                        PA_DualDeleteSprite(2);
                                        Sprites[2]=0;
                                        }
                        if (Sprites[3]==1) //test if gun2 is active (not destroyed)       
                                if (PA_Distance(lazer_x-40, lazer_y, 200+32, 20) < 8*8)
                                        {
                                        mmEffect(SFX_BLKFOOT4);
                                        PA_DualStartSpriteAnimEx(8, 0, 7, 8,ANIM_ONESHOT);       
                                        PA_DualDeleteSprite(6);
                                        Sprites[6]=0;
                                        PA_DualDeleteSprite(3);
                                        Sprites[3]=0;
                                }
                }
        }
                PA_WaitForVBL();    
        }
return 0;
}

Brèves

25 février 2011 - Scilab : Application GUI

Application GUI dans Scilab : Étude des systèmes automatiques. Systèmes Linéaires

9 janvier 2011 - Modèle 3D dans Scilab

Afficher des patchs dans Scilab à partir de Modèle 3D blender. Modèle 3D dans (...)

2 octobre 2010 - Plugins LDraw pour Blender 2.49

Importez vos modèles LEGO (MLCad et autres) dans blender grâce au plugin d’importation (...)