人物走行衝突テストコード
31094 ワード
使用するIDE:CodeBlocks 10.05 Irrlichtバージョン:1.8オペレーティングシステム:win 7
プロジェクト構造:Irrlicht test world-player-war---Sources --src ----Faerie.cpp ----World.cpp ----main.cpp----Headers --include ----EventReceiver.h ----Faerie.h ----World.h
プロジェクト構造:Irrlicht test world-player-war---Sources --src ----Faerie.cpp ----World.cpp ----main.cpp----Headers --include ----EventReceiver.h ----Faerie.h ----World.h
#include "../include/World.h"
#include "../include/Faerie.h"
class World world;
class Faerie faerie1;
class Faerie faerie2;
int main(int argc, char* argv[])
{
cEventReceiver eventReceiver;
//
world.Init();
//
world.Prepare();
//
faerie1.Initialize(world.device,world.mapSelector,1);
faerie2.Initialize(world.device,world.mapSelector,2);
//
world.device->setEventReceiver(&eventReceiver);
//
while(world.device->run() && (eventReceiver.Keys[KEY_ESCAPE] == false))
{
world.MainLoop(faerie1.faerieNode,&eventReceiver);
faerie1.OnAnima(&eventReceiver);
}
world.Finish();
return 0;
}
#ifndef WORLD_H
#include <irrlicht.h>
#include <sys/time.h>
#include <iostream>
#define WORLD_H
using namespace irr;
#include "EventReceiver.h"
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
enum
{
// I use this ISceneNode ID to indicate a scene node that is
// not pickable by getSceneNodeAndCollisionPointFromRay()
ID_IsNotPickable = 0,
// I use this flag in ISceneNode IDs to indicate that the
// scene node can be picked by ray selection.
IDFlag_IsPickable = 1 << 0,
//IDFlag_IsPickable = 0,
// I use this flag in ISceneNode IDs to indicate that the
// scene node can be highlighted. In this example, the
// homonids can be highlighted, but the level mesh can't.
IDFlag_IsHighlightable = 1 << 1
//IDFlag_IsHighlightable = 1
};
class World
{
public:
World();
virtual ~World();
//
struct SMouseState
{
bool LeftButtonDown;
SMouseState() : LeftButtonDown(false) { }
} MouseState;
const SMouseState & GetMouseState(void) const
{
return MouseState;
}
struct SParticleImpact
{
u32 when;
core::vector3df pos;
core::vector3df outVector;
};
//
void Init();
void Prepare();
void MainLoop(IAnimatedMeshSceneNode* mainNode,cEventReceiver* eventReceiver);
void Render();
void Finish();
// Irrlicht vars
IVideoDriver* driver;
ISceneManager* smgr;
//IGUIEnvironment* guienv;
IrrlichtDevice *device;
gui::IGUIEnvironment* gui;
scene::ICameraSceneNode* fps_camera;
scene::IParticleSystemSceneNode* ps;
scene::ITriangleSelector* mapSelector;
scene::ITriangleSelector* cubeSelector;
scene::IParticleSystemSceneNode* campFire;
scene::ITerrainSceneNode* terrain;
scene::ISceneCollisionManager* collMan;
scene::ISceneNode * selectedSceneNode;
scene::IBillboardSceneNode * bill;
scene::IParticleEmitter* em ;
core::array<SParticleImpact> Impacts;
core::stringw str;
protected:
private:
void Play();
void Shoot(core::vector3df start);
void CreateParticleImpacts();
bool hasEmitter;
f32 speed;//3.f
f32 camera_round;
vector3df pFaerie;
vector3df pCamera;
core::line3d<f32> ray;
core::vector3df intersection;
};
#endif // WORLD_H
#include "../include/World.h"
#include "../include/EventReceiver.h"
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
World::World():
hasEmitter(true)
{
//ctor
}
World::~World()
{
//dtor
}
// world
void World::Init()
{
//
camera_round = -28.f;
core::dimension2d<u32> resolution ( 800, 600 );
device = createDevice(EDT_OPENGL,
resolution, 32, false, true, false);
device->setWindowCaption(L"World!");
driver = device->getVideoDriver();
smgr = device->getSceneManager();
collMan = smgr->getSceneCollisionManager();
gui = device->getGUIEnvironment();
//
fps_camera = smgr->addCameraSceneNodeFPS();
fps_camera->setScale(vector3df(0.1f,0.1f,0.1f));
fps_camera->setPosition(vector3df(5210.f,1000.f,3110.f));
fps_camera->setRotation(vector3df(0.f,180.f,0.f));
device->getCursorControl()->setVisible(false);
}
//
void World::Prepare()
{
//
IAnimatedMesh* mesh = smgr->getMesh("../../media/room.3ds");
smgr->getMeshManipulator()->makePlanarTextureMapping(mesh->getMesh(0), 0.004f);
ISceneNode* node = 0;
scene::IAnimatedMeshSceneNode* animModel = smgr->addAnimatedMeshSceneNode(mesh);
node = animModel;
node->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(node->isDebugDataVisible()^scene::EDS_MESH_WIRE_OVERLAY));
node->setMaterialFlag(EMF_LIGHTING, false);
// ,
mapSelector = smgr->createOctreeTriangleSelector(mesh,node);
node->setTriangleSelector(mapSelector);
node->setMaterialTexture(0, driver->getTexture("../../media/wall.jpg"));
node->getMaterial(0).SpecularColor.set(0,0,0,0);
node->setMaterialFlag(EMF_FOG_ENABLE, false);
mesh = smgr->addHillPlaneMesh( "waterMesh",
dimension2d<f32>(30,30),
dimension2d<u32>(30,30), 0, 0,
dimension2d<f32>(0,0),
dimension2d<f32>(10,10));
node = smgr->addWaterSurfaceSceneNode(mesh->getMesh(0), 3.0f, 300.0f, 30.0f);
node->setPosition(vector3df(0,9,0));
node->setMaterialTexture(0, driver->getTexture("../../media/stones.jpg"));
node->setMaterialTexture(1, driver->getTexture("../../media/water.jpg"));
node->setMaterialType(EMT_REFLECTION_2_LAYER);
//node->setMaterialFlag(EMF_FOG_ENABLE, true);
node->setDebugDataVisible(scene::EDS_OFF);
node->setMaterialFlag(EMF_LIGHTING, false);
//ISceneNode* terrain = smgr->addMeshSceneNode(smgr->getMesh("../../media/Irr2013123.irr"));
//
IMesh* cubeMesh = smgr->getMesh("../../media/data/smallcube.3ds");
ISceneNode* cubeNode = smgr->addMeshSceneNode(cubeMesh);
cubeNode->setMaterialTexture(0, driver->getTexture("../../media/data/crate.jpg"));
cubeNode->setPosition(vector3df(140,100,40));
//cubeNode->setScale(vector3df(3,3,2));
cubeNode->setMaterialFlag(video::EMF_LIGHTING, false);
cubeNode->setName("cube");
smgr->addTextSceneNode(gui->getBuiltInFont(),
L"Cube-1",
video::SColor(100,255,255,255), cubeNode);
// Add the billboard.
bill = smgr->addBillboardSceneNode();
bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR );
bill->setMaterialTexture(0, driver->getTexture("../../media/fireball.bmp"));
// bill->setMaterialTexture();
bill->setMaterialFlag(video::EMF_LIGHTING, false);
bill->setMaterialFlag(video::EMF_ZBUFFER, false);
bill->setSize(core::dimension2d<f32>(20.0f, 20.0f));
bill->setID(ID_IsNotPickable); // This ensures that we don't accidentally ray-pick it
//cubeNode->;
//
//cubeNode->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(cubeNode->isDebugDataVisible()^scene::EDS_MESH_WIRE_OVERLAY));
cubeSelector = 0;
cubeSelector = smgr->createTriangleSelector(cubeMesh,cubeNode);
cubeNode->setTriangleSelector(cubeSelector);
//selector->drop(); // We're done with this selector, so drop it now.
// some lights
/*video::SLight l;
scene::ILightSceneNode *light = smgr->addLightSceneNode(gamescene,core::vector3df(50,50,50),video::SColorf(1,1,1,1.f),1000);
l = light->getLightData();
l.Type = video::ELT_POINT;
l.AmbientColor = video::SColorf(.35,.35,.35);
l.SpecularColor = video::SColorf(.7,.7,.5);
l.DiffuseColor = video::SColorf(1,1,1);
l.CastShadows = true;
light->setLightData( l );*/
//node = smgr->addOctreeSceneNode(mesh,0,0);
//node->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(node->isDebugDataVisible()^scene::EDS_MESH_WIRE_OVERLAY));
// ,
//
scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
mapSelector, cubeNode, cubeNode->getBoundingBox().MaxEdge,
core::vector3df(0,-10,0),
core::vector3df(0,0,0));
cubeNode->addAnimator(anim);
anim->drop();
anim = 0;
//
campFire = smgr->addParticleSystemSceneNode(false);
campFire->setPosition(core::vector3df(100,120,600));
campFire->setScale(core::vector3df(2,2,2));
// ( )
em = campFire->createBoxEmitter(
core::aabbox3d<f32>(-7,0,-7,7,1,7),// emitter size
core::vector3df(0.0f,0.06f,0.0f), // initial direction
80,100, // min and max emit rate
video::SColor(1,255,255,255), // darkest color
video::SColor(1,255,255,255), // brightest color
800,2000,10, // min and max age, angle
dimension2df(10.f,10.f), // min size
dimension2df(20.f,20.f) // max size
);
em->setMinStartSize(core::dimension2d<f32>(20.0f, 10.0f));
em->setMaxStartSize(core::dimension2d<f32>(20.0f, 10.0f));
campFire->setEmitter(em);
em->drop();
em = 0;
//
scene::IParticleAffector* paf = campFire->createFadeOutParticleAffector();
campFire->addAffector(paf);
paf->drop();
//
campFire->setMaterialFlag(video::EMF_LIGHTING, false);
campFire->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false);
campFire->setMaterialTexture(0, driver->getTexture("../../media/fireball.bmp"));
campFire->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
}
//
void World::MainLoop(IAnimatedMeshSceneNode* mainNode,cEventReceiver* eventReceiver)
{
pCamera= vector3df(mainNode->getPosition().X+sin(PI*fps_camera->getRotation().Y/180)*camera_round,
mainNode->getPosition().Y+20.f,
mainNode->getPosition().Z+cos(PI*fps_camera->getRotation().Y/180)*camera_round);
fps_camera->setPosition(pCamera);
str = L"Irrlicht Engine - Walker example [";
str += driver->getName();
str += "] ";
str += "P:";
str += fps_camera->getRotation().X;
str += ",";
str += fps_camera->getRotation().Y;
str += ",";
str += fps_camera->getRotation().Z;
str += "|";
str += mainNode->getPosition().X;
str += ",";
str += mainNode->getPosition().Y;
str += ",";
str += mainNode->getPosition().Z;
device->setWindowCaption(str.c_str());
/*if(fps_camera->getRotation().X<=6)
{
fps_camera->setRotation(vector3df(6,fps_camera->getRotation().Y,0));
}
if(72<=fps_camera->getRotation().X)
{
fps_camera->setRotation(vector3df(72,fps_camera->getRotation().Y,0));
}*/
ray.start = fps_camera->getPosition();
ray.end = ray.start + (fps_camera->getTarget()- ray.start).normalize() * 1000.0f;
core::triangle3df hitTriangle;
Play();
selectedSceneNode = collMan->getSceneNodeAndCollisionPointFromRay(
ray,
intersection, // This will be the position of the collision
hitTriangle, // This will be the triangle hit in the collision
IDFlag_IsPickable, // This ensures that only nodes that we have
// set up to be pickable are considered
0); // Check the entire scene (this is actually the implicit default)
if(selectedSceneNode)
{
bill->setPosition(ray.end);
bill->setRotation(core::vector3df(fps_camera->getRotation().X,fps_camera->getRotation().Y,fps_camera->getRotation().Z));
driver->setTransform(video::ETS_WORLD, core::matrix4());
//driver->setMaterial(material);
driver->draw3DTriangle(hitTriangle, video::SColor(0,255,0,0));
//selectedSceneNode->setVisible(false);
std::cout<<selectedSceneNode->getName()<<std::endl;
std::cout<<selectedSceneNode->getPosition().X<<","<<selectedSceneNode->getPosition().Y<<","<<selectedSceneNode->getPosition().Z<<std::endl;
//std::cout<<intersection.X<<","<<intersection.Y<<","<<intersection.Z<<std::endl;
//std::cout<<hitTriangle.pointA<<","<<hitTriangle.pointB<<","<<hitTriangle.pointC<<std::endl;
if(strcmp(selectedSceneNode->getName(),"cube")==0)
{
//selectedSceneNode->setPosition(mainNode->getPosition());
std::cout<<"---------------stop-------------"<<std::endl;
eventReceiver->Move=false;
//mainNode->setMD2Animation(EMAT_STAND);
}
else
{
eventReceiver->Move=true;
}
if(eventReceiver->GetMouseState().LeftButtonDown)
{
std::cout<<"--------------------war-----------------------"<<std::endl;
selectedSceneNode->setPosition(selectedSceneNode->getPosition()+1);
}
else
{
}
}
CreateParticleImpacts();
Render();
}
//
void World::Render()
{
if (device->isWindowActive())
{
driver->beginScene(true, true, SColor(255,100,101,140));
smgr->drawAll();
driver->endScene();
/*str = L"Irrlicht Engine - Walker example [";
str += driver->getName();
str += "] ";
str += "P:";
str += fps_camera->getRotation().X;
str += ",";
str += fps_camera->getRotation().Y;
str += ",";
str += fps_camera->getRotation().Z;
device->setWindowCaption(str.c_str());*/
}
}
//
void World::Finish()
{
device->drop();
}
void World::Play()
{
//
if(GetMouseState().LeftButtonDown)
{
std::cout<<"click mouse"<<std::endl;
Shoot(pFaerie);
}
}
void World::Shoot(core::vector3df start)
{
scene::ISceneManager* sm = device->getSceneManager();
scene::ICameraSceneNode* camera = sm->getActiveCamera();
if (!camera )
return;
SParticleImpact imp;
imp.when = 0;
// get line of camera
//core::vector3df start = faerieNode->getPosition();
core::vector3df end = (camera->getTarget() - start);
end.normalize();
start += end*8.0f;
end = start + (end * camera->getFarValue());
core::triangle3df triangle;
core::line3d<f32> line(start, end);
// get intersection point with map
scene::ISceneNode* hitNode;
if (sm->getSceneCollisionManager()->getCollisionPoint(
line, mapSelector, end, triangle, hitNode))
{
// collides with wall
core::vector3df out = triangle.getNormal();
out.setLength(0.03f);
imp.when = 1;
imp.outVector = out;
imp.pos = end;
}
else
{
// doesnt collide with wall
//core::vector3df start = faerieNode->getPosition();
core::vector3df end = (camera->getTarget() - start);
end.normalize();
start += end*8.0f;
end = start + (end * camera->getFarValue());
}
// create fire ball
scene::ISceneNode* node = 0;
node = sm->addBillboardSceneNode(0,
core::dimension2d<f32>(25,25), start);
node->setMaterialFlag(video::EMF_LIGHTING, false);
node->setMaterialTexture(0, device->getVideoDriver()->getTexture("../../media/fireball.bmp"));
node->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
f32 length = (f32)(end - start).getLength();
const f32 speed = 0.2f;
u32 time = (u32)(length / speed);
scene::ISceneNodeAnimator* anim = 0;
// set flight line
anim = sm->createFlyStraightAnimator(start, end, time);
node->addAnimator(anim);
anim->drop();
anim = sm->createDeleteAnimator(time);
node->addAnimator(anim);
anim->drop();
if (imp.when)
{
// create impact note
imp.when = device->getTimer()->getTime() + (time - 100);
Impacts.push_back(imp);
}
}
void World::CreateParticleImpacts()
{
u32 now = device->getTimer()->getTime();
scene::ISceneManager* sm = device->getSceneManager();
for (s32 i=0; i<(s32)Impacts.size(); ++i)
if (now > Impacts[i].when)
{
// create smoke particle system
scene::IParticleSystemSceneNode* pas = 0;
pas = sm->addParticleSystemSceneNode(false, 0, -1, Impacts[i].pos);
pas->setParticleSize(core::dimension2d<f32>(10.0f, 10.0f));
scene::IParticleEmitter* em = pas->createBoxEmitter(
core::aabbox3d<f32>(-5,-5,-5,5,5,5),
Impacts[i].outVector, 20,40, video::SColor(50,255,255,255),video::SColor(50,255,255,255),
1200,1600, 20);
pas->setEmitter(em);
em->drop();
scene::IParticleAffector* paf = campFire->createFadeOutParticleAffector();
pas->addAffector(paf);
paf->drop();
pas->setMaterialFlag(video::EMF_LIGHTING, false);
pas->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false);
pas->setMaterialTexture(0, device->getVideoDriver()->getTexture("../../media/smoke.bmp"));
pas->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
scene::ISceneNodeAnimator* anim = sm->createDeleteAnimator(2000);
pas->addAnimator(anim);
anim->drop();
// delete entry
Impacts.erase(i);
i--;
}
}
#ifndef FAERIE_H
#define FAERIE_H
#include <irrlicht.h>
#include "World.h"
using namespace irr;
#include "EventReceiver.h"
using namespace core;
//using namespace scene;
//using namespace video;
//using namespace io;
class Faerie
{
public:
Faerie();
void Initialize(IrrlichtDevice *device,scene::ITriangleSelector* mapSelector,s32 n);
//void setSelector(scene::ITriangleSelector* mapSelector);
virtual ~Faerie();
void OnAnima(cEventReceiver* eventReceiver);
scene::IAnimatedMeshSceneNode* faerieNode;
protected:
private:
void Move();
void Turn_face(bool leftOrRight );
f32 speed;//3.f
vector3df pFaerie;
bool turn_back;
bool status;
f32 lasttick;
f32 pX;// 0.f;
f32 pZ;// 0.f;
f32 pR;// 0.f;
IrrlichtDevice *f_device;
};
#endif // FAERIE_H
#ifndef CEVENTRECEIVER_H
#define CEVENTRECEIVER_H
class cEventReceiver : public IEventReceiver
{
public:
cEventReceiver()
{
for (int i=0; i<KEY_KEY_CODES_COUNT; i++)
{
Keys[i] = false;
KeysTemp[i] = false;
}
mouseX=mouseY=mouseDeltaX=mouseDeltaY=0;
Move = true;
}
//
struct SMouseState
{
bool LeftButtonDown;
SMouseState() : LeftButtonDown(false) { }
} MouseState;
const SMouseState & GetMouseState(void) const
{
return MouseState;
}
~cEventReceiver() {}
virtual bool OnEvent(const SEvent& event)
{
if (event.EventType==irr::EET_KEY_INPUT_EVENT)
{
Keys[event.KeyInput.Key] = false;
Keys[event.KeyInput.Key] = event.KeyInput.PressedDown;
return true;
}
if (event.EventType==irr::EET_MOUSE_INPUT_EVENT)
{
/*mouseX = event.MouseInput.X;
mouseY = event.MouseInput.Y;
mouseDeltaX = event.MouseInput.X - mouseX;
mouseDeltaY = event.MouseInput.Y - mouseY;
std::cout<<mouseDeltaX<<std::endl;
return true;*/
}
if (event.EventType == irr::EET_MOUSE_INPUT_EVENT)
{
switch(event.MouseInput.Event)
{
case EMIE_LMOUSE_PRESSED_DOWN:
MouseState.LeftButtonDown = true;
break;
case EMIE_LMOUSE_LEFT_UP:
MouseState.LeftButtonDown = false;
break;
case EMIE_RMOUSE_PRESSED_DOWN:
break;
case EMIE_MOUSE_WHEEL:
if(event.MouseInput.Wheel < 0 )
{
}
else if(event.MouseInput.Wheel > 0 )
{
}
break;
case EMIE_MOUSE_MOVED:
break;
default:
break;
}
}
return false;
}
s32 mouseDeltaX;
s32 mouseDeltaY;
bool Keys[KEY_KEY_CODES_COUNT];
bool KeysTemp[KEY_KEY_CODES_COUNT];
bool Move;
s32 mouseX;
s32 mouseY;
private:
};
#endif // EVENTRECEIVER_H
#include "../include/Faerie.h"
#include "../include/EventReceiver.h"
#include <irrlicht.h>
Faerie::Faerie()
{
//ctor
}
Faerie::~Faerie()
{
//dtor
}
void Faerie::Initialize(IrrlichtDevice *device,scene::ITriangleSelector* mapSelector,s32 n)
{
//
status = true;
speed = 3.f;
if(!device)
return;
f_device = device;
//
scene::IAnimatedMesh* mesh;
ISceneManager* smgr = f_device->getSceneManager();
mesh = smgr->getMesh("../../media/sydney.md2");
faerieNode = smgr->addAnimatedMeshSceneNode(mesh);
smgr->addTextSceneNode(device->getGUIEnvironment()->getBuiltInFont(),
L"sydney.md2",
video::SColor(255,255,255,255), faerieNode);
//
faerieNode->setPosition(vector3df(-40,150,40));
faerieNode->setScale(vector3df(1,1,1));
IVideoDriver* driver = f_device->getVideoDriver();
pFaerie = faerieNode->getPosition();
faerieNode->setMaterialTexture(0,driver->getTexture("../../media/sydney.BMP"));
//
//faerieNode->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(faerieNode->isDebugDataVisible()^scene::EDS_MESH_WIRE_OVERLAY));
faerieNode->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(faerieNode->isDebugDataVisible()^scene::EDS_BBOX));
//faerieNode->setAnimationSpeed(13);
//faerieNode->setMD2Animation(EMAT_STAND);
//faerieNode->setMD2Animation(EMAT_STAND);
//faerieNode->setScale(vector3df(4.8f,4.8f,4.8f));
if(n!=1)
{
faerieNode->setName((core::stringw)n+"sydney");
}
faerieNode->setMaterialFlag(video::EMF_LIGHTING, false);
scene::ITriangleSelector* selector = 0;
selector = smgr->createTriangleSelector(faerieNode);
faerieNode->setTriangleSelector(selector);
selector->drop(); // We're done with this selector, so drop it now.
//
scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
mapSelector, faerieNode, faerieNode->getBoundingBox().MaxEdge,
core::vector3df(0,-10,0),
core::vector3df(0,-7,0));
faerieNode->addAnimator(anim);
anim->drop();
anim = 0;
}
void Faerie::OnAnima(cEventReceiver* eventReceiver)
{
//std::cout<<faerieNode->getPosition().X<<","<<faerieNode->getPosition().Y<<","<<faerieNode->getPosition().Z<<std::endl;
if(eventReceiver->Keys[KEY_KEY_W])
{
if(status)
{
status = false;
faerieNode->setMD2Animation(EMAT_RUN);
}
if(eventReceiver->Move)
{
Move();
}
}
else
{
status = true;
faerieNode->setMD2Animation(EMAT_STAND);
}
if(eventReceiver->Keys[KEY_KEY_A])
{
if (f_device->getTimer()->getTime() > lasttick + 10)
{
lasttick = f_device->getTimer()->getTime();
Turn_face(true);
}
}
if(eventReceiver->Keys[KEY_KEY_D])
{
if (f_device->getTimer()->getTime() > lasttick + 10)
{
lasttick = f_device->getTimer()->getTime();
Turn_face(false);
}
}
if(eventReceiver->GetMouseState().LeftButtonDown)
{
std::cout<<"--------------------war-----------------------"<<std::endl;
faerieNode->setMD2Animation(EMAT_ATTACK);
}else
{
}
/*if(eventReceiver->mouseDeltaX>0)
{
Turn_face(true);
}
else if(eventReceiver->mouseDeltaX<0)
{
Turn_face(false);
}*/
}
void Faerie::Move()
{
pFaerie = faerieNode->getPosition();
pX = cos(faerieNode->getRotation().Y*PI/180)*speed;
pZ = -sin(faerieNode->getRotation().Y*PI/180)*speed;
faerieNode->setPosition(vector3df(pFaerie.X+pX,faerieNode->getPosition().Y,pFaerie.Z+pZ));
}
//
void Faerie::Turn_face(bool leftOrRight)
{
pR = faerieNode->getRotation().Y;
if(leftOrRight)
{
pR -=6;
if(pR<0) pR = 360 + pR;
}
else
{
pR +=6;
if(pR>360) pR = pR - 360;
}
faerieNode->setRotation(vector3df(faerieNode->getRotation().X,
pR,faerieNode->getRotation().Z));
}