การควบคุมคีย์บอร์ด
ให้โหลดฉาก BSP เข้ามาก่อนนะครับ(วิธีทำดูจากบทที่แล้ว)เพราะไม่งั้นเราจะไม่สามารถรู้ได้ว่าตัวละครเราเคลื่อนไหวหรือไม่เพราะ มันเหมือนกันหมดทุกด้าน เราจะทำการควบคุมแบบ wasd ซึ่งเป็นที่นิยมมากในการเล่นเกมแนว FPS และ TPS เรามาเริ่มกันเลยดีกว่า
ไฟล์โมเดลและฉากที่จำใช้ในการทำครั้งนี้ครับ
ในส่วนการประกาศตัวแปรครับ
ICameraSceneNode* camera;
ประกาศตัวแปรสำหรับควบคุมมุมกล้อง
IAnimatedMesh* model;
ประกาศตัวแปรสำหรับการโหลดโมเดล
IAnimatedMeshSceneNode* node;
ประกาศตัวแปรสำหรับการควบคุมโมเดล
IAnimatedMesh* world;
ประกาศตัวแปรสำหรับฉาก
ISceneNode* world_node;
ตัวแปรสำหรับควบคุมฉาก
มาที่ฟังชั่น Init() ครับ เพิ่มคำสั่งลงไปตามนี้
camera = g_engine.smgr->addCameraSceneNodeFPS( 0, 100, 50 );
ประกาศใช้งานกล้องแบบ FPS ครับ โดย ส่วนค่า 100 และ 50 คือค่าความเร็วในการเคลื่นที่ของคีย์บอร์ดและเม้าตามลำดับครับ
g_engine.device->getFileSystem()->addZipFileArchive("kamq3dm2.pk3");
ไฟล์ที่นำมาจากเกม quake3 ส่วนมากจะมีการบีบอัดมาในสกุลpk3ซึ่งสามารถแตกไฟล์ย่อยออกมาเป็น.bspได้โดย คำสั่งด้านบนครับ (ไฟล์หาโหลดจากบทที่แล้ว)
world = g_engine.smgr->getMesh("kamq3dm2.bsp");
เมื่อเราแตกไฟล์pk3แล้ว ขั้นตอนนี้คือการเรียกใช้ไฟล์ .bsp ลงไปในตัวแปร world ครับ
world_node = g_engine.smgr->addOctTreeSceneNode(world->getMesh(0) );
เป็น การนำ world มาใส่ในตัวแปรควบคุมและวาดลงไปในเกมครับ
model = g_engine.smgr->getMesh("binrut.b3d");
สั่งโหลดโมเดลครับ
node = g_engine.smgr->addAnimatedMeshSceneNode( model );
นำตัวแปรโมเดลมาควบคุมผ่าน node
node->setMaterialFlag(EMF_LIGHTING, false);
กำหนดให้ไม่มีการตกกระทบของแสงกับ model
node->setPosition( core::vector3df(0, -5, 5) );
ส่วนตรงนี้คือการกำหนดตำแหน่งครับ
node->setRotation( core::vector3df(90, 0, 0) );
กำหนดการหมุน
node->setScale( core::vector3df(0.1f, 0.1f, 0.1f) );
กำหนดขนาด
node->setAnimationSpeed( 2000 );
สำหรับโมเดลที่มีอนิเมชั่น สามารถกำหนดความเร็วของการเคลื่อนไหวด้วยคำสั่งนี้ครับ
มาที่ฟังชั่น doframe() ครั้บ มาทำการควบคุมกัน
if( g_input.keyDown(KEY_KEY_W) ) move( node, vector3df(0,-0.2f,0));
เป็นการตรวจสอบผ่านฟังชั่น keydown(กด) หากเป็นจริงจะทำตามในบรรทัดที่ 2 ครับ คือให้ mode เคลื่อนที่ในแนวการ Y -0.2
if( g_input.keyDown(KEY_KEY_S) ) move(node, vector3df(0,0.2f,0));
เป็นการตรวจสอบผ่านฟังชั่น keydown(กด) หากเป็นจริงจะทำตามในบรรทัดที่ 2 ครับ คือให้ mode เคลื่อนที่ในแนวการ Y +0.2
if( g_input.keyDown(KEY_KEY_A) ) move(node, vector3df(0.2f,0,0));
เป็นการตรวจสอบผ่านฟังชั่น keydown(กด) หากเป็นจริงจะทำตามในบรรทัดที่ 2 ครับ คือให้ mode เคลื่อนที่ในแนวการ X +0.2
if( g_input.keyDown(KEY_KEY_D) ) move(node, vector3df(-0.2f,0,0));
เป็นการตรวจสอบผ่านฟังชั่น keydown(กด) หากเป็นจริงจะทำตามในบรรทัดที่ 2 ครับ คือให้ mode เคลื่อนที่ในแนวการ X -0.2
if( g_input.keyDown(KEY_ADD) ) node->setRotation( node->getRotation() + core::vector3df(0, 1, 0) );
หากมีการกดปุ่มบวก ให้ทำการหมุนโมเดลในแกน Y ด้วยฟังชั่น setRotation ครับ
if( g_input.keyDown(KEY_SUBTRACT) ) node->setRotation( node->getRotation() + core::vector3df(0, -1, 0) );
อันนี้ปุ่ม ลบ ครับ ตรงกันข้ามกะข้างบนหมุนไปคนละทาง แต่ แกน Y เช่นกัน
หลัง จากที่ เขียนโค้ดเรียบร้อยแล้วให้กด F5 ครับ หาก ไม่มี Error ใดๆ จะปรากฏภาพตามด้านล่างครับ
การ ควบคุมเม้าส์
ตัวอย่างนี้จะ แสดงการควบคุมเม้าส์ โดยแสดงตำแหน่งพิกัดแกน X Y ของเม้าส์และการกดเม้าซ้าย ขวา กลาง บนหน้าจอ
มีขั้นตอนตามนี้เลยครับ
มาเริ่มที่ฟังชั่น doframe()เลยครับ
wchar_t text[256];
ประกาศตัวแปนชื่อ text เพื่อเก็บข้อความ
swprintf ( text, 256, L"mousePosition: X:%d, Y:%d", g_input.mouseX(), g_input.mouseY() );
เรียกใช้ฟังชั่น mouseX และ MouseY เพื่อเรียกพิกัดของเม้าส์ จากนั้นให้ฟังชั่น swprintf เพื่อแปลงค่าพิกัดให้เป็นข้อความและเก็บไว้ที่ตัวแปร text
g_engine.font->draw( text, rect<int>(250,100,260,22), SColor(255,255,255,255) );
แสดงข้อความจากตัวแปร text ไว้บนจอ
if( g_input.leftMouseDown() ) g_engine.font->draw( L"leftMouseDown", rect<int>(250,110,260,22), SColor(255,255,255,255) ); if( g_input.middleMouseDown() ) g_engine.font->draw( L"middleMouseDown", rect<int>(250,120,260,22), SColor(255,255,255,255) ); if( g_input.rightMouseDown() ) g_engine.font->draw( L"rightMouseDown", rect<int>(250,130,260,22), SColor(255,255,255,255) );
เป็นการตรวจสอบว่ามีการกด เม้า ซ้าย กลาง และขวาหรือไม่ ผ่านฟังชั่น leftMouseDown , middleMouseDown , rightMouseDown หากปุ่มไหนถูกกดก็จะแสดงข้อความบนจอ
จากนั้นทำการรันได้เลยครับจะได้ดังภาพ
|