Accueil > Linux / Logiciels Libres > Logiciels Libres > Développement NDS avec PALIB
Développement NDS avec PALIB
samedi 8 octobre 2011, par
Projet Starshooter
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;
}