Historique des modifications - Message

Message #4097

Sujet: utiliser la position relative de la souris pour définir une position ?


Type Date Auteur Contenu
Création du message 28-05-2008 01:05:51 noals
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;

}

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
116 invités en ligne
membre en ligne: -
RSS Feed