Historique des modifications - Message

Message #6055

Sujet: Mouvement & Caméra FPS


Type Date Auteur Contenu
Dernière modification 20-02-2009 11:43:07 NeoCrysis
  • ---------------------------

RESOLU, merci Capry wink
  • ---(solution en bas)-----


Bonjour (c'est mon premier message, je me suis retenu le plus possible je vous assure !),

Je fais appel à vous car j'ai un problème (et oui sinon je ne posterai pas xD) :
  • Cela fait X temps (2 jours plus ou moins) que je ne parviens pas à faire bouger ma petite Sydney (fox ?) comme il le faudrait, elle ne suit pas la direction de ma souris, si je regarde au nord-est et que j'appuie sur la touche avancer, ça ira tout droit et non au nord-est.


Je sais que cette question à déjà été posée et que vous devez en avoir raz la casquette de voir défiler des débutants en quete du FPS fabuleux, mais ce n'est pas mon cas, je veux apprendre et ce problème est un frein à mon imagination ^^.

Ca fait 3 jours que j'utilise Irrlicht (avant je faisais du PHP/JS/C++/Qt), donc c'est tout nouveau, je ne me suis pas encore bien familiarisé avec ce merveilleux outil wink
Ce qui veut dire aussi que mon code est surement mal fichu et faux, mais je vous le donne quand même smile (Il fonctionne parfaitement à l'heure actuelle)

main.cpp (utile ?..)
int main(void)
{
    Demo demo(false);
    demo.initWorld();
    demo.initPerso();
    demo.initCamera();
    demo.initLumiere();

    demo.startGame();

    return 0;
}

demo.h
#ifndef H_DEMO
#define H_DEMO

#include "FollowingCamera.h"
#include <IRR/irrlicht.h>

class Demo
{
public :
    Demo(bool fullscreenc);
    ~Demo();
    void initWorld(); // Initialisation de l'environnement
    void initPerso(); // Initialisation des acteurs
    void initCamera(); // Initialisation de la camera
    void initLumiere(); // Initialisation de la lumière
    void initKeys(); // Initialisation des commandes
    void startGame(); // Lancement du jeu
    void changeView();
    bool cam_thirdPerson;
    //virtual bool OnEvent(const SEvent& event);
    IrrlichtDevice* device;
    irr::scene::IAnimatedMeshSceneNode* Nmodele;
    FollowingCamera* MaCamera;
    ITriangleSelector* selector;
    ITriangleSelector* selector2;

    ITerrainSceneNode* terrain;

private :
    bool fullscreen;

    scene::ICameraSceneNode* camera;
    video::IVideoDriver* driver;
    scene::ISceneManager *sceneManager;

    scene::IAnimatedMesh *room;
    ISceneNode* q3node;
    ISceneNode* q3node2;

    irr::scene::IAnimatedMeshMD2* modele;

    scene::ILightSceneNode* lumiere;

    irr::SKeyMap keyMap[5];


};
#endif

demo.cpp
#include "Demo.h"
#include "CEventReceiver.h"
#include "FollowingCamera.h"
#include <iostream>

using namespace irr;
using namespace std;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

Demo::Demo(bool f)
: fullscreen(f)
{
    cam_thirdPerson = true; // Vue 1ère personne (false) | 3ème personne (true)
}

Demo::~Demo() { }

void Demo::initWorld()
{
    //Device, driver et graphe de scene

    device = irr::createDevice(video::EDT_OPENGL,
    core::dimension2d<s32>(800,600),32,fullscreen,false,false);

    driver = device->getVideoDriver ();
    sceneManager = device->getSceneManager ();

    //On rend invisible le curseur
    device->getCursorControl ()-> setVisible (true);
    ICursorControl* myCursor = device->getCursorControl();

    device->getFileSystem()->addZipFileArchive("map-20kdm2.pk3");
    room = sceneManager->getMesh("20kdm2.bsp");

    if(cam_thirdPerson) {
        // COLLISION CAMERA
        q3node = 0;
        if (room)
            q3node = sceneManager->addOctTreeSceneNode(room->getMesh(0));
        selector = 0;
        if (q3node)
        {
            q3node->setPosition(vector3df(-1370,-130,-1400));
            selector = sceneManager->createOctTreeTriangleSelector(room->getMesh(0), q3node, 128);
            q3node->setTriangleSelector(selector);
            selector->drop();
        }
    }
    if (room == 0)
    {
        std::cout << "--> Probleme de chargement de la salle" << std::endl;
    }

}

void Demo::startGame() {

    CEventReceiver receiver(Nmodele);
    device->setEventReceiver(&receiver);

    while (device->run())
    {
        sceneManager->getActiveCamera();
        driver->beginScene(true, true, video::SColor(0,200,200,200));

        if(cam_thirdPerson) {
            if(MaCamera) {MaCamera->Update();}
            receiver.majPosMesh(*MaCamera->getCam(), true);
        } else {
            receiver.majPosMesh(*camera);
            Nmodele->setRotation(vector3df(0,(camera->getRotation().Y - 90),0)); // Ne bouge que de gauche à droite le perso
        }

        sceneManager->drawAll ();
        driver->endScene ();
    }

    device->drop ();
}

void Demo::initPerso() {

    //Sydney
    modele = (irr::scene::IAnimatedMeshMD2*)sceneManager->getMesh("sydney.md2");
    Nmodele = sceneManager->addAnimatedMeshSceneNode(modele);

    if(Nmodele) {
        //On modifie les proprietes de Sydney
        Nmodele->setMaterialFlag(irr::video::EMF_LIGHTING, false);
        Nmodele->setFrameLoop(0, 0);
        Nmodele->setMaterialTexture( 0, driver->getTexture("sydney.bmp") );

        Nmodele->setPosition(vector3df(0,0,0));
        Nmodele->setRotation(vector3df(0,0,0)); // dos a la camera
    }
    // COLLISION PERSONNAGE
    q3node2 = 0;
    if (room)
        q3node2 = sceneManager->addOctTreeSceneNode(room->getMesh(0));
    selector2 = 0;

    if (q3node2)
    {
        q3node2->setPosition(vector3df(-1370,-130,-1400));
        selector2 = sceneManager->createOctTreeTriangleSelector(room->getMesh(0), q3node2, 128);
        q3node2->setTriangleSelector(selector2);
        selector2->drop();
    }

    ISceneNodeAnimator* CollisionCamera = sceneManager->createCollisionResponseAnimator(
    selector2, Nmodele, core::vector3df(10,30,10),
    vector3df(0,0,0),
    vector3df(0,0,0));
    Nmodele->addAnimator(CollisionCamera);
    CollisionCamera->drop();


}

void Demo::initCamera() {
    //La camera
    if(cam_thirdPerson) {
        MaCamera = new FollowingCamera(Nmodele, sceneManager,
                                                      true,           // Pour utiliser une position initiale.
                                                      selector,       // Pour les collisions.
                                                      100,            // Distance.
                                                      50,             // Hauteur.
                                                      30,             // Delta cible.
                                                      vector3df(-50,200,-120));   // Position initiale.
        sceneManager->setActiveCamera( MaCamera->getCam() );
    } else {
        if(camera=sceneManager->addCameraSceneNodeFPS (0, 100.0f, 300.0f, -1, false, 5, false, 0.4)) {
            cout << "--> Camera chargee" << endl;
            //camera->setPosition(vector3df(0,20,-30));
            //camera->setParent(Nmodele);
            camera->setPosition(vector3df(0,0,0)  + core::vector3df(0,25,0));
            camera->setRotation(vector3df(0,90,0));
        }
        else
            cout << "--> Erreur lors du chargement de la camera" << endl;
    }

}

void Demo::initLumiere() {
/*
    if(lumiere = sceneManager->addLightSceneNode(Nmodele, core::vector3df(150,210,250),video::SColorf(0.4f, 0.4f, 0.4f, 0.4f), 30.0f))
        cout << "--> Lumiere ambiante ok" << endl;
    else
        cout << "--> Erreur lors du chargement de la lumiere ambiante" << endl;
*/
}

void Demo::changeView() {
    cam_thirdPerson = true;
}

Comme vous pouvez le constater j'utilise la classe FollowingCamera (pour avoir la vue à la 3ème personne), mais c'est juste pour tester, elle ne sert strictement à rien wink

Pendant ces deux jours j'ai essayé tout et n'importe quoi et je suis à bout ...
Si quelqu'un pouvait me donner un indice, ça m'aiderait énormément.

Cordialement moi smile
Création du message 19-02-2009 23:16:11 NeoCrysis
  • ---------------------------

RESOLU, merci Capry wink
  • ---(solution en bas)-----


Bonjour (c'est mon premier message, je me suis retenu le plus possible je vous assure !),

Je fais appel à vous car j'ai un problème (et oui sinon je ne posterai pas xD) :
  • Cela fait X temps (2 jours plus ou moins) que je ne parviens pas à faire bouger ma petite Sydney (fox ?) comme il le faudrait, elle ne suit pas la direction de ma souris, si je regarde au nord-est et que j'appuie sur la touche avancer, ça ira tout droit et non au nord-est.


Je sais que cette question à déjà été posée et que vous devez en avoir raz la casquette de voir défiler des débutants en quete du FPS fabuleux, mais ce n'est pas mon cas, je veux apprendre et ce problème est un frein à mon imagination ^^.

Ca fait 3 jours que j'utilise Irrlicht (avant je faisais du PHP/JS/C++/Qt), donc c'est tout nouveau, je ne me suis pas encore bien familiarisé avec ce merveilleux outil wink
Ce qui veut dire aussi que mon code est surement mal fichu et faux, mais je vous le donne quand même smile (Il fonctionne parfaitement à l'heure actuelle)

main.cpp (utile ?..)
int main(void)
{
    Demo demo(false);
    demo.initWorld();
    demo.initPerso();
    demo.initCamera();
    demo.initLumiere();

    demo.startGame();

    return 0;
}

demo.h
#ifndef H_DEMO
#define H_DEMO

#include "FollowingCamera.h"
#include <IRR/irrlicht.h>

class Demo
{
public :
    Demo(bool fullscreenc);
    ~Demo();
    void initWorld(); // Initialisation de l'environnement
    void initPerso(); // Initialisation des acteurs
    void initCamera(); // Initialisation de la camera
    void initLumiere(); // Initialisation de la lumière
    void initKeys(); // Initialisation des commandes
    void startGame(); // Lancement du jeu
    void changeView();
    bool cam_thirdPerson;
    //virtual bool OnEvent(const SEvent& event);
    IrrlichtDevice* device;
    irr::scene::IAnimatedMeshSceneNode* Nmodele;
    FollowingCamera* MaCamera;
    ITriangleSelector* selector;
    ITriangleSelector* selector2;

    ITerrainSceneNode* terrain;

private :
    bool fullscreen;

    scene::ICameraSceneNode* camera;
    video::IVideoDriver* driver;
    scene::ISceneManager *sceneManager;

    scene::IAnimatedMesh *room;
    ISceneNode* q3node;
    ISceneNode* q3node2;

    irr::scene::IAnimatedMeshMD2* modele;

    scene::ILightSceneNode* lumiere;

    irr::SKeyMap keyMap[5];


};
#endif

demo.cpp
#include "Demo.h"
#include "CEventReceiver.h"
#include "FollowingCamera.h"
#include <iostream>

using namespace irr;
using namespace std;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

Demo::Demo(bool f)
: fullscreen(f)
{
    cam_thirdPerson = true; // Vue 1ère personne (false) | 3ème personne (true)
}

Demo::~Demo() { }

void Demo::initWorld()
{
    //Device, driver et graphe de scene

    device = irr::createDevice(video::EDT_OPENGL,
    core::dimension2d<s32>(800,600),32,fullscreen,false,false);

    driver = device->getVideoDriver ();
    sceneManager = device->getSceneManager ();

    //On rend invisible le curseur
    device->getCursorControl ()-> setVisible (true);
    ICursorControl* myCursor = device->getCursorControl();

    device->getFileSystem()->addZipFileArchive("map-20kdm2.pk3");
    room = sceneManager->getMesh("20kdm2.bsp");

    if(cam_thirdPerson) {
        // COLLISION CAMERA
        q3node = 0;
        if (room)
            q3node = sceneManager->addOctTreeSceneNode(room->getMesh(0));
        selector = 0;
        if (q3node)
        {
            q3node->setPosition(vector3df(-1370,-130,-1400));
            selector = sceneManager->createOctTreeTriangleSelector(room->getMesh(0), q3node, 128);
            q3node->setTriangleSelector(selector);
            selector->drop();
        }
    }
    if (room == 0)
    {
        std::cout << "--> Probleme de chargement de la salle" << std::endl;
    }

}

void Demo::startGame() {

    CEventReceiver receiver(Nmodele);
    device->setEventReceiver(&receiver);

    while (device->run())
    {
        sceneManager->getActiveCamera();
        driver->beginScene(true, true, video::SColor(0,200,200,200));

        if(cam_thirdPerson) {
            if(MaCamera) {MaCamera->Update();}
            receiver.majPosMesh(*MaCamera->getCam(), true);
        } else {
            receiver.majPosMesh(*camera);
            Nmodele->setRotation(vector3df(0,(camera->getRotation().Y - 90),0)); // Ne bouge que de gauche à droite le perso
        }

        sceneManager->drawAll ();
        driver->endScene ();
    }

    device->drop ();
}

void Demo::initPerso() {

    //Sydney
    modele = (irr::scene::IAnimatedMeshMD2*)sceneManager->getMesh("sydney.md2");
    Nmodele = sceneManager->addAnimatedMeshSceneNode(modele);

    if(Nmodele) {
        //On modifie les proprietes de Sydney
        Nmodele->setMaterialFlag(irr::video::EMF_LIGHTING, false);
        Nmodele->setFrameLoop(0, 0);
        Nmodele->setMaterialTexture( 0, driver->getTexture("sydney.bmp") );

        Nmodele->setPosition(vector3df(0,0,0));
        Nmodele->setRotation(vector3df(0,0,0)); // dos a la camera
    }
    // COLLISION PERSONNAGE
    q3node2 = 0;
    if (room)
        q3node2 = sceneManager->addOctTreeSceneNode(room->getMesh(0));
    selector2 = 0;

    if (q3node2)
    {
        q3node2->setPosition(vector3df(-1370,-130,-1400));
        selector2 = sceneManager->createOctTreeTriangleSelector(room->getMesh(0), q3node2, 128);
        q3node2->setTriangleSelector(selector2);
        selector2->drop();
    }

    ISceneNodeAnimator* CollisionCamera = sceneManager->createCollisionResponseAnimator(
    selector2, Nmodele, core::vector3df(10,30,10),
    vector3df(0,0,0),
    vector3df(0,0,0));
    Nmodele->addAnimator(CollisionCamera);
    CollisionCamera->drop();


}

void Demo::initCamera() {
    //La camera
    if(cam_thirdPerson) {
        MaCamera = new FollowingCamera(Nmodele, sceneManager,
                                                      true,           // Pour utiliser une position initiale.
                                                      selector,       // Pour les collisions.
                                                      100,            // Distance.
                                                      50,             // Hauteur.
                                                      30,             // Delta cible.
                                                      vector3df(-50,200,-120));   // Position initiale.
        sceneManager->setActiveCamera( MaCamera->getCam() );
    } else {
        if(camera=sceneManager->addCameraSceneNodeFPS (0, 100.0f, 300.0f, -1, false, 5, false, 0.4)) {
            cout << "--> Camera chargee" << endl;
            //camera->setPosition(vector3df(0,20,-30));
            //camera->setParent(Nmodele);
            camera->setPosition(vector3df(0,0,0)  + core::vector3df(0,25,0));
            camera->setRotation(vector3df(0,90,0));
        }
        else
            cout << "--> Erreur lors du chargement de la camera" << endl;
    }

}

void Demo::initLumiere() {
/*
    if(lumiere = sceneManager->addLightSceneNode(Nmodele, core::vector3df(150,210,250),video::SColorf(0.4f, 0.4f, 0.4f, 0.4f), 30.0f))
        cout << "--> Lumiere ambiante ok" << endl;
    else
        cout << "--> Erreur lors du chargement de la lumiere ambiante" << endl;
*/
}

void Demo::changeView() {
    cam_thirdPerson = true;
}

Comme vous pouvez le constater j'utilise la classe FollowingCamera (pour avoir la vue à la 3ème personne), mais c'est juste pour tester, elle ne sert strictement à rien wink

Pendant ces deux jours j'ai essayé tout et n'importe quoi et je suis à bout ...
Si quelqu'un pouvait me donner un indice, ça m'aiderait énormément.

Cordialement moi smile

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
233 invités en ligne
membre en ligne: -
RSS Feed