วันศุกร์ที่ 26 สิงหาคม พ.ศ. 2554
วันศุกร์ที่ 12 สิงหาคม พ.ศ. 2554
การบ้านครั้งที่5 : Samurai Island EP1
code เกมส์
#include <cdx_app_wiz.h>
// ------------------------------------------------------------------
// CDX Objects
// ------------------------------------------------------------------
CDXScreen *Screen = 0; // The screen object, every program must have one
CDXInput *Input = 0;
FPSmanager *Fps = 0;
CDXSprite *bg;
class Animation {
public:
Animation( CDXSprite *unit ) {
this->unit = unit;
}
void duration( unsigned int a = 1, unsigned int b = 2, unsigned int delay = 0, bool loop = true ) {
this->a = a - 1;
this->b = b - 1;
this->delay = delay;
this->loop = loop;
}
unsigned int getLastFrame() {
return this->c_frame+1;
}
void shuffle(unsigned int f) {
this->c_frame = rand() % f;
}
unsigned int play() {
if (!this->loop) {
if (this->c_frame < this->a) {
this->c_frame = this->a;
}
} else {
if (this->c_frame > this->b || this->c_frame < this->a) {
this->c_frame = this->a;
}
}
this->unit->SetFrame(this->c_frame);
if (this->c_delay >= this->delay || !this->delay) {
this->c_delay = 0;
this->c_frame += (this->a < this->b) ? 1 : -1;
} else {
this->c_delay++;
}
return this->c_frame;
}
~Animation();
private:
CDXSprite *unit;
unsigned int a;
unsigned int b;
unsigned int delay;
bool loop;
unsigned int c_frame;
unsigned int c_delay;
};
// class Animation เป็น class ที่ช่วยให้เขียนแอนิเมชั่นง่ายขึ้น
typedef struct // ตัวแปรทั้งหลายที่ต้องใช้ของฮีโร่
{
CDXSprite *sp;
Animation *an;
char heading;
bool active;
int x,y;
}Fin;
Fin *rudof=new Fin();
const int $_mon =10 ;
typedef struct { //ตัวแปรทั้งหลายที่ต้องใช้ของ Enemy
int o, p;
int acceleration;
int size;
CDXSprite *src;
bool active;
Animation *an;
} MON;
MON mon[$_mon];
int u;
// ------------------------------------------------------------------
// 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
bg= new CDXSprite();//สร้าง BG
bg->Create( "bg2.png",500,272, 1 );
rudof->sp = new CDXSprite();//สร้างฮีโร่
rudof->sp->Create( "rudof.png",80,80, 1 );
rudof->an = new Animation(rudof->sp);
rudof->an->duration(1, 1, 2);
for (u=0; u < $_mon; u++) { //สร้าง enemy
mon[u].o = rand () % 480+480; //จุดเกิดแกน x ของ enemy
mon[u].p = 130 ;//จุดเกิดแกน y ของ enemy
mon[u].acceleration = rand () % 2+1;//ความเร่งของ enemy
mon[u].size = 1;
mon[u].active = true;
mon[u].src = new CDXSprite();
if (mon[u].size == 1)
{
mon[u].src->Create("mark.png", 70,70,1);//ใส่ภาพ Enemy
mon[u].src->SetPos(mon[u].o, mon[u].p);
}
mon[u].an = new Animation(mon[u].src);//ใส่ แอนิเมชั่น
mon[u].an->duration(1,8,1);
}
return TRUE;
}
// ------------------------------------------------------------------
// cdx_DeInit - handles cleanup of CDX objects
// ------------------------------------------------------------------
void cdx_DeInit( void )
{
// TODO: Destroy your CDX objects here
SAFEDELETE( bg );
SAFEDELETE( rudof->sp );
for (u=0; u < $_mon; u++) {
SAFEDELETE( mon[u].src );
}
SAFEDELETE( Fps );
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
bg->SetPos(0,0);
bg->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS ); //วาด BG
for (u=0; u < $_mon; u++) {
if (mon[u].src->GetPosX() < 0 || !mon[u].active) //เช็คตำแหน่ง enemy
{
mon[u].o = rand () % 480+480;
mon[u].p = 130 ;
mon[u].acceleration = rand () % 1 + 1;
mon[u].size = 1;
mon[u].src->SetPos(mon[u].o, mon[u].p);
mon[u].active = true;
}
if (rudof->sp->SpriteHit(mon[u].src) && mon[u].active && rudof->active && mon[u].o-rudof->x<=100){
mon[u].active = false;//เช็คชน ตอนฮีโร่ฆ่า enemy
}
mon[u].an->play();//สั่งให้ enemy เดิน
mon[u].o = mon[u].src->GetPosX()-mon[u].acceleration;
mon[u].src->SetPosX( mon[u].o );
if (mon[u].active) mon[u].src->Draw(Screen->GetBack(), 0, 0, CDXBLT_TRANS);
}
rudof->active = false;
if( Input->GetKeyState(SDLK_RIGHT)||
Input->GetKeyState(CDXKEY_JOYBUTN9)){
rudof->x += 10;
rudof->y = 0;
rudof->an->duration(2,4,2);
rudof->heading = 'R';
}
else if( Input->GetKeyState(SDLK_LEFT)||
Input->GetKeyState(CDXKEY_JOYBUTN7)){
rudof->x -= 10;
rudof->y = 0;
rudof->an->duration(7,9,2);
rudof->heading = 'L';
}
/*else if( Input->GetKeyState(SDLK_UP)||
Input->GetKeyState(CDXKEY_JOYBUTN8)) {
y -= 5;
} */
else if( Input->GetKeyState(SDLK_DOWN)||
Input->GetKeyState(CDXKEY_JOYBUTN6)) {
rudof->y = 8;
if(rudof->heading == 'R') rudof->an->duration(5, 5);
if (rudof->heading == 'L') rudof->an->duration(10, 10);
}
else {
rudof->y = 0;
if (rudof->heading == 'R') {
rudof->an->duration(1, 1);
}
if (rudof->heading == 'L') {
rudof->an->duration(6, 6);
}
}
if( Input->GetKeyState(SDLK_z)||
Input->GetKeyState(CDXKEY_JOYBUTN3)) {
rudof->active = true;
if(rudof->heading == 'R')
{
rudof->an->duration(11, 18,2);
}
if (rudof->heading == 'L')
{
rudof->an->duration(21, 28,2);
}
}
if(rudof->x>=400)
{
}
rudof->an->play();
rudof->sp->SetPos(rudof->x+50,rudof->y+120);
rudof->sp->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );
TextXY( Screen->GetBack(), 20, 20, 233, 227, 66, 255, ETA_CENTER, "%d",rudof->active );
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;
}
สมัครสมาชิก:
บทความ (Atom)