|
Correction refusée
|
15-03-2014 07:54:50
|
jonath313
|
Texte original:
Bonjour tout les monde, Pour ceux que çà intéresse, j'ai pris un peut de mon temps pour faire une camera à la troisième personne, la plus simple possible et en m'inspirant d'autres codes trouvé sur le net. Tout d'abord une petite classe camera pour accueillir notre unique fonction :S (camera.h) Code c++ :#ifndef CAMERA_H
#define CAMERA_H
#include <stdlib.h>
#include <stdio.h>
#include <cstdio>
#include <string>
#include <iostream>
#include <direct.h>
#include <windows.h>
#include <time.h>
#include <irr/irrlicht.h>
/** Déclarations anticipées **/
using namespace std;
using namespace irrklang;
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
class Camera
{
public:
//! constructeur
Camera();
//! destructeur
~Camera();
void moveCameraControl(ICameraSceneNode *camera,
ISceneManager *smgr,
IAnimatedMeshSceneNode* Node,
float Horizontal,float Vertical,float VitesseCamera);
private:
float direction;
float zdirection;
protected:
};
#endif // CAMERA_H
En suite le fichier camera.cpp qui va avec : Code c++ :#include <stdlib.h>
#include <stdio.h>
#include <cstdio>
#include <string>
#include <iostream>
#include <direct.h>
#include <windows.h>
#include <time.h>
#include <cstring>
#include <sstream>
#include <irr/irrlicht.h>
#include <irrklang/irrKlang.h>
#include "Camera.h"
using namespace irr;
using namespace gui;
using namespace scene;
using namespace video;
using namespace core;
using namespace io;
enum ///***Enumeration des ID
{
};
//! constructeur
Camera::Camera():direction(0), zdirection(0)
{
//ctor
}
//! destructeur
Camera::~Camera()
{
}
void Camera::moveCameraControl(ICameraSceneNode *camera, //-----> camera crée dans le scene
ISceneManager *smgr, //-----> sceneManager
IAnimatedMeshSceneNode* Node, //-----> Node du personnage
float Horizontal,float Vertical,float VitesseCamera) //--------> Pour choisir mouvement horizontal en envoi 1.0, 0.0, 0.5 -> le dernier est la vitesse
{
core::vector3df cameraPos = camera->getAbsolutePosition();
direction = direction + VitesseCamera *(Horizontal);
zdirection = zdirection - VitesseCamera * (Vertical);
if( zdirection <- 90 )
zdirection = -90;
else
if( zdirection > 90 )
zdirection = 90;
core::vector3df playerPos = Node->getPosition();
float xf = playerPos.X - cos( direction * PI / 180.0f ) * 64.0f;
float yf = playerPos.Y - sin( zdirection * PI / 180.0f ) * 64.0f;
float zf = playerPos.Z + sin( direction * PI / 180.0f ) * 64.0f;
camera->setPosition( core::vector3df( xf, yf, zf ) );
camera->setTarget( core::vector3df( playerPos.X, playerPos.Y+25.0f, playerPos.Z ) );
//Node->setRotation( core::vector3df( 0, direction, 0 ) ); // -> Pour que le personnage suive la direction de la camera
}
Maintenant il faut juste mettre a jour la camera dans la partie jeux : Moi j'ai fais comme çà mais après il y a surement d'autres solutions ... Code c++ :#ifndef APPLICATION_H
#define APPLICATION_H
#include "IRR/IEventReceiver.h"
#include "IRR/irrArray.h"
#include <stdlib.h>
#include <stdio.h>
#include <cstdio>
#include <string>
#include <iostream>
#include <direct.h>
#include <windows.h>
#include <time.h>
#include <irr/irrlicht.h>
#include "Camera.h" // -------------------------------> A ne pas oublier
/** Déclarations anticipées **/
using namespace std;
using namespace irrklang;
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
class Application : public irr::IEventReceiver // On dérive la classe Application pour gérer les événements
{
public:
//! constructeur
Application();
//! destructeur
virtual ~Application();
//! créé l'environnement Irrlicht
bool run();
//! Boucle de rendu
void rendu();
//! gestion des événements
bool OnEvent(const irr::SEvent& event);
//! Mouvement de la camera
void UpdateCameraMovement(); //-------------------------> Pour mettre a jour la position de la camera
protected:
//! MEMBRES
irr::IrrlichtDevice *device;
irr::video::IVideoDriver *driver;
irr::scene::ISceneManager *smgr;
irr::gui::IGUIEnvironment *env;
//cameras
ICameraSceneNode *camera[2]={0,0}; //----> Deux camera mais une seule suffit ;)
IAnimatedMeshSceneNode *model_node; //----> le personnage
bool cameraH_Positif; //-------------------> Pour les Evénements on va pouvoir déterminer quel mouvement de camera réaliser
bool cameraH_Negatif;
bool cameraV_Positif;
bool cameraV_Negatif;
Camera came; // ---------------------------> On cree un objet camera
private:
};
#endif // APPLICATION_H
Et pour finir la partie du jeux .cpp Code c++ : void Application::UpdateCameraMovement(){
if(cameraV_Positif == true){
came.moveCameraControl(camera[0],smgr,model_node,0,1,0.5);
}
if(cameraV_Negatif == true){
came.moveCameraControl(camera[0],smgr,model_node,0,-1,0.5);
}
if(cameraH_Positif == true){
came.moveCameraControl(camera[0],smgr,model_node,1,0,0.5);
}
if(cameraH_Negatif == true){
came.moveCameraControl(camera[0],smgr,model_node,-1,0,0.5);
}
if(cameraV_Positif == false || cameraV_Negatif == false || cameraH_Positif == false || cameraH_Negatif == false){
came.moveCameraControl(camera[0],smgr,model_node,0,0,0);
}
}
bool Application::OnEvent(const SEvent& event){
switch(event.EventType)
{
case EET_KEY_INPUT_EVENT:
{
// si on appuie sur echap
if(event.KeyInput.Key == KEY_ESCAPE && event.KeyInput.PressedDown)
{
// on ferme l'application
printf("FERMETURE");
device->closeDevice();
return true;
}
if(event.KeyInput.Key == irr::KEY_KEY_Z)
{
if(event.KeyInput.PressedDown == true) //Si il s'agit d'un appui
cameraV_Positif = true; //-------------------------------------------------> Mouvement vertical positif
//Sinon c'est un relachement
else cameraV_Positif = false;
return true;
}
if(event.KeyInput.Key == irr::KEY_KEY_S)
{
if(event.KeyInput.PressedDown == true)
cameraV_Negatif = true; //-------------------------------------------------> Mouvement vertical negatif
else cameraV_Negatif = false;
return true;
}
if(event.KeyInput.Key == irr::KEY_KEY_Q)
{
if(event.KeyInput.PressedDown == true) //Si il s'agit d'un appui
cameraH_Positif = true; //-------------------------------------------------> Mouvement horizontal positif
//Sinon c'est un relachement
else cameraH_Positif = false;
return true;
}
if(event.KeyInput.Key == irr::KEY_KEY_D)
{
if(event.KeyInput.PressedDown == true)
cameraH_Negatif = true; //-------------------------------------------------> Mouvement horizontal negatif
else cameraH_Negatif = false;
return true;
}
}
break;
default: break;
}
}
Puis dans la boucle de rendu : UpdateCameraMovement();
Voila même si c'est pas grand chose, j’espère que çà sera utile... Bonne continuation.
Correction proposée:
Bonjour tout les monde, Pour ceux que çà intéresse, j'ai pris un peut de mon temps pour faire une camera à la troisième personne, la plus simple possible et en m'inspirant d'autres codes trouvé sur le net. Tout d'abord une petite classe camera pour accueillir notre unique fonction :S (camera.h) Code c++ :#ifndef CAMERA_H
#define CAMERA_H
#include <irr/irrlicht.h>
/** Déclarations anticipées **/
using namespace std;
using namespace irrklang;
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
class Camera
{
public:
//! constructeur
Camera();
//! destructeur
~Camera();
void moveCameraControl(ICameraSceneNode *camera,
ISceneManager *smgr,
IAnimatedMeshSceneNode* Node,
float Horizontal,float Vertical,float VitesseCamera);
private:
float direction;
float zdirection;
protected:
};
#endif // CAMERA_H
En suite le fichier camera.cpp qui va avec : Code c++ :
#include "Camera.h"
//using namespace ...
//! constructeur
Camera::Camera():direction(0), zdirection(0)
{
//ctor
}
//! destructeur
Camera::~Camera()
{
}
void Camera::moveCameraControl(ICameraSceneNode *camera, //-----> camera crée dans le scene
ISceneManager *smgr, //-----> sceneManager
IAnimatedMeshSceneNode* Node, //-----> Node du personnage
float Horizontal,float Vertical,float VitesseCamera) //--------> Pour choisir mouvement horizontal en envoi 1.0, 0.0, 0.5 -> le dernier est la vitesse
{
core::vector3df cameraPos = camera->getAbsolutePosition();
direction = direction + VitesseCamera *(Horizontal);
zdirection = zdirection - VitesseCamera * (Vertical);
if( zdirection <- 90 )
zdirection = -90;
else
if( zdirection > 90 )
zdirection = 90;
core::vector3df playerPos = Node->getPosition();
float xf = playerPos.X - cos( direction * PI / 180.0f ) * 64.0f;
float yf = playerPos.Y - sin( zdirection * PI / 180.0f ) * 64.0f;
float zf = playerPos.Z + sin( direction * PI / 180.0f ) * 64.0f;
camera->setPosition( core::vector3df( xf, yf, zf ) );
camera->setTarget( core::vector3df( playerPos.X, playerPos.Y+25.0f, playerPos.Z ) );
//Node->setRotation( core::vector3df( 0, direction, 0 ) ); // -> Pour que le personnage suive la direction de la camera
}
Maintenant il faut juste mettre a jour la camera dans la partie jeux : Moi j'ai fais comme çà mais après il y a surement d'autres solutions ... [Code=cpp]#ifndef APPLICATION_H #define APPLICATION_H #include "IRR/IEventReceiver.h" #include "IRR/irrArray.h" #include <irr/irrlicht.h> #include "Camera.h" // --------------------------
|
|
Correction refusée
|
15-03-2014 07:52:23
|
jonath313
|
Texte original:
Bonjour tout les monde, Pour ceux que çà intéresse, j'ai pris un peut de mon temps pour faire une camera à la troisième personne, la plus simple possible et en m'inspirant d'autres codes trouvé sur le net. Tout d'abord une petite classe camera pour accueillir notre unique fonction :S (camera.h) Code c++ :#ifndef CAMERA_H
#define CAMERA_H
#include <stdlib.h>
#include <stdio.h>
#include <cstdio>
#include <string>
#include <iostream>
#include <direct.h>
#include <windows.h>
#include <time.h>
#include <irr/irrlicht.h>
/** Déclarations anticipées **/
using namespace std;
using namespace irrklang;
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
class Camera
{
public:
//! constructeur
Camera();
//! destructeur
~Camera();
void moveCameraControl(ICameraSceneNode *camera,
ISceneManager *smgr,
IAnimatedMeshSceneNode* Node,
float Horizontal,float Vertical,float VitesseCamera);
private:
float direction;
float zdirection;
protected:
};
#endif // CAMERA_H
En suite le fichier camera.cpp qui va avec : Code c++ :#include <stdlib.h>
#include <stdio.h>
#include <cstdio>
#include <string>
#include <iostream>
#include <direct.h>
#include <windows.h>
#include <time.h>
#include <cstring>
#include <sstream>
#include <irr/irrlicht.h>
#include <irrklang/irrKlang.h>
#include "Camera.h"
using namespace irr;
using namespace gui;
using namespace scene;
using namespace video;
using namespace core;
using namespace io;
enum ///***Enumeration des ID
{
};
//! constructeur
Camera::Camera():direction(0), zdirection(0)
{
//ctor
}
//! destructeur
Camera::~Camera()
{
}
void Camera::moveCameraControl(ICameraSceneNode *camera, //-----> camera crée dans le scene
ISceneManager *smgr, //-----> sceneManager
IAnimatedMeshSceneNode* Node, //-----> Node du personnage
float Horizontal,float Vertical,float VitesseCamera) //--------> Pour choisir mouvement horizontal en envoi 1.0, 0.0, 0.5 -> le dernier est la vitesse
{
core::vector3df cameraPos = camera->getAbsolutePosition();
direction = direction + VitesseCamera *(Horizontal);
zdirection = zdirection - VitesseCamera * (Vertical);
if( zdirection <- 90 )
zdirection = -90;
else
if( zdirection > 90 )
zdirection = 90;
core::vector3df playerPos = Node->getPosition();
float xf = playerPos.X - cos( direction * PI / 180.0f ) * 64.0f;
float yf = playerPos.Y - sin( zdirection * PI / 180.0f ) * 64.0f;
float zf = playerPos.Z + sin( direction * PI / 180.0f ) * 64.0f;
camera->setPosition( core::vector3df( xf, yf, zf ) );
camera->setTarget( core::vector3df( playerPos.X, playerPos.Y+25.0f, playerPos.Z ) );
//Node->setRotation( core::vector3df( 0, direction, 0 ) ); // -> Pour que le personnage suive la direction de la camera
}
Maintenant il faut juste mettre a jour la camera dans la partie jeux : Moi j'ai fais comme çà mais après il y a surement d'autres solutions ... Code c++ :#ifndef APPLICATION_H
#define APPLICATION_H
#include "IRR/IEventReceiver.h"
#include "IRR/irrArray.h"
#include <stdlib.h>
#include <stdio.h>
#include <cstdio>
#include <string>
#include <iostream>
#include <direct.h>
#include <windows.h>
#include <time.h>
#include <irr/irrlicht.h>
#include "Camera.h" // -------------------------------> A ne pas oublier
/** Déclarations anticipées **/
using namespace std;
using namespace irrklang;
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
class Application : public irr::IEventReceiver // On dérive la classe Application pour gérer les événements
{
public:
//! constructeur
Application();
//! destructeur
virtual ~Application();
//! créé l'environnement Irrlicht
bool run();
//! Boucle de rendu
void rendu();
//! gestion des événements
bool OnEvent(const irr::SEvent& event);
//! Mouvement de la camera
void UpdateCameraMovement(); //-------------------------> Pour mettre a jour la position de la camera
protected:
//! MEMBRES
irr::IrrlichtDevice *device;
irr::video::IVideoDriver *driver;
irr::scene::ISceneManager *smgr;
irr::gui::IGUIEnvironment *env;
//cameras
ICameraSceneNode *camera[2]={0,0}; //----> Deux camera mais une seule suffit ;)
IAnimatedMeshSceneNode *model_node; //----> le personnage
bool cameraH_Positif; //-------------------> Pour les Evénements on va pouvoir déterminer quel mouvement de camera réaliser
bool cameraH_Negatif;
bool cameraV_Positif;
bool cameraV_Negatif;
Camera came; // ---------------------------> On cree un objet camera
private:
};
#endif // APPLICATION_H
Et pour finir la partie du jeux .cpp Code c++ : void Application::UpdateCameraMovement(){
if(cameraV_Positif == true){
came.moveCameraControl(camera[0],smgr,model_node,0,1,0.5);
}
if(cameraV_Negatif == true){
came.moveCameraControl(camera[0],smgr,model_node,0,-1,0.5);
}
if(cameraH_Positif == true){
came.moveCameraControl(camera[0],smgr,model_node,1,0,0.5);
}
if(cameraH_Negatif == true){
came.moveCameraControl(camera[0],smgr,model_node,-1,0,0.5);
}
if(cameraV_Positif == false || cameraV_Negatif == false || cameraH_Positif == false || cameraH_Negatif == false){
came.moveCameraControl(camera[0],smgr,model_node,0,0,0);
}
}
bool Application::OnEvent(const SEvent& event){
switch(event.EventType)
{
case EET_KEY_INPUT_EVENT:
{
// si on appuie sur echap
if(event.KeyInput.Key == KEY_ESCAPE && event.KeyInput.PressedDown)
{
// on ferme l'application
printf("FERMETURE");
device->closeDevice();
return true;
}
if(event.KeyInput.Key == irr::KEY_KEY_Z)
{
if(event.KeyInput.PressedDown == true) //Si il s'agit d'un appui
cameraV_Positif = true; //-------------------------------------------------> Mouvement vertical positif
//Sinon c'est un relachement
else cameraV_Positif = false;
return true;
}
if(event.KeyInput.Key == irr::KEY_KEY_S)
{
if(event.KeyInput.PressedDown == true)
cameraV_Negatif = true; //-------------------------------------------------> Mouvement vertical negatif
else cameraV_Negatif = false;
return true;
}
if(event.KeyInput.Key == irr::KEY_KEY_Q)
{
if(event.KeyInput.PressedDown == true) //Si il s'agit d'un appui
cameraH_Positif = true; //-------------------------------------------------> Mouvement horizontal positif
//Sinon c'est un relachement
else cameraH_Positif = false;
return true;
}
if(event.KeyInput.Key == irr::KEY_KEY_D)
{
if(event.KeyInput.PressedDown == true)
cameraH_Negatif = true; //-------------------------------------------------> Mouvement horizontal negatif
else cameraH_Negatif = false;
return true;
}
}
break;
default: break;
}
}
Puis dans la boucle de rendu : UpdateCameraMovement();
Voila même si c'est pas grand chose, j’espère que çà sera utile... Bonne continuation.
Correction proposée:
Bonjour tout les monde, Pour ceux que çà intéresse, j'ai pris un peut de mon temps pour faire une camera à la troisième personne, la plus simple possible et en m'inspirant d'autres codes trouvé sur le net. Tout d'abord une petite classe camera pour accueillir notre unique fonction :S (camera.h) Code c++ :#ifndef CAMERA_H
#define CAMERA_H
#include <irr/irrlicht.h>
/** Déclarations anticipées **/
using namespace std;
using namespace irrklang;
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
class Camera
{
public:
//! constructeur
Camera();
//! destructeur
~Camera();
void moveCameraControl(ICameraSceneNode *camera,
ISceneManager *smgr,
IAnimatedMeshSceneNode* Node,
float Horizontal,float Vertical,float VitesseCamera);
private:
float direction;
float zdirection;
protected:
};
#endif // CAMERA_H
En suite le fichier camera.cpp qui va avec : Code c++ :
#include "Camera.h"
//using namespace ...
//! constructeur
Camera::Camera():direction(0), zdirection(0)
{
//ctor
}
//! destructeur
Camera::~Camera()
{
}
void Camera::moveCameraControl(ICameraSceneNode *camera, //-----> camera crée dans le scene
ISceneManager *smgr, //-----> sceneManager
IAnimatedMeshSceneNode* Node, //-----> Node du personnage
float Horizontal,float Vertical,float VitesseCamera) //--------> Pour choisir mouvement horizontal en envoi 1.0, 0.0, 0.5 -> le dernier est la vitesse
{
core::vector3df cameraPos = camera->getAbsolutePosition();
direction = direction + VitesseCamera *(Horizontal);
zdirection = zdirection - VitesseCamera * (Vertical);
if( zdirection <- 90 )
zdirection = -90;
else
if( zdirection > 90 )
zdirection = 90;
core::vector3df playerPos = Node->getPosition();
float xf = playerPos.X - cos( direction * PI / 180.0f ) * 64.0f;
float yf = playerPos.Y - sin( zdirection * PI / 180.0f ) * 64.0f;
float zf = playerPos.Z + sin( direction * PI / 180.0f ) * 64.0f;
camera->setPosition( core::vector3df( xf, yf, zf ) );
camera->setTarget( core::vector3df( playerPos.X, playerPos.Y+25.0f, playerPos.Z ) );
//Node->setRotation( core::vector3df( 0, direction, 0 ) ); // -> Pour que le personnage suive la direction de la camera
}
Maintenant il faut juste mettre a jour la camera dans la partie jeux : Moi j'ai fais comme çà mais après il y a surement d'autres solutions ... Code c++ :#ifndef APPLICATION_H
#define APPLICATION_H
#include "IRR/IEventReceiver.h"
#include "IRR/irrArray.h"
#include <irr/irrlicht.h>
#include "Camera.h" // -------------------------------> A ne pas oublier
/** Déclarations anticipées **/
//using namespace ...
class Application : public irr::IEventReceiver // On dérive la classe Application pour gérer les événements
{
public:
//! constructeur
Application();
//! destructeur
virtual ~Application();
//! créé l'environnement Irrlicht
bool run();
//! Boucle de rendu
void rendu();
//! gestion des événements
bool OnEvent(const irr::SEvent& event);
//! Mouvement de la camera
void UpdateCameraMovement(); //-------------------------> Pour mettre a jour la position de la camera
protected:
//! MEMBRES
irr::IrrlichtDevice *device;
irr::video::IVideoDriver *driver;
irr::scene::ISceneManager *smgr;
irr::gui::IGUIEnvironment *env;
//cameras
ICameraSceneNode *camera[2]={0,0}; //----> Deux camera mais une seule suffit ;)
IAnimatedMeshSceneNode *model_node; //----> le personnage
bool cameraH_Positif; //-------------------> Pour les Evénements on va pouvoir déterminer quel mouvement de camera réaliser
bool cameraH_Negatif;
bool cameraV_Positif;
bool cameraV_Negatif;
Camera came; // ---------------------------> On cree un objet camera
private:
};
#endif // APPLICATION_H
Et pour finir la partie du jeux application.cpp [Code=cpp] void Application::UpdateCameraMovement(){ if(cameraV_Positif == true){ came.moveCameraControl(camera[0],smgr,model_node,0,1,0.5); } if(cameraV_Negatif == true){ came.moveCameraControl(camera[0],smgr,model_node,0,-1,0.5); } if(cameraH_Positif == true){ came.moveCameraControl(camera[0],smgr,model_node,1,0,0.5); } if(cameraH_Negatif == true){ came.moveCameraControl(camera[0],smgr,model_node,-1,0,0.5); } if(cameraV_Positif == false || cameraV_Negatif == false || cameraH_Positif == false || cameraH_Negatif == false){ came.moveCameraControl(camera[0],smgr,model_node,0,0,0); } } bool Application::OnEvent(const SEvent& event){ switch(event.EventType) { case EET_KEY_INPUT_EVENT: { // si on appuie sur echap if(event.KeyInput.Key == KEY_ESCAPE && event.KeyInput.PressedDown) { // on ferme l'application printf("FERMETURE"); device->closeDevice(); return true; } if(event.KeyInput.Key == irr::KEY_KEY_Z) { if(event.KeyInput.PressedDown == true) //Si il s'agit d'un appui cameraV_Positif = true; //-------------------------------------------------> Mouvement vertical positif //Sinon c'est un relachement else cameraV_Positif = false; %
|
|
Création du message
|
13-03-2014 15:01:52
|
jonath313
|
Bonjour tout les monde, Pour ceux que çà intéresse, j'ai pris un peut de mon temps pour faire une camera à la troisième personne, la plus simple possible et en m'inspirant d'autres codes trouvé sur le net. Tout d'abord une petite classe camera pour accueillir notre unique fonction :S (camera.h) Code c++ :#ifndef CAMERA_H
#define CAMERA_H
#include <stdlib.h>
#include <stdio.h>
#include <cstdio>
#include <string>
#include <iostream>
#include <direct.h>
#include <windows.h>
#include <time.h>
#include <irr/irrlicht.h>
/** Déclarations anticipées **/
using namespace std;
using namespace irrklang;
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
class Camera
{
public:
//! constructeur
Camera();
//! destructeur
~Camera();
void moveCameraControl(ICameraSceneNode *camera,
ISceneManager *smgr,
IAnimatedMeshSceneNode* Node,
float Horizontal,float Vertical,float VitesseCamera);
private:
float direction;
float zdirection;
protected:
};
#endif // CAMERA_H
En suite le fichier camera.cpp qui va avec : Code c++ :#include <stdlib.h>
#include <stdio.h>
#include <cstdio>
#include <string>
#include <iostream>
#include <direct.h>
#include <windows.h>
#include <time.h>
#include <cstring>
#include <sstream>
#include <irr/irrlicht.h>
#include <irrklang/irrKlang.h>
#include "Camera.h"
using namespace irr;
using namespace gui;
using namespace scene;
using namespace video;
using namespace core;
using namespace io;
enum ///***Enumeration des ID
{
};
//! constructeur
Camera::Camera():direction(0), zdirection(0)
{
//ctor
}
//! destructeur
Camera::~Camera()
{
}
void Camera::moveCameraControl(ICameraSceneNode *camera, //-----> camera crée dans le scene
ISceneManager *smgr, //-----> sceneManager
IAnimatedMeshSceneNode* Node, //-----> Node du personnage
float Horizontal,float Vertical,float VitesseCamera) //--------> Pour choisir mouvement horizontal en envoi 1.0, 0.0, 0.5 -> le dernier est la vitesse
{
core::vector3df cameraPos = camera->getAbsolutePosition();
direction = direction + VitesseCamera *(Horizontal);
zdirection = zdirection - VitesseCamera * (Vertical);
if( zdirection <- 90 )
zdirection = -90;
else
if( zdirection > 90 )
zdirection = 90;
core::vector3df playerPos = Node->getPosition();
float xf = playerPos.X - cos( direction * PI / 180.0f ) * 64.0f;
float yf = playerPos.Y - sin( zdirection * PI / 180.0f ) * 64.0f;
float zf = playerPos.Z + sin( direction * PI / 180.0f ) * 64.0f;
camera->setPosition( core::vector3df( xf, yf, zf ) );
camera->setTarget( core::vector3df( playerPos.X, playerPos.Y+25.0f, playerPos.Z ) );
//Node->setRotation( core::vector3df( 0, direction, 0 ) ); // -> Pour que le personnage suive la direction de la camera
}
Maintenant il faut juste mettre a jour la camera dans la partie jeux : Moi j'ai fais comme çà mais après il y a surement d'autres solutions ... Code c++ :#ifndef APPLICATION_H
#define APPLICATION_H
#include "IRR/IEventReceiver.h"
#include "IRR/irrArray.h"
#include <stdlib.h>
#include <stdio.h>
#include <cstdio>
#include <string>
#include <iostream>
#include <direct.h>
#include <windows.h>
#include <time.h>
#include <irr/irrlicht.h>
#include "Camera.h" // -------------------------------> A ne pas oublier
/** Déclarations anticipées **/
using namespace std;
using namespace irrklang;
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
class Application : public irr::IEventReceiver // On dérive la classe Application pour gérer les événements
{
public:
//! constructeur
Application();
//! destructeur
virtual ~Application();
//! créé l'environnement Irrlicht
bool run();
//! Boucle de rendu
void rendu();
//! gestion des événements
bool OnEvent(const irr::SEvent& event);
//! Mouvement de la camera
void UpdateCameraMovement(); //-------------------------> Pour mettre a jour la position de la camera
protected:
//! MEMBRES
irr::IrrlichtDevice *device;
irr::video::IVideoDriver *driver;
irr::scene::ISceneManager *smgr;
irr::gui::IGUIEnvironment *env;
//cameras
ICameraSceneNode *camera[2]={0,0}; //----> Deux camera mais une seule suffit ;)
IAnimatedMeshSceneNode *model_node; //----> le personnage
bool cameraH_Positif; //-------------------> Pour les Evénements on va pouvoir déterminer quel mouvement de camera réaliser
bool cameraH_Negatif;
bool cameraV_Positif;
bool cameraV_Negatif;
Camera came; // ---------------------------> On cree un objet camera
private:
};
#endif // APPLICATION_H
Et pour finir la partie du jeux .cpp Code c++ : void Application::UpdateCameraMovement(){
if(cameraV_Positif == true){
came.moveCameraControl(camera[0],smgr,model_node,0,1,0.5);
}
if(cameraV_Negatif == true){
came.moveCameraControl(camera[0],smgr,model_node,0,-1,0.5);
}
if(cameraH_Positif == true){
came.moveCameraControl(camera[0],smgr,model_node,1,0,0.5);
}
if(cameraH_Negatif == true){
came.moveCameraControl(camera[0],smgr,model_node,-1,0,0.5);
}
if(cameraV_Positif == false || cameraV_Negatif == false || cameraH_Positif == false || cameraH_Negatif == false){
came.moveCameraControl(camera[0],smgr,model_node,0,0,0);
}
}
bool Application::OnEvent(const SEvent& event){
switch(event.EventType)
{
case EET_KEY_INPUT_EVENT:
{
// si on appuie sur echap
if(event.KeyInput.Key == KEY_ESCAPE && event.KeyInput.PressedDown)
{
// on ferme l'application
printf("FERMETURE");
device->closeDevice();
return true;
}
if(event.KeyInput.Key == irr::KEY_KEY_Z)
{
if(event.KeyInput.PressedDown == true) //Si il s'agit d'un appui
cameraV_Positif = true; //-------------------------------------------------> Mouvement vertical positif
//Sinon c'est un relachement
else cameraV_Positif = false;
return true;
}
if(event.KeyInput.Key == irr::KEY_KEY_S)
{
if(event.KeyInput.PressedDown == true)
cameraV_Negatif = true; //-------------------------------------------------> Mouvement vertical negatif
else cameraV_Negatif = false;
return true;
}
if(event.KeyInput.Key == irr::KEY_KEY_Q)
{
if(event.KeyInput.PressedDown == true) //Si il s'agit d'un appui
cameraH_Positif = true; //-------------------------------------------------> Mouvement horizontal positif
//Sinon c'est un relachement
else cameraH_Positif = false;
return true;
}
if(event.KeyInput.Key == irr::KEY_KEY_D)
{
if(event.KeyInput.PressedDown == true)
cameraH_Negatif = true; //-------------------------------------------------> Mouvement horizontal negatif
else cameraH_Negatif = false;
return true;
}
}
break;
default: break;
}
}
Puis dans la boucle de rendu : UpdateCameraMovement();
Voila même si c'est pas grand chose, j’espère que çà sera utile... Bonne continuation.
|