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
Star Shooter
en image
en vidéo
Sprites utilisé dans le programme
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;
}