Homework – Shooting game
1. Player move by keyboard 8 directions.
2. Player have 2 type missile can change between play game.
3. Game have enemy draw with transformation image and moving to player in up, down, left or right direction.
4. Score over 10 player meet BOSS.
5. Kill boss game is over and show you win.
NOTE: Game have Transformation Image,
Layer and Fade Screen.
รูปทั้งหมดที่ใช้ในเกมส์
ส่วนของโค๊ตที่ใช้ควบคุ่ม
#include
// ------------------------------------------------------------------
// CDX Objects
// ------------------------------------------------------------------
CDXScreen *Screen = 0; // The screen object, every program must have one
CDXInput *Input = 0;
CDXSprite *Bg1 = 0;
CDXSprite *Bg2 = 0;
FPSmanager *Fps = 0;
POINT bg1={0,0};
POINT bg2={512,0};
class Rtype
Rtype ship;
class Missile:public Rtype
{
public:
typedef struct
{
CDXSprite *missile;
POINT pos, di, vel;
int width,height;
int xfix,yfix;
int damage;
bool active;
}miss_info;
irr::core::array
bool AddMis( char* name, const POINT& pos, const POINT& di, const POINT& vel,const int& damage )
{
miss_info* minfo = new miss_info( );
minfo->missile = new CDXSprite( );
minfo->missile->Create( name, 0 );
minfo->pos.x = pos.x;
minfo->pos.y = pos.y;
minfo->di = di;
minfo->vel = vel;
minfo->damage = damage;
minfo->active = true;
mlist.push_back( minfo );
return true;
}
bool AddMis( char* name,const int& width,const int& height, const POINT& pos, const POINT& di, const POINT& vel,const int& damage )
{
miss_info* minfo = new miss_info( );
minfo->missile = new CDXSprite( );
minfo->missile->Create( name,width,height, 0 );
minfo->pos.x = pos.x;
minfo->pos.y = pos.y;
minfo->di = di;
minfo->vel = vel;
minfo->damage = damage;
minfo->active = true;
mlist.push_back( minfo );
return true;
}
bool AddMis( char* name,const int& width,const int& height,const int& xfix,const int& yfix, const POINT& pos, const POINT& di, const POINT& vel,const int& damage )
{
miss_info* minfo = new miss_info( );
minfo->missile = new CDXSprite( );
minfo->missile->Create( name,width,height, 0 );
minfo->pos.x = pos.x+xfix;
minfo->pos.y = pos.y+yfix;
minfo->di = di;
minfo->vel = vel;
minfo->damage = damage;
minfo->active = true;
mlist.push_back( minfo );
return true;
}
void UpdateMis(void)
{
for( irr::u32 i = 0; i != mlist.size(); i++ )
{
if(mlist[i]->active)
{
mlist[i]->pos.x += mlist[i]->di.x * mlist[i]->vel.x;
mlist[i]->pos.y += mlist[i]->di.y * mlist[i]->vel.y;
mlist[i]->missile->SetPos( mlist[i]->pos.x, mlist[i]->pos.y );
mlist[i]->missile->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );
}
}
}
void RemoveMis(void)
{
for( irr::u32 i = 0; i != mlist.size(); ++i )
{
if( mlist[i]->pos.x <>pos.x > 480 ||
mlist[i]->pos.y <>pos.y > 272 ||
mlist[i]->active==false)
{
SAFEDELETE( mlist[i]->missile );
SAFEDELETE( mlist[i] );
mlist.erase( i );
--i;
}
}
}
void deinit(void)
{
for( irr::u32 i = 0; i != mlist.size(); ++i )
{
SAFEDELETE( mlist[i]->missile );
SAFEDELETE( mlist[i] );
mlist.erase( i );
--i;
}
}
};
Missile Miss;
class Shoot:public Missile
{
public:
int select;
int de;
int damage;
void fire(POINT pos)
{
if(Input->GetKeyState(SDLK_SPACE))
{
delay();
if(de==0)
shoot1(pos);
}
if(Input->GetKeyState(SDLK_LALT))
{
charge++;
}
if(Input->GetKeyState(SDLK_LALT)==CDXKEY_RELEASE)
{
if(charge>20)
shootc(pos);
charge=0;
}
}
void shoot1(POINT pos)
{
POINT di={1,0};
POINT vel={10,0};
AddMis("Shoot.png",40,17,40,15,pos,di,vel,2);
}
void shootc(POINT pos)
{
POINT di={1,0};
POINT vel={15,0};
AddMis("ChargeShot.png",128,64,0,-15,pos,di,vel,5);
}
public:
int charge;
void delay(void)
{
de++;
if(de>7)
de=0;
}
};
Shoot shoot;
class Monster:public Missile
{
public:
int w1count;
int det;
typedef struct
{
CDXSprite *monster;
POINT pos, di, vel;
int width,height;
int xfix,yfix;
bool active;
int health;
}mon_info;
irr::core::array
bool AddMon( char* name, const POINT& pos, const POINT& di, const POINT& vel,const int& health )
{
mon_info* moninfo = new mon_info( );
moninfo->monster = new CDXSprite( );
moninfo->monster->Create( name, 0 );
moninfo->pos.x = pos.x;
moninfo->pos.y = pos.y;
moninfo->di = di;
moninfo->vel = vel;
moninfo->active = true;
moninfo->health = health;
monlist.push_back( moninfo );
return true;
}
bool AddMon( char* name,const int& width,const int& height, const POINT& pos, const POINT& di, const POINT& vel )
{
mon_info* moninfo = new mon_info( );
moninfo->monster = new CDXSprite( );
moninfo->monster->Create( name,width,height, 0 );
moninfo->pos.x = pos.x;
moninfo->pos.y = pos.y;
moninfo->di = di;
moninfo->vel = vel;
moninfo->active = true;
monlist.push_back( moninfo );
return true;
}
void MUpdateMis(void)
{
for( irr::u32 i = 0; i != monlist.size(); i++ )
{
monlist[i]->pos.x += monlist[i]->di.x * monlist[i]->vel.x;
monlist[i]->pos.y += monlist[i]->di.y * monlist[i]->vel.y;
if(monlist[i]->active)
{
monlist[i]->monster->SetPos( monlist[i]->pos.x, monlist[i]->pos.y );
monlist[i]->monster->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );
}
}
}
void MRemoveMis(void)
{
for( irr::u32 i = 0; i != monlist.size(); ++i )
{
if( monlist[i]->pos.x <>pos.x > 480 ||
monlist[i]->pos.y <>pos.y > 272 ||
monlist[i]->active==false)
{
SAFEDELETE( monlist[i]->monster );
SAFEDELETE( monlist[i] );
monlist.erase( i );
--i;
}
}
}
void Mdeinit(void)
{
for( irr::u32 i = 0; i != monlist.size(); ++i )
{
SAFEDELETE( monlist[i]->monster );
SAFEDELETE( monlist[i] );
monlist.erase( i );
--i;
}
}
void wave1(void)
{
delay();
POINT pos={480,200};
POINT di={-1,0};
POINT vel={5,0};
if(dem==0)
{
w1count++;
if(w1count>10)
pos.y-=100;
if(w1count>20)
{
pos.y-=100;
di.y+=1;
vel.y+=5;
}
if(w1count>30)
{
pos.y+=250;
di.y-=2;
vel.y+=5;
}
if(w1count<40) pos="{480,30};" di="{-1,0};" vel="{4,0};">50&&bossv==0)
{
bossv=1;
AddMon("boss.png",pos,di,vel,20);
}
}
private:
int bossv;
int dem;
void delay(void)
{
dem++;
if(dem>10)
dem=0;
}
};
Monster mon;
class Effect
{
public:
CDXSprite *Charge;
int frame,bframe;
Effect()
{
Charge = new CDXSprite();
Charge->Create("Charge.png",30,35,0);
}
typedef struct
{
CDXSprite *eff;
POINT pos, di, vel;
int width,height;
int xfix,yfix;
bool active;
}FX_info;
irr::core::array
bool AddFX( char* name, const POINT& pos)
{
FX_info* effinfo = new FX_info( );
effinfo->eff = new CDXSprite( );
effinfo->eff->Create( name, 0 );
effinfo->pos.x = pos.x;
effinfo->pos.y = pos.y;
effinfo->active = true;
efflist.push_back( effinfo );
return true;
}
bool AddFX( char* name, const POINT& pos, const POINT& di, const POINT& vel )
{
FX_info* effinfo = new FX_info( );
effinfo->eff = new CDXSprite( );
effinfo->eff->Create( name, 0 );
effinfo->pos.x = pos.x;
effinfo->pos.y = pos.y;
effinfo->di = di;
effinfo->vel = vel;
effinfo->active = true;
efflist.push_back( effinfo );
return true;
}
bool AddFX( char* name,const int& width,const int& height, const POINT& pos, const POINT& di, const POINT& vel )
{
FX_info* effinfo = new FX_info( );
effinfo->eff = new CDXSprite( );
effinfo->eff->Create( name,width,height, 0 );
effinfo->pos.x = pos.x;
effinfo->pos.y = pos.y;
effinfo->di = di;
effinfo->vel = vel;
effinfo->active = true;
efflist.push_back( effinfo );
return true;
}
bool AddFX( char* name,const int& width,const int& height,const int& xfix,const int& yfix, const POINT& pos, const POINT& di, const POINT& vel )
{
FX_info* effinfo = new FX_info( );
effinfo->eff = new CDXSprite( );
effinfo->eff->Create( name,width,height, 0 );
effinfo->pos.x = pos.x+xfix;
effinfo->pos.y = pos.y+yfix;
effinfo->di = di;
effinfo->vel = vel;
effinfo->active = true;
efflist.push_back( effinfo );
return true;
}
void UpdateMis(void)
{
for( irr::u32 i = 0; i != efflist.size(); i++ )
{
if(efflist[i]->active)
{
efflist[i]->pos.x += efflist[i]->di.x * efflist[i]->vel.x;
efflist[i]->pos.y += efflist[i]->di.y * efflist[i]->vel.y;
bframe++;
efflist[i]->eff->SetPos( efflist[i]->pos.x, efflist[i]->pos.y );
efflist[i]->eff->SetFrame(bframe);
efflist[i]->eff->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );
}
}
}
void RemoveMis(void)
{
for( irr::u32 i = 0; i != efflist.size(); ++i )
{
if( efflist[i]->pos.x <>pos.x > 480 ||
efflist[i]->pos.y <>pos.y > 272 ||
efflist[i]->active==false ||
bframe>6)
{
SAFEDELETE( efflist[i]->eff );
SAFEDELETE( efflist[i] );
efflist.erase( i );
--i;
}
}
}
void deinit(void)
{
for( irr::u32 i = 0; i != efflist.size(); ++i )
{
SAFEDELETE( efflist[i]->eff );
SAFEDELETE( efflist[i] );
efflist.erase( i );
--i;
}
}
void Fdeinit(void)
{
SAFEDELETE( Charge );
}
void charge(int posx,int posy)
{
if(Input->GetKeyState(SDLK_SPACE))
{
drawcharge(posx,posy);
animate(0,7);
}
}
private:
void drawcharge(int posx,int posy)
{
Charge->SetFrame(frame);
Charge->SetPos(posx+40,posy+5);
Charge->Draw(Screen->GetBack(),0,0,CDXBLT_TRANS );
}
void animate(int s,int e)
{
frame++;
if(frame>e)
frame=s;
}
};
Effect fx;
class Crash
{
public:
void crashwave1(void)
{
for(irr::u32 i=0;i != shoot.mlist.size();i++)
{
for(irr::u32 j=0;j != mon.monlist.size();j++)
{
if(shoot.mlist[i]->missile->SpriteHit(mon.monlist[j]->monster))
{
mon.monlist[j]->health-=shoot.mlist[i]->damage;
if(shoot.mlist[i]->damage<5)>active=false;
if(mon.monlist[j]->health<0)>active=false;
}
POINT di={1,0};
POINT vel={1,0};
fx.bframe=0;
if(mon.monlist[j]->health<0)>pos,di,vel);
}
}
}
}
};
Crash hit;
void Bgmove(void)
{
bg1.x-=3;
bg2.x-=3;
if(bg1.x<-511) bg1.x=511; if(bg2.x<-511) bg2.x=509; } // ------------------------------------------------------------------ // cdx_Init - handles initialization of the CDX objects // ------------------------------------------------------------------ BOOL cdx_Init() { Screen = new CDXScreen(); Screen->Create( );
Screen->CreateWindowed( 480, 272, 32, SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_INIT_TIMER );
Input = new CDXInput( );
Input->Create( );
Fps = new FPSmanager( );
SDL_initFramerate( Fps );
SDL_setFramerate( Fps, 30 );
// TODO: Initialize your own CDX objects here
Bg1 = new CDXSprite();
Bg2 = new CDXSprite();
Bg1->Create("bg1.png",0);
Bg2->Create("bg1.png",0);
return TRUE;
}
// ------------------------------------------------------------------
// cdx_DeInit - handles cleanup of CDX objects
// ------------------------------------------------------------------
void cdx_DeInit( void )
{
// TODO: Destroy your CDX objects here
fx.deinit();
mon.Mdeinit();
Miss.deinit();
fx.Fdeinit();
ship.deinit();
SAFEDELETE( Fps );
SAFEDELETE( Bg2 );
SAFEDELETE( Bg1 );
SAFEDELETE( Input );
SAFEDELETE( Screen );
}
// ------------------------------------------------------------------
// cdx_DoFrame - performs drawing of the current frame
// ------------------------------------------------------------------
void cdx_DoFrame()
{
Input->Update( );
Screen->GetBackEx()->Fill(0);
// TODO: Add code to draw your objects during each frame
TextXY( Screen->GetBack(), 150, 20, 233, 227, 66, 255, "test");
//background
Bgmove();
Bg1->SetPos(bg1.x,bg1.y);
Bg2->SetPos(bg2.x,bg2.y);
Bg1->Draw(Screen->GetBack(),0,0,CDXBLT_TRANS);
Bg2->Draw(Screen->GetBack(),0,0,CDXBLT_TRANS);
//background
//rtype
ship.animateRE();
ship.animate();
ship.ctrl_movement();
ship.Scrblk();
ship.draw();
//rtype
//shoot
shoot.fire(ship.Rpos);
//shoot
//FX
fx.charge(ship.Rpos.x,ship.Rpos.y);
//FX
//monster
mon.wave1();
mon.boss();
//monster
//hitcheck
hit.crashwave1();
//hitcheck
//update
shoot.UpdateMis();
fx.UpdateMis();
mon.MUpdateMis();
mon.MRemoveMis();
fx.RemoveMis();
shoot.RemoveMis();
//update
Screen->Flip( 0, 0, 1 );
SDL_framerateDelay( Fps );
}
int main( int argc, char* args[] )
{
#ifdef _PSP
#ifndef NDEBUG
pspDebugScreenInit( );
#endif
SetupCallbacks( );
#endif
cdx_Init();
while(1)
{
#ifdef WIN32
if( Input->GetKeyState(SDLK_ESCAPE) )
break;
#endif
cdx_DoFrame();
}
cdx_DeInit();
return 0;
}
ตอนยิน กระสุน แบบที่ 1
บอสครับ