สำหรับครั้งนี้ ในตอนที่ส่งนั้นมีแค่ตัวละครของเราขยับขึ้นลงซ้ายขวา และยิงได้เท่านั้น
อธิบาย Code
CDXSprite *jet; POINT pos;
เริ่มจากประกาศตัวแปร CDXSprite ขึ้นมาเพื่อรองรับ sprite ของตัวละคร และ ตัวแปะ POINT ชื่อ pos เพื่อเอาไว้ใช้เก็บตำแหน่งของตัวละคร
typedef struct { CDXSprite *missile; POINT pos, di, vel; }Missile_info;
สร้างโครงสร้างของตัวแปรชื่อ Missile_info ไว้สำหรับสร้างกระสุนที่จะยิงออกไป โดยที่ภายในมีตัวแปร 2 ชนิด คือ CDXSpritie ชื่อ missile และ POINT มี pos ไว้เก็บตำแหน่ง di เก็บทิศทาง vel ความเร่ง
irr::core::arraymlist;
สร้าง struct ชื่อ mlist
bool AddMis( char* name, const POINT& pos, const POINT& di, const POINT& vel ); void UpdateMis(void); void RemoveMis(void);
ประกาศ function ที่จะใช้
bool AddMis( char* name, const POINT& pos, const POINT& di, const POINT& vel ) { Missile_info* minfo = new Missile_info( ); minfo->missile = new CDXSprite( ); minfo->missile->Create( name, 1 ); minfo->pos = pos; minfo->di = di; minfo->vel = vel; mlist.push_back( minfo ); return true; }
สร้าง function ชื่อ AddMis function นี้จะทำหน้าที่เพิ่ม ลูกกระสุนเข้าไปในเกมโดยใช้ ทฤษฎี manager โดยที่ในแต่ละครั้งที่ function นี้ทำงาน มันจะรับค่า name คือชื่อของ sprite ที่จะมาเป็นลูกกระสุน pos คือตำแหน่งที่จะให้ลูกกระสุนอยู่ di คึือทิศทางของลูกกระสุน vel คือความเร็ว และนำค่านั้นมาใช้ใน function
void UpdateMis(void) { for( irr::u32 i = 0; i != mlist.size(); i++ ) { 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 ); } }
function นี้จะเป็นการสั่งให้กระสุนนั้นขยับ โดยจะเรียกใช้ัทั้ง mlist เลย ในที่นี้จะเป็นการสั่งให้กระสุนเคลื่อนที่ไปข้างหน้า
void RemoveMis(void) { for( irr::u32 i = 0; i != mlist.size(); ++i ) { if( mlist[i]->pos.x < 0 || mlist[i]->pos.x > 480 || mlist[i]->pos.y < 0 || mlist[i]->pos.y > 272 ) { SAFEDELETE( mlist[i]->missile ); SAFEDELETE( mlist[i] ); mlist.erase( i ); --i; continue; } } }
ใน function นี้จะเป็นการสั่งลบกระสุนออกไปโดยในที่นี้จะลบก็ต่อเมื่อกระสุนนั้นเกินจอออกไปแล้ว
jet = new CDXSprite( ); jet->Create( "me.png", 1 ); pos.x = 200; pos.y = 200;
ใน BOOL cdx_Init() นั้นเราได้เพิ่มการโหลดภาพของตัวละครของเราลงไป พร้อมทั้งกำหนดจุดเกิดของตัวละครเราด้วย
for( irr::u32 i = 0; i != mlist.size(); ++i ) { SAFEDELETE( mlist[i]->missile ); SAFEDELETE( mlist[i] ); mlist.erase( i ); --i; } SAFEDELETE( jet ); SAFEDELETE( Fps ); SAFEDELETE( Input ); SAFEDELETE( Screen );
เพิ่มคำสั่งตามนี้ลงไปใน void cdx_DeInit( void ) เพื่อที่จะได้สั่งคืนหน่วยความจำของตัวแปรที่เราไม่ใช้แล้ว
if( (Input->GetKeyState(SDLK_RIGHT)||Input->GetKeyState(CDXKEY_JOYBUTN9)) && (pos.x < 438)) pos.x += 8; if( (Input->GetKeyState(SDLK_LEFT)|| Input->GetKeyState(CDXKEY_JOYBUTN7))&&(pos.x > 5)) pos.x -= 8; if( (Input->GetKeyState(SDLK_UP)||Input->GetKeyState(CDXKEY_JOYBUTN8)) && (pos.y > 0)) pos.y -= 8; if( (Input->GetKeyState(SDLK_DOWN)||Input->GetKeyState(CDXKEY_JOYBUTN6)) && (pos.y < 200)) pos.y += 8; jet->SetPos( pos.x, pos.y ); jet->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS ); POINT di = { 0, -1 }; POINT vel = { 0, 10 }; if( Input->GetKeyState(SDLK_SPACE) == CDXKEY_PRESS ||Input->GetKeyState(CDXKEY_JOYBUTN3) == CDXKEY_PRESS ) { AddMis( "shot_me.png", pos, di, vel ); }
void cdx_DoFrame()
สำหรับใน function นี้นั้นในส่วนแรกจะเป็นส่วนของการขยับตัวละครโดย ที่จะใช้ปุ่มลูกศรของคีบอดในการสั่งและใช้ปุ่มลูกศรของตัว psp เองด้วย
หลังจากส่วนของการขวบคุมก็จะเป็นการสั่งวาดตัวละครลง
และส่วนสุดท้ายจะเป็นในส่วยของการสั่งยิง โดยที่จะต้ิองกด space bar เพิ่อยิงหรือ ปุ่มสี่เหลี่ยมสำหรับ psp โดยที่เมื่อเรากดแล้วจะเป็นการเรียกใช้ function AddMis
เมื่อทำตามนี้ทั้งหมดก็จะได้เกมที่มีตัวละครยิงลูกกระสุนออกไปทางด้านบนได้แล้ว
ไม่มีความคิดเห็น:
แสดงความคิดเห็น