วิธีการเล่น
ควมคุมทิศทางด้วยปุ่ม W,S,A,D ในเกมจะให้เราเป็นหมีแพนด้าตามเก็บเหรียนในปราสาทให้ครบตามจำนวนที่กำหนดไว้
ICameraSceneNode* camera = 0; ประกาศตัวแปรเอาไว้ควบคุมกล้อง
IAnimatedMesh* pac = 0; ประกาศตัวแปรสำหรับเอาไว้โหลดโมเดล ชื่อpac
IAnimatedMeshSceneNode* pac_node =0; ประกาศตัวแปรสำหรับควบคุมโมเดล
IGUIFont* g_font; ประกาศตัวแปรเอาไว้ควบคุมตัวอักษร
int i,j,score=0; ประกาศ ค่าI/J (ใช่ในอาเรย์) score
typedef struct คำสังสร้างลูกบอล(ในที่นี้เป็นโมเดลเหรียญ)
{ vector3df pos; IAnimatedMesh* ball; IAnimatedMeshSceneNode* ball_node; bool Active; }BALLINFO;
enum คำสั่งสร้างแถวขนาด 10x8
{ menu,play }gamestatus; BALLINFO myball[10][8]; IAnimatedMesh* world; ISceneNode* world_node; ITriangleSelector* selector; ISceneNodeAnimator* anim;
camera = g_engine.smgr->addCameraSceneNode( ); สร้างมุมกล้องแบบมุมมองบุคคลที่3
g_font = g_engine.guienv->getFont("content/myfont.xml"); โหลดFontเพื่อที่จะนำมาใช้แสดงบนหน้าจอ g_engine.device->getFileSystem()->addZipFileArchive("content/map.pk3"); ไฟล์ที่นำมาจากเกม quake3 ส่วนมากจะมีการบีบอัดมาในสกุลpk3ซึ่งสามารถแตกไฟล์ย่อยออกมาเป็น.bspได้โดยคำสั่งด้านบนครับ
world = g_engine.smgr->getMesh("kamq3dm2.bsp"); เมื่อเราแตกไฟล์pk3แล้ว ขั้นตอนนี้คือการเรียกใช้ไฟล์ .bsp ลงไปในตัวแปร world ครับ world_node = g_engine.smgr->addOctTreeSceneNode(world->getMesh(0) ); นำworldมาใส่ในตัวแปลควบคุม
world_node->setScale(vector3df(2,2,2)); กำหนดขนาดของworld
pac = g_engine.smgr ->getMesh("content/model/panda.x"); โหลดโมเดล PAC-MAC (ในที่นี้ใช้เป็นตัวแพนด้า) และกำหนดค่าต่างๆเช่น ขนาด แสง ตำแหน่งเริ่ม และความเร็วในอนิเมท pac_node = g_engine.smgr->addAnimatedMeshSceneNode(pac); pac_node->setMaterialFlag(EMF_LIGHTING,false); pac_node->setPosition(vector3df(500,10,-300)); pac_node->setScale(vector3df(5,5,5)); pac_node->setAnimationSpeed( 30000 );
for(i=0; i<10; i++) กำหนดตำแหน่งที่ว่าเหรียน { for(j=0; j<8; j++) { myball[i][j].ball = g_engine.smgr ->getMesh("content/model/coin.x"); โหลดโมเดลเหรียน 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].ball_node->setScale(vector3df(20.0f,20.0f,20.0f));กำหนดขนาดเหรียน myball[i][j].pos.X = (100.0f*(i+1))+300; กำหนดระยะห่างระหว่างเหรียนในแนวแกนx myball[i][j].pos.Y = 70;กำหนความสูงลอยจากพื้น myball[i][j].pos.Z = (100.0f*(j+1))-2000; กำหนดระยะห่างระหว่างเหรียนในแนวแกนz myball[i][j].ball_node->setPosition( myball[i][j].pos ); กำหนดเหรียนทุกอันมีค่าตำแหน่งเท่ากับ ที่เรากำหนดไว้ใน pos.x/y/z ด้านบน
myball[i][j].ball_node->setAnimationSpeed(10000); กำหนดความเร็วอนิเมชั่น myball[i][j].Active = true; เตัวกำหนดว่าเหรียนมีค่าactiveอยู่เอาไปใช้ในเช้คชน
} }
void cameraupdate() ล็อกมุมกล้องไม่ให้หันตามเม้า { vector3df pos = pac_node->getPosition( ); camera->setTarget( pos ); pos += vector3df(0, 250, -250); camera->setPosition( pos ); }
void text() คำสังสร้างfontให้แสดงผลบนหน้าจอ { wchar_t scoretext[256]; swprintf( scoretext, 256,L"Score : %d",score ); สร้างคำว่า Score g_font->draw( scoretext, rect(250,40,250,40), SColor(255,255,255,0) ); กำหนดขอบเขตกล้องข้อมความ แล้วกำหนดสี if(score >= 50 ) { g_font->draw( L"You Win", rect(250,80,250,80), SColor(255,255,255,0)); สร้างคำว่าYou Win ขึ้นบนหน้าจอเมือเก็บแต่มได้มากกว่า50และกำหนดขอบเขตและสี } }
void keyboardcontrol() สร้างตัวควบคุมPac-Man {
if(g_input.keyDown(KEY_KEY_W)) เมื่อกดw { move_ex(camera,pac_node,vector3df(0,0,5)); ทำให้ัตัวละครเดินขึ้นและหันหน้าขึ้น pac_node ->setRotation(vector3df(0,180,0)); } if(g_input.keyDown(KEY_KEY_S)) เมื่อกดs { move_ex(camera,pac_node,vector3df(0,0,-5)); ทำให้ัตัวละครเดินลงและหันหน้าลง pac_node ->setRotation(vector3df(0,0,0)); } if(g_input.keyDown(KEY_KEY_A)) เมื่อกดa { move_ex(camera,pac_node,vector3df(-5,0,0)); ทำให้ัตัวละครเดินไปทางซายและหันหน้าไปทางซาย pac_node ->setRotation(vector3df(0,90,0)); } if(g_input.keyDown(KEY_KEY_D)) เมื่อกดd { move_ex(camera,pac_node,vector3df(5,0,0));ทำให้ัตัวละครเดินไปทางขวาและหันหน้าไปทางขวา pac_node ->setRotation(vector3df(0,270,0)); } if(g_input.keyDown(KEY_KEY_S) && g_input.keyDown(KEY_KEY_A)) เมื่อกด s /a พร้อมกัน { pac_node ->setRotation(vector3df(0,45,0)); ทำให้ัตัวละครหันเฉียงซ้ายล่าง } else if(g_input.keyDown(KEY_KEY_A) && g_input.keyDown(KEY_KEY_W)) เมื่อกด a /w พร้อมกัน { pac_node ->setRotation(vector3df(0,135,0)); ทำให้ัตัวละครหันเฉียงซ้ายบน } else if(g_input.keyDown(KEY_KEY_W) && g_input.keyDown(KEY_KEY_D)) เมื่อกด w /d พร้อมกัน { pac_node ->setRotation(vector3df(0,225,0)); ทำให้ัตัวละครหันเฉียงขวาบน } else if(g_input.keyDown(KEY_KEY_S) && g_input.keyDown(KEY_KEY_D)) เมื่อกด s /d พร้อมกัน { pac_node ->setRotation(vector3df(0,315,0)); ทำให้ัตัวละครหันเฉียงขวาล่าง } }
void hit() ตัวเช็คชน { for(i=0; i<10; i++) { for(j=0; j<8; j++) { if(collision(myball[i][j].ball_node,pac_node))เช็คว่าpac-manชนเหรียน { if(myball[i][j].Active == true)ถ้าเหรียนมีค่าactiveเป็นtrueค่าscoreจะบวกเพิ่ม1และเปรียนค่าactiveเป็นfalse { score++; } myball[i][j].Active = false; } if(myball[i][j].Active == false) เมื่อค่าactiveกลายเป็นfalse
{ myball[i][j].ball_node->setVisible(false); สังให้เหรียนนั้นหายไป } } } }
if(gamestatus == play) เช็คสถานะว่าเป็นplayหรือไม่ถ้าใช้ให้เรียกใช้ ฟังชั่นสามตัวข้างใน
{ cameraupdate(); keyboardcontrol(); hit(); } |