Main webboard   »   Irrlicht
 ย้อนกลับ  |  ตั้งกระทู้ใหม่  
Started by
Topic:   บทที่ 5 การควบคุมคีย์บอร์ดและเม้าส์  (Read: 2156 times - Reply: 0 comments)   
saruch (Admin)

Posts: 14 topics
Joined: 25/1/2553

บทที่ 5 การควบคุมคีย์บอร์ดและเม้าส์
« Thread Started on 26/1/2553 22:28:00 IP : 110.164.88.154 »
 

การควบคุมคีย์บอร์ด

ให้โหลดฉาก 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 หากปุ่มไหนถูกกดก็จะแสดงข้อความบนจอ

 

จากนั้นทำการรันได้เลยครับจะได้ดังภาพ

 
   Link to Post - Back to Top

Bookmark and Share

กรุณาเข้าสู่ระบบหรือสมัครสมาชิกก่อนโพสข้อความค่ะ
»
คลิ๊กที่นี่
   Main webboard   »   Irrlicht
 ย้อนกลับ  |  ตั้งกระทู้ใหม่  
Advertising Zone    Close

ด้วยความปราถนาดีจาก "สยามทูเว็บดอทคอม" และเพื่อป้องกันการเปิดเว็บไซต์เพื่อหลอกลวงขายของ โปรดตรวจสอบร้านค้าให้แน่ใจก่อนตัดสินใจซื้อของทุกครั้งนะคะ    อ่านเพิ่มเติม ...