สำหรับครั้งนี้ ในตอนที่ส่งนั้นมีแค่ตัวละครของเราขยับขึ้นลงซ้ายขวา และยิงได้เท่านั้น
อธิบาย 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
เมื่อทำตามนี้ทั้งหมดก็จะได้เกมที่มีตัวละครยิงลูกกระสุนออกไปทางด้านบนได้แล้ว

ไม่มีความคิดเห็น:
แสดงความคิดเห็น