1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #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]; }; #endif |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | #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; } |
Voila si vous avez des question demander !!
Dernière modification par pspmy (11-11-2008 14:29:00)
Hors ligne
bah c'est drolement chouette , merci !
petite suggestion pour l'ameliorer >
au lieu d'etre bloquée derrière le mesh , il serait sympa que la camera soit un peu plus libre ...
Un peu comme dans le code du wiki d'ogre >http://www.ogre3d.org/wiki/index.php/3rd_person_camera_system_tutorial
mais il faudrait l'adapter pour irrlicht .Sinon , c'est vraiment sympa de ta part de faire profiter de tes codes
encore merci !
Hors ligne
Merci ce script à l'air sympa à la base c'est ce que le cherche. Je rajouterais le mouvement de la caméra avec la clique droit de la souris plus tard.
Hors ligne