10-11-2008 03:42:44
- hardcpp
- Membres

- Date d'inscription:
- Messages: 229
- IP: 83.198.244.46
- Courriel
Voila je voudrai savoir si quelqu'un aurait une idée de comment réaliser une camera genre "World of warcraft"
- la molette permettrai de faire un zoom avant ou arière...
- avec le bouton gauche enfoncer tourner la camera autour de la cible
- avec le droit pareille sauf que qu'en on relâche le bouton la cible tourne selon l'angle de la camera...
Hors ligne
10-11-2008 06:31:56
- ramis
- Membres
- Date d'inscription:
- Messages: 92
- IP: 92.133.110.184
- Courriel
http://forum.irrlicht.fr/viewtopic.php?id=416
un petit tour par là te sera utile ![]()
Hors ligne
10-11-2008 10:46:15
- hardcpp
- Membres

- Date d'inscription:
- Messages: 229
- IP: 83.198.244.46
- Courriel
merci de ta réponse mais je vais mieux m'expliquez:
- la molette permettrai de faire un zoom avant ou arière...
- avec le bouton gauche enfoncer tourner la camera autour de la cible
- avec le droit pareille sauf que qu'en on relâche le bouton la cible tourne selon l'angle de la camera...
voila
Hors ligne
11-11-2008 01:47:59
11-11-2008 08:39:22
- ramis
- Membres
- Date d'inscription:
- Messages: 92
- IP: 92.133.110.184
- Courriel
en gros tu veux une camera à la neverwinter nights , non ?
J'en ai vu une sur le forum officiel , mais j'ai pas réussi à la faire marcher >
http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=3245
Ca m'interesse aussi , alors si quelqu'un a une idée de la cause de ces messages d'erreurs (obtenus en copie-collant juste la classe , hein , sans rien modifier)
-------------- Build: Debug in 3rdperson ---------------
Compiling: 3rdperson.cpp
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp: In member function `void cFollowCamera::Update()':
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:24: erreur: « cData » n'a pas été déclaré
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:24: erreur: « Get » n'a pas été déclaré dans cet horizon
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:26: erreur: « cData » n'a pas été déclaré
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:30: erreur: « cData » n'a pas été déclaré
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:32: erreur: « cData » n'a pas été déclaré
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp: In constructor `cFollowCamera::cFollowCamera(irr::scene::ISceneNode*)':
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:75: erreur: « cData » n'a pas été déclaré
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:75: erreur: « Get » n'a pas été déclaré dans cet horizon
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:75: attention : variable « Get » inutilisée
Process terminated with status 1 (0 minutes, 0 seconds)
8 errors, 0 warningsPeut etre est ce dû au changement de version d'Irrlicht ? mais cData est bien un attribut de IEventReceiver ?non ?
Hors ligne
11-11-2008 09:56:15
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 90.56.146.231
- Courriel
ramis Ecris:
mais cData est bien un attribut de IEventReceiver ?non ?
En fait non
Comme le dit NightBird, la classe cData est un singleton dans lequel il a prépositionné des donné qui vont justement servir dans son code de camera.
Vite fait sur le gaz, voici des codes qui sont valide.
d'abord la classe cData, un singleton, il faut bien sur alimenter au préalable avant emploi
class cData
{
protected:
float cameraspeed;
int width;
int height;
IrrlichtDevice *device;
static cData *data_instance;
cData()
{
}
~cData()
{
}
public:
static cData* Get()
{
if(data_instance==0)
{
data_instance = new cData;
}
return data_instance;
}
static void Kill()
{
if (data_instance!=0)
{
delete data_instance;
data_instance=0;
}
}
float CameraSpeed() { return cameraspeed; }
int Width() { return width; }
int Height(){ return height; }
IrrlichtDevice * Device() { return device; }
void SetCameraSpeed(float value) { cameraspeed= value; }
void Width(int value) { width=value; }
void Height(int value){ height=value; }
void Device(IrrlichtDevice *dev ) { device=dev; }
};
cData *cData::data_instance=0;puis le code de cFollowCamera, légèrement modifié pour employer la cData
class cFollowCamera: public IEventReceiver
{
public:
ISceneNode *Target()
{
return m_target;
}
void Target(ISceneNode *value)
{
m_target = value;
m_lastTargetPos = value->getPosition();
m_target->grab();
}
void Update()
{
if (!m_Cam || !m_target) return;
if (MouseX <= cData::Get()->Width()*.05f)
{
m_updated = true;
m_yRotationAngle += cData::Get()->CameraSpeed();
while (m_yRotationAngle > 2*PI)
m_yRotationAngle -= 2*PI;
}
else if (MouseX >= cData::Get()->Width()*.95f)
{
m_updated = true;
m_yRotationAngle -= cData::Get()->CameraSpeed();
while (m_yRotationAngle < 2*PI)
m_yRotationAngle += 2*PI;
}
if (m_lastTargetPos != m_target->getPosition())
{
m_updated = true;
m_lastTargetPos = m_target->getPosition();
}
if (m_updated)
{
m_updated = false;
vector3df m_Camerapos = m_lastTargetPos;
m_Camerapos.X += distance*sin(m_yRotationAngle);
m_Camerapos.Z += distance*cos(m_yRotationAngle);
m_Camerapos.Y += distance;
m_Cam->setPosition(m_Camerapos);
m_Cam->setTarget(m_lastTargetPos);
}
}
void Zoom(float amount)
{
distance *= amount;
if (distance == 0) distance = 2; //there should be more elaborate capping of things here..
m_updated = true;
}
bool OnEvent(SEvent event)
{
if (event.EventType == EET_MOUSE_INPUT_EVENT)
{
switch (event.MouseInput.Event)
{
case EMIE_MOUSE_WHEEL:
Zoom(((-event.MouseInput.Wheel)+1)/2+.5f); //make it be from .5 to 1.5
return true;
break;
case EMIE_MOUSE_MOVED:
MouseX = event.MouseInput.X;
return true;
break;
}
}
return false;
}
cFollowCamera(ISceneNode *target)
{
Target(target);
m_Cam = cData::Get()->Device()->getSceneManager()->addCameraSceneNode(0,m_lastTargetPos + vector3df(0,20,20),m_lastTargetPos);
m_yRotationAngle = 0.0f;
distance = 20;
}
~cFollowCamera(void)
{
m_target->drop();
}
private:
ISceneNode* m_target;
ICameraSceneNode* m_Cam;
vector3df m_lastTargetPos;
bool m_updated;
int MouseX;
float distance;
float m_yRotationAngle; //the angle about the Y axis
};Voilà, c'est pas testé et c'est codé au saut du lit, donc à valider
Force et sagesse...
Hors ligne
11-11-2008 11:47:27
- ramis
- Membres
- Date d'inscription:
- Messages: 92
- IP: 92.133.110.184
- Courriel
merci pour ton code tmyke ![]()
Encore quelques erreurs mais je sens que ca va finir par marcher ^^
-------------- Build: Debug in 3rdperson ---------------
Compiling: 3rdperson.cpp
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp: In static member function `static cData* cData::Get()':
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:33: attention : « return » manquant dans une fonction devant retourner une valeur
Compiling: main.cpp
In file included from /home/romain/sdz/tutoirrlicht/3rdperson/main.cpp:2:
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp: In static member function `static cData* cData::Get()':
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:33: attention : « return » manquant dans une fonction devant retourner une valeur
Linking console executable: bin/Debug/3rdperson
obj/Debug/main.o:/usr/include/c++/3.4/bits/locale_facets.tcc:2444: multiple definition of `cData::data_instance'
obj/Debug/3rdperson.o:/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:148: first defined here
collect2: ld a retourné 1 code d'état d'exécution
Process terminated with status 1 (0 minutes, 2 seconds)
4 errors, 0 warningsVoilà les erreurs .Je pense que rajouter return data_instance; dans static cData* Get() pourrait resoudre un probleme (enfin , je crois ? o_o )
Merci beaucoup de ton aide en tout cas
Hors ligne
11-11-2008 11:51:27
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 90.56.146.231
- Courriel
C'est de ma faute, j'ai oublié une ou deux lignes, le code initiale plus haut à été mis à jour.
Désolé, mal réveillé.![]()
Force et sagesse...
Hors ligne
11-11-2008 12:15:58
- hardcpp
- Membres

- Date d'inscription:
- Messages: 229
- IP: 83.198.244.46
- Courriel
finalement jai développez la mienne si sa interrese quelqun
Hors ligne
11-11-2008 12:19:14
- ramis
- Membres
- Date d'inscription:
- Messages: 92
- IP: 92.133.110.184
- Courriel
je veux bien voir comment tu as fait ![]()
parsque moi --'
merci beaucoup à tmyke , en tout cas !
Hors ligne
11-11-2008 12:23:02
- hardcpp
- Membres

- Date d'inscription:
- Messages: 229
- IP: 83.198.244.46
- Courriel
event.h
#ifndef __EVENT__
#define __EVENT__
#include <irr/irrlicht.h>
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace gui;
using namespace io;
class MyReceiver : public IEventReceiver
{
public:
virtual bool OnEvent(const SEvent& event)
{
if(event.EventType == irr::EET_KEY_INPUT_EVENT)
{
keys[event.KeyInput.Key] = event.KeyInput.PressedDown;
return false;
}
return false;
}
bool keys[KEY_KEY_CODES_COUNT];
};
#endifHors ligne
11-11-2008 12:32:36
- hardcpp
- Membres

- Date d'inscription:
- Messages: 229
- IP: 83.198.244.46
- Courriel
main.cpp
#include <irr/irrlicht.h>
#include "event.h"
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace gui;
using namespace io;
IrrlichtDevice *device;
ISceneManager* smgr;
IVideoDriver* driver;
vector3df playerLastPosition;
bool playerMove;
int main()
{
MyReceiver receiver;
device = createDevice(EDT_OPENGL, dimension2d<s32>(800, 600),32, false, true, true);
driver = device->getVideoDriver();
smgr = device->getSceneManager();
ICameraSceneNode *camera = smgr->addCameraSceneNode();
IAnimatedMesh* mesh = smgr->getMesh("data\\\\game\\\\players\\\\1\\\\1.md2");
IAnimatedMeshSceneNode *player = smgr->addAnimatedMeshSceneNode(mesh);
this->device->setEventReceiver(receiver);
camera->setParent(player);
while(this->device->run())
{
this->driver->beginScene(true, true, SColor(255,100,101,140));
smgr->drawAll();
driver->endScene();
//==============================================================//
//=== Recuperation de la position du player pour l'animation ===//
//==============================================================//
playerLastPosition = player->getPosition();
//==============================================================//
//=== Actualisation de la camera ===//
//==============================================================//
camera->setTarget(player->getPosition());
camera->setPosition(vector3df(-60,50,0));
//=============================================================//
//=== Deplacement du personnage ===//
//=============================================================//
if (receiver.keys[KEY_UP]) //Avance
{
vector3df facing(cos(player->getRotation().Y * PI/180.0f), 0, -sin(player->getRotation().Y * PI/180.0f));
facing.normalize();
vector3df newPos = player->getPosition() + (facing - (facing * (f32)0.5));
player->setPosition(newPos);
}
if (receiver.keys[KEY_DOWN]) //Recule
{
vector3df facing(cos(player->getRotation().Y * PI/180.0f),0,-sin(player->getRotation().Y * PI/180.0f));
facing.normalize();
vector3df newPos = player->getPosition() - (facing- (facing * (f32)0.7));
player->setPosition(newPos);
playerMove = true;
}
if (receiver.keys[KEY_LEFT]) //Rotation vers la gauche
{
player->setRotation(player->getRotation() - vector3df(0,1,0));
}
if (receiver.keys[KEY_RIGHT]) //Rotation vers la droite
{
player->setRotation(player->getRotation() + vector3df(0,1,0));
}
//==============================================================//
//=== Animation du personnage ===//
//==============================================================//
if (playerLastPosition != player->getPosition()) //Si le joueur bouge
{
if (playerMove == false) //Si l'animation de deplacement n'est pas activer
{
player->setMD2Animation(EMAT_RUN); //Change l'animation du joueur
playerMove = true;
}
}
else //Si le joueur ne bouge plus
{
if (playerMove == true) //Si l'animation "courire" a ete activer
{
player->setMD2Animation(EMAT_STAND); //Change l'animation du joueur
playerMove = false;
}
}
if (receiver.keys[KEY_ESCAPE])
{
exit(0);
}
}
return 0;
}Hors ligne
11-11-2008 12:59:05
- ramis
- Membres
- Date d'inscription:
- Messages: 92
- IP: 92.133.110.184
- Courriel
merci ! c'est sympa !
(par contre j'ai toujours un bug avec la camera NWM :'( ...avec le code identique au tien tmyke , j'doit vraiment être un boulet--' :
-multiple definition of `cData::data_instance'
-157: first defined here
2 errors, 0 warningspourtant ce code > cData *cData::data_instance=0;
devrait bien fonctionner , non ???)
Hors ligne
11-11-2008 13:00:09
- hardcpp
- Membres

- Date d'inscription:
- Messages: 229
- IP: 83.198.244.46
- Courriel
moi je dit faudrai ouvrire une categorie aide - camera xD
Hors ligne
11-11-2008 13:13:18
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 90.56.146.231
- Courriel
ramis Ecris:
(par contre j'ai toujours un bug avec la camera NWM :-multiple definition of `cData::data_instance' -157: first defined here 2 errors, 0 warnings
pourtant ce code > cData *cData::data_instance=0;
devrait bien fonctionner , non ???)
dans quelle partie de ton code définis-tu 'cData *cData::data_instance=0;', cela doit être en globale normalement...
pspmy Ecris:
moi je dit faudrai ouvrire une categorie aide - camera xD
Il est difficile de créer une section pour chaque type de node du moteur, même si certaines amènent à des question ou des codes réguliers.
Par contre, pour s'y retrouver, mettre en en-tête du sujet un [CAMERA] peut aider e nterme de lisibilité des sujets (en complement du système de recherche du forum)
Une fois le Wiki réactivé, alors il y aura des sections spécifiques pour des petits code et aide....
Force et sagesse...
Hors ligne
11-11-2008 13:22:01
- hardcpp
- Membres

- Date d'inscription:
- Messages: 229
- IP: 83.198.244.46
- Courriel
ou faire des sous section dans la section aide c++
sinon tu ne pense coi de mon code ?
et j'oublier de vous dire ce seai biezn de crée une rubrique archive pour aide c++
car sa deborde de vieu topic
Hors ligne
11-11-2008 13:47:50
- ramis
- Membres
- Date d'inscription:
- Messages: 92
- IP: 92.133.110.184
- Courriel
tmyke > Je l'ai définie juste en dessous de la classe cData , juste entre les deux classes .Comme toi dans ton code , d'ailleurs .
A propos du wiki , c'est pour bientôt ?? ![]()
Hors ligne
11-11-2008 13:48:07
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 90.56.146.231
- Courriel
pspmy Ecris:
ou faire des sous section dans la section aide c++
L'idée est bonne, et je pense qu'effectivement ranger certains codes dans des sous-rubriques pourrait permettre de
gagner en lisibilité et souplesse, je vais voir cela, et de déterminer les sous rubriques ...
pspmy Ecris:
sinon tu ne pense coi de mon code ?
C'est du tout bon, j'ai pris le temps d'essayer, cela tourne, donc pas de soucis, j'ai vue que tu avais créé un topic avec ce code dans la
rubrique 'Routines' et tu as bien fais.
pspmy Ecris:
et j'oublier de vous dire ce serai bien de crée une rubrique archive pour aide c++
car sa déborde de vieux topic
Certains code ne sont pas jeunes, bien que le forum ne soit pas si vieux, mais si je créé des sous rubrique, je m'évertuerais à y placer
tout les codes qui s'y rapportent pour aérer les choses.
Force et sagesse...
Hors ligne
11-11-2008 13:53:17
- ramis
- Membres
- Date d'inscription:
- Messages: 92
- IP: 92.133.110.184
- Courriel
eh ben
que de bonnes idées en quelque minutes ![]()
bon , la camera NWM ne m'aime pas , dirait on ...
>Erreur de segmentation (core dumped)<
Tant pis ![]()
Hors ligne
11-11-2008 15:40:08
- hardcpp
- Membres

- Date d'inscription:
- Messages: 229
- IP: 83.198.244.46
- Courriel
et une autre idée : une new categorie : code snipet
Hors ligne
11-11-2008 17:47:52
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 90.56.146.231
- Courriel
ça vient direct du forum off ça non ?
Je vais voir dans les jours a venir comment aussi ré-architecturer la parite Tuto/Aides/Snipet etc...![]()
Force et sagesse...
Hors ligne
11-11-2008 18:10:19
- hardcpp
- Membres

- Date d'inscription:
- Messages: 229
- IP: 83.198.244.46
- Courriel
aufait esque je peut postuler pour etre moderateur ?
Hors ligne
11-11-2008 18:25:21
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 90.56.146.231
- Courriel
Pour être franc, pour le moment le forum n'a pas trop besoin de moderateur. Je suis la tous les jours, Izguit passe
malgrés tout régulièrement faire un petit tour, pas de spam à la con et le trafic du forum reste pour le moment
pas suffisement important pour envisager de s'attacher les services d'une armée de modérateurs.
Ceci dit, j'ai parfois des périodes ou je dois m'éloigner un peu (raisons professionnelles), et donc dans l'avenir si le site
atteint un niveau raisonnable d'affluence, et qu'il apparait que je sois obliger de laisser une ou deux personnes
dont la présence régulière garantisse la bonne tenue du forum, alors je ferais un 'recrutement'.
Pas de soucis, dans ce cas tu pourras alors postuler ![]()
Force et sagesse...
Hors ligne
11-11-2008 18:29:16
- hardcpp
- Membres

- Date d'inscription:
- Messages: 229
- IP: 83.198.244.46
- Courriel
ok merci !! je passerais souvent pour aider les autre et tan que j'i suis il serai possible de classer les routine (gui, 2d, 3d , system, ...)
Hors ligne
11-11-2008 19:08:13
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 90.56.146.231
- Courriel
pspmy Ecris:
ok merci !! je passerais souvent pour aider les autre
C'est cool de ta part, la communauté à besoin de gens qui ont une certaines fidélité, et d'un certains nombres de piliers, pour animer et
aider.
pspmy Ecris:
et tan que j'i suis il serai possible de classer les routine (gui, 2d, 3d , system, ...)
Je ne peux pas créer autant de sous-forum qu'il existe de cathegorie d'éléments ou de classes dans Irrlichrt.
Mais au fils des jours j'en créerais quelques autres malgré tout en fonction de la complexité des sujet (comme les shaders, déjà créé) ou
de leur popularités... (terrain, animation, etc...)
Force et sagesse...
Hors ligne



