วันพุธที่ 10 มีนาคม พ.ศ. 2553

Pacman

จงเขียนเกม PACMAN 3D โดยมีรายละเอียดดังนี้
1. มีลูกบอลทั้งหมด 80 ลูก
2. มีการเก็บคะแนนและแสดงคะแนนด้านซ้ายบน
3. หากกินลูกบอลหมดจะขึ้นคำว่า YOU WIN
4. pacman หันหน้าไปตามทิศทางที่เดิน
5. pacman และลูกบอลมี animation
6. มีฉากหลัง (Background)


นี่คือเกมที่เสร็จแล้ว
ควบคุมโดยการใช้ W,A,S,D ในการขยับตัว ไปกินจุดหลังจากที่เก็บครบหมดแล้วเกมก็จะขึ้นว่า เราชนะ


Code
ICameraSceneNode* camera = 0;
IAnimatedMesh* pac = 0;
IAnimatedMeshSceneNode* pac_node = 0;
IGUIFont* g_font;
IGUIFont* g_font2;
int i, j;
int sc = 0;
wchar_t text[256];


ในส่วนจะเป็นการประกาศตัวแปรที่จำเป็นต้องใช้
  • ICameraSceneNode เป็นตัวแปรที่่เอาเก็บค่าของกล้อง
  • IAnimatedMesh คือ ตัวแปรที่เอาไว้เก็บโมเดล
  • IAnimatedMeshSceneNode คือ ตัวแปรที่นำเอาโมเดลที่เก็บไว้มาแสดงบนจอ
  • IGUIFont ไว้สำหรับเก็บค่าของตัวอัษรที่จะวาดลงในจอ
  • int ค่าจำนวนเต็ม
  • wchar_t ไว้เก็บตัวอักษร

typedef struct
{
vector3df pos;
IAnimatedMesh* ball;
IAnimatedMeshSceneNode* ball_node;
bool Active;
}BALLINFO;
BALLINFO myball[10][8];


สร้าง struct ซึ่งก็คือการสร้างโครงสร้างของตัวแปรเพื่อทีี่่จะได้เรียกใช้ได้ง่ายขึ้น ในส่วนนี้้เป็นการสร้างโครงสร้างของตัวลูกบอล หลังจากที่สร้างแล้วก็ตั้งชื่อให้ว่า BALLINFO แล้วก็นำstruct นั้นมาประกาศเป็นชื่อ myball เป็นอาเรย์ มี 10 แถว 8 คอลัมน์


camera = g_engine.smgr->addCameraSceneNodeFPS();
camera->setPosition(vector3df(500,500,-100));
camera->setRotation(vector3df(45,0,0));


สร้างกล้องขึ้นมาแล้วกำหนดให้เป็นกล้องแบบเกม FPS กำหนดตำแหน่งของกล้องใหม่พร้อมกับหมุมให้ได้มุมด้วย

pac = g_engine.smgr->getMesh("peet.obj");
pac_node = g_engine.smgr->addAnimatedMeshSceneNode(pac);
pac_node->setMaterialFlag(EMF_LIGHTING,false);
pac_node->setPosition(vector3df(500,-10,50));
pac_node->setScale( core::vector3df(10.0f, 10.0f, 10.0f) );

g_font = g_engine.guienv->getFont("myfont.xml");
g_font2 = g_engine.guienv->getFont("myfont.xml");


นำโมเดลชื่อ peet.obj เข้ามาเก็บไว้ที่ pac หลังจากนั้นก็นำ pac ไปแสดงไว้ใน pac_node
pac_node->setMaterialFlag(EMF_LIGHTING,false); นั้นเป็นการกำหนดให้โมเดลนี้ไม่มีผลต่อแสง
สำหรับ g_font กับ g_font2 นั้นเป็นการนำ Font ที่เป็น ไฟล์ bit map เข้ามา


for(i = 0;i <10;i++) j =" 0;j" ball =" g_engine.smgr-">getMesh("ball.obj");
myball[i][j].ball_node = g_engine.smgr->addAnimatedMeshSceneNode(myball[i][j].ball);

myball[i][j].ball_node->setMaterialFlag(EMF_LIGHTING,false);
myball[i][j].ball_node->setRotation(vector3df(0,180,0));

myball[i][j].pos.X = 100.0f*(i+1);
myball[i][j].pos.Z = 100.0f*(j+1);
myball[i][j].ball_node->setPosition(myball[i][j].pos);
myball[i][j].Active = true;
}


นำเอาอาเรย์ชื่อ myball มากำหนดค่าต่างๆลงไป เช่น นำโมเดล ball.obj เข้ามา กำหนดให้ไม่มีผลต่อแสงเป็นต้น

if( g_input.keyDown(KEY_KEY_W) ){
move_ex( camera, pac_node, vector3df(0,0,1));
pac_node->setRotation( core::vector3df(0, 0, 0) );
}
else if( g_input.keyDown(KEY_KEY_S) ){
move_ex( camera, pac_node, vector3df(0,0,-1));
pac_node->setRotation( core::vector3df(0, 180, 0) );
}
else if( g_input.keyDown(KEY_KEY_A) ){
move_ex( camera, pac_node, vector3df(-1,0,0));
pac_node->setRotation( core::vector3df(0, 270, 0) );
}
else if( g_input.keyDown(KEY_KEY_D) ){
move_ex( camera, pac_node, vector3df(1,0,0));
pac_node->setRotation( core::vector3df(0, 90, 0) );
}


ในส่วนนี้เป็นการควบคุมตัวละครโดยกำหนดให้ W เดินขึ้น S เดินลง A ไปทางซ้าย D ไปทางขวา

if(sc>= 8000)
{
g_font->draw( L"YOU WIN",rect(250,200,100,100),SColor(255,255,255,255) );

}
swprintf(text,256,L"Score :%d",sc);
g_font->draw( text, rect(10,5,100,100),SColor(255,0,255,255) );


จะขึ้นคำว่า YOU WIN เมื่อคะแนนถึง 8000 กับอีก อันหนึ่งคือการแสดงค่าของคะแนน


for( i = 0; i < j =" 0;" active =" false;">setVisible( false );}
}
}

เช็คว่าลูกบอลชนกับตัวละครหรือเปล่า ถ้าชนลูกบอลจะหายไปพร้อมกับเพิ่มคะแนนมา 100

Download Source code ทั้งหมด

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

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