วันอังคารที่ 15 กุมภาพันธ์ พ.ศ. 2554

WP 2


สำหรับครั้งนี้ ในตอนที่ส่งนั้นมีแค่ตัวละครของเราขยับขึ้นลงซ้ายขวา และยิงได้เท่านั้น


อธิบาย 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::array mlist;

สร้าง 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

เมื่อทำตามนี้ทั้งหมดก็จะได้เกมที่มีตัวละครยิงลูกกระสุนออกไปทางด้านบนได้แล้ว

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

แสดงความคิดเห็น