Accueil > Linux / Logiciels Libres > Logiciels Libres > Développement NDS avec PALIB

Développement NDS avec PALIB

samedi 8 octobre 2011, par Yann

 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;
}

Portfolio