~Irrlicht Tutorial3~ The basic animatoring....
posted on 01 Dec 2008 17:26 by apemon-chan in game-programing
จากคราวที่แล้วที่เราได้สร้างscenenodeแบบง่ายๆกันไปแล้ว คราวนี้เราจะมาลองใส่animatorอย่างง่ายๆ
ให้กับscenenodeงับ
มาเริ่มที่แบบแรกanimatorที่basicสุด ก็คือวิ่งมันตรงๆนี่แหละ ถ้าพร้อมแล้วสร้างscenenodeมา1อันก่อนเลย
(จะไม่อธิบายถึงส่วนheaderกะการสร้างscenenodeเน้อ เพราะได้กล่าวถึงมันไปแล้ว)
scene::ISceneNode* node=smgr->addSphereSceneNode();
node=smgr->addSphereSceneNode();
node->setPosition(core::vector3df(0,0,30));
node->setMaterialFlag(video::EMF_LIGHTING,false);
node->setMaterialTexture(0,driver->getTexture("media/wall.bmp"));
อันนี้ก็สร้างทรงกลม1อัน
scene::ISceneNodeAnimator* anim=0;
สร้างISceneNodeAnimatorขึ้นมา
anim=smgr->createFlyStraightAnimator(
core::vector3df(0,0,30),
core::vector3df(50,0,30),
6000,true);
สร้างFlyStraightAnimator(ก็คือวิ่งตรงๆนะแหละ) โดย
core::vector3df(0,0,30) หมายถึงจุดเริ่มต้น
core::vector3df(50,0,30) จุดหมายปลายทาง
6000 นี่คือเวลาที่ใช้(millisecond)
true อันนี้กำหนดว่าให้มันloopหรือเปล่า ถ้าต้องการเล่นรอบเดียวจบก็setเป็นfalse
node->addAnimator(anim);
แปะanimatorลงไปในnode
เท่านี้ก็เรียบร้อย ลองrunดูจะเห็นบอลวิ่งแล้วละน่ะ
ต่อมาลองanimatorพื้นฐานอีกอันดู อันนี้คือหมุนไปรอบๆ
scene::ISceneNode* node2;
node2=smgr->addCubeSceneNode();
node2->setPosition(core::vector3df(-30,0,30));
node2->setMaterialFlag(video::EMF_LIGHTING,false);
node2->setMaterialTexture(0,driver->getTexture("media/wall.bmp"));
สร้างหนูทดลอง ในที่นี้คือกล่องใบนึง
anim=smgr->createFlyCircleAnimator(
core::vector3df(-15,0,15),
15,0.001,
core::vector3df(1,0,0));
สร้างFlyCircleAnimator(คือโคจรรอบๆ) โดย
core::vector3df(-15,0,15) จุดศูนย์กลาง
f32 15 รัศมี
f32 0.001 ความเร็ว
core::vector3df(1,0,0) ประมาณว่าทิศทางวงโคจร(ลองปรับเล่นดู)
node2->addAnimator(anim);
แปะanimatorเข้ากับscenenode
anim->drop();
หมดประโยชน์ก็โละทิ้ง เพื่อเคลียร์พื้นที่(ใจร้ายจัง)
ก็เป็นอันเสร็จเรียบร้อยงับ ถ้าจะให้เห็นชัดก็สร้างscenenodeไปวางจุดcenterของวงโคจรก็ได้
อันนี้codeแบบเต็มๆงับ
#include <irrlicht.h>
using namespace irr;
#pragma comment(lib, "Irrlicht.lib")
int main(){
IrrlichtDevice *device =
createDevice(video::EDT_DIRECT3D9, core::dimension2d<s32>(640, 480));
if (device == 0)
return 1;
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
//create scenenode
scene::ISceneNode* node;
scene::ISceneNode* node2;
scene::ISceneNode* node3;//อันนี้ใส่ไว้ตรงจุดcenterของวงโคจรnode2
node=smgr->addSphereSceneNode();
node->setPosition(core::vector3df(0,0,30));
node->setMaterialFlag(video::EMF_LIGHTING,false);
node->setMaterialTexture(0,driver->getTexture("media/wall.bmp"));
node2=smgr->addCubeSceneNode();
node2->setPosition(core::vector3df(-30,0,30));
node2->setMaterialFlag(video::EMF_LIGHTING,false);
node2->setMaterialTexture(0,driver->getTexture("media/wall.bmp"));
node3=smgr->addSphereSceneNode();
node3->setPosition(core::vector3df(-15,0,15));
node3->setMaterialFlag(video::EMF_LIGHTING,false);
node3->setMaterialTexture(0,driver->getTexture("media/wall.bmp"));
//create animator
scene::ISceneNodeAnimator* anim=0;
anim=smgr->createFlyStraightAnimator(
core::vector3df(0,0,30),
core::vector3df(50,0,30),
6000,true);
node->addAnimator(anim);
anim=smgr->createFlyCircleAnimator(
core::vector3df(-15,0,15),
15,0.001,
core::vector3df(1,0,0));
node2->addAnimator(anim);
anim->drop();
//create camerascenenode
scene::ICameraSceneNode* cam;
cam=smgr->addCameraSceneNodeFPS();
cam->setPosition(core::vector3df(36,4,-49));
while(device->run())
{
driver->beginScene(true, true, video::SColor(0,200,200,200));
smgr->drawAll();
driver->endScene();
}
device->drop();
return 0;
}
#1 By book on 2008-12-01 23:32