j'ai réussi ! ^^
merci énormément de ton aide.
le seul truc que j'ai pas compris, c'est que si a la fin j'mettais
mycursor->setPosition(ScreenCenter);, la souris ne revenais pas au milieu donc j'ai galéré pas mal pour le découvrir, et pour aranger ça bah j'me suis pas pris la tête, j'ai juste mis
mycursor->setPosition(400,300); alors que
ScreenCenter à les même valeurs.
un bug peut etre, j'sais pas..
'fin bref, là, ça marche nikel et j'l'ai mis sur le positionnement de la caméra aussi, merci encore.
maintenant faut que je limite la distance de la caméra quand elle est déplacé et j'ajouterai ensuite le zoom avec la molette de la souris, ça devrait etre moin compliqué. ^^
voice mon code complet :
#include <irrlicht.h>
#include <iostream>
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
#pragma comment(lib, "Irrlicht.lib")
//---> DEFINITION <---///////////////////////////////////////////////////////////////////////////
position2d<f32> cursor; //position du curseur de la souris
position2d<f32> ScreenCenter; //centre de l'ecran bien que le curseur soit pas d'accord avec ça lol
f32 RotationSpeed= 1.0; //determine la vitesse de rotation du joueur.
vector3df v; //rotation du joueur
vector3df c; //position de la camera
///////////////////////////////////////////////////////////////////////////////////////////////////
//---> EVEN RECEIVER <---////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
class MyEventReceiver: public IEventReceiver
{
public: virtual bool OnEvent(const SEvent& event)
{
if (event.EventType == EET_MOUSE_INPUT_EVENT)
{
cursor.X = event.MouseInput.X;
cursor.Y = event.MouseInput.Y;
}
return 0;
}
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////// //////////////////////////////////////////////////////
////////////////////////////// MAIN //////////////////////////////////////////////////////
////////////////////////////// //////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
MyEventReceiver receiver; //initialisation du receiver
IrrlichtDevice* device = createDevice(
EDT_OPENGL, //EDT_SOFTWARE, EDT_NULL, EDT_DIRECT3D8, EDT_DIRECT3D9
dimension2d<s32>(800, 600),
32,
true, //fullscreen ?
false, false, //?
&receiver); //node
if (device == 0)return 1; //exit if creation failed
IVideoDriver* driver = device->getVideoDriver();
ISceneManager* smgr = device->getSceneManager();
ICursorControl* myCursor = device->getCursorControl();
///////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////// //////////////////////////////////////////////////////
////////////////////////////// TERRAIN //////////////////////////////////////////////////////
////////////////////////////// //////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
ITerrainSceneNode* terrain = smgr->addTerrainSceneNode(
"heightmap/F18.bmp", //heightmap
0, //parent
-1, //ID
vector3df(0.f, 0.f, 0.f), //position
vector3df(0.f, 0.f, 0.f), //rotaton ?
vector3df(200, 22, 200), //scaling de la heightmap / taille
SColor(255, 255, 255, 250), //couleur des vertex
5, //detail du node
ETPS_33, //patchsize wth ??
3, //smoothfactor
false); //add terrain node even with empty heightmap
terrain->setMaterialFlag(EMF_LIGHTING, false); //lumière ?
terrain->setMaterialTexture(0, driver->getTexture("terrain/herbe.jpg")); //texture
terrain->setMaterialType(EMT_DETAIL_MAP);
terrain->scaleTexture(200, 16000); //scaling de la texture
//SKYBOX
driver->setTextureCreationFlag(ETCF_CREATE_MIP_MAPS, false); //true ?
smgr->addSkyBoxSceneNode(
driver->getTexture("skybox/siege_up.jpg"), //up
driver->getTexture("skybox/siege_dn.jpg"), //down
driver->getTexture("skybox/siege_lf.jpg"), //left
driver->getTexture("skybox/siege_rt.jpg"), //right
driver->getTexture("skybox/siege_bk.jpg"), //back
driver->getTexture("skybox/siege_ft.jpg")); //front
driver->setTextureCreationFlag(ETCF_CREATE_MIP_MAPS, true); //?
///////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////// ////////////////////////////////////////////////
////////////////////////////// TRIANGLE SELECTOR ////////////////////////////////////////////////
////////////////////////////// ////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
ISceneNode* terrainNode = 0;
if(terrain)
terrainNode = smgr->addMeshSceneNode(terrain->getMesh());
ITriangleSelector* selector = 0;
if(terrainNode)
{
terrainNode->setPosition(vector3df(-1370,-130,-1400));
selector = smgr->createTerrainTriangleSelector(terrain, 0);
terrainNode->setTriangleSelector(selector);
selector->drop();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////// ////////////////////////////////////////////////////
////////////////////////////// PLAYER ////////////////////////////////////////////////////
////////////////////////////// ////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
ISceneNode* playerNode = smgr->addEmptySceneNode(); //3rd person
playerNode->setPosition(vector3df(19000, 3500, 37000));
IAnimatedMesh* playerMesh= smgr->getMesh("models/faerie.md2"); //model
IAnimatedMeshSceneNode* visualNode= smgr->addAnimatedMeshSceneNode(playerMesh, playerNode);
if (visualNode)
{
visualNode->setMaterialFlag(EMF_LIGHTING, false);
visualNode->setFrameLoop(0, 310);
visualNode->setMaterialTexture(0, driver->getTexture("models/faerie.bmp")); //texture
visualNode->setRotation(core::vector3df(0,90,0)); //player dos a la caméra
}
//COLLISION
const aabbox3df& box= playerNode->getBoundingBox();
const f32 height= (box.MaxEdge.Y - box.MinEdge.Y)/ 2.f;
const f32 verticalOffset= -box.MinEdge.Y - box.MaxEdge.Y;
const f32 waist= max_(box.MaxEdge.X - box.MinEdge.X, box.MaxEdge.Z - box.MinEdge.Z)/ 2.f;
ISceneNodeAnimator* anim= smgr->createCollisionResponseAnimator
(
selector, //triangle selector
playerNode, //scene node
vector3df(30,25,30), //ellipsoidRadius //position du perso 30;60;30
vector3df(0,-3,0), //gravity
vector3df(0,0,0), //ellipsoidTranslation
0.0005f //slidingValue
);
playerNode->addAnimator(anim);
anim->drop();
///////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////// ////////////////////////////////////////////////////
////////////////////////////// CAMERA ////////////////////////////////////////////////////
////////////////////////////// ////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
ICameraSceneNode* myCamera =
smgr->addCameraSceneNode(
playerNode, //parent
vector3df(0,75,100), //angleX, angleH, distance
playerNode->getPosition(), //vector3df(0,0,0), //look at...
-1); //ID
myCamera->setFarValue(4000); //drawing distance
///////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////// ////////////////////////////////////////////////////
////////////////////////////// CURSOR ////////////////////////////////////////////////////
////////////////////////////// ////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
myCursor->setVisible(false);
///////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////// ////////////////////////////////////////////////////
////////////////////////////// RENDERING ////////////////////////////////////////////////////
////////////////////////////// ////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
IGUIEnvironment* guienv = device->getGUIEnvironment();
IGUIStaticText* debug_panel = guienv->addStaticText(L"",rect<s32>(15, 15, 50, 30),true,true,0,-1,false); //100 : L - h
int lastFPS = -1;
while(device->run())
if (device->isWindowActive())
{
driver->beginScene(true, true, video::SColor(0,200,200,200));
//--------------------------------------------------------------------------------------------------------
ScreenCenter.X= 400;
ScreenCenter.Y= 300;
v.X=0;
v.Y=playerNode->getRotation().Y+RotationSpeed*(ScreenCenter.X-cursor.X)*-1;
v.Z=0;
c.X=0;
c.Y=myCamera->getPosition().Y+RotationSpeed*(ScreenCenter.Y-cursor.Y)*-1;
c.Z=100;
//--------------------------------------------------------------------------------------------------------
myCamera->setTarget(playerNode->getPosition()); //refresh caméra target
myCamera->setPosition(c);
playerNode->setRotation(v);
myCursor->setPosition(400,300); //remise a zéro du cursor.
smgr->drawAll();
//s32 myx = cursor.X;
s32 framerate = driver->getFPS();
debug_panel->setText(stringw(framerate).c_str()); //framerate
debug_panel->setOverrideColor(SColor(255,255,255,255));
debug_panel->setBackgroundColor(SColor(255,0,0,0));
device->getGUIEnvironment()->drawAll();
driver->endScene();
}
device->drop();
return 0;
}