Aktuelle Zeit: 12.05.2025, 23:16

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Spieler bewegen/steuern
BeitragVerfasst: 14.08.2009, 14:55 
Offline

Registriert: 14.08.2009, 13:56
Beiträge: 17
Hallo Community,
ich habe mir aus den Exampletutorials ein "Spiel"(Naja, wenn man sich das eine Auge zuhält und mit dem anderen schielt, kann man es vielleicht so nenne) zusammen geflickt. Man kann die Fee vor und zurück bewegen und sogar drehen. :P
Das Problem ist, dass wenn man die Fee dreht und sie dann nach vorne bewegt, sie sich immer noch in die Z richtung beweget und nicht in die Richtung, in die man sie gedreht hat.

Wie programmiere ich also ein gescheite Steuerung??
Freue mich auf jede Antwort!! :lol: :lol:

Hier der Code:
Code:
#include <irrlicht.h>
#include <iostream>

using namespace irr;

class MyEventReceiver : public IEventReceiver
{
public:
   virtual bool OnEvent(const SEvent& event)
   {
      if (event.EventType == irr::EET_KEY_INPUT_EVENT)
         KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown;

      return false;
   }

   virtual bool IsKeyDown(EKEY_CODE keyCode) const
   {
      return KeyIsDown[keyCode];
   }
   
   MyEventReceiver()
   {
      for (u32 i=0; i<KEY_KEY_CODES_COUNT; ++i)
         KeyIsDown[i] = false;
   }

private:
   bool KeyIsDown[KEY_KEY_CODES_COUNT];
};

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

#ifdef _IRR_WINDOWS_
#pragma comment(lib, "Irrlicht.lib")
#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif

int main()
{
    MyEventReceiver receiver;



   video::E_DRIVER_TYPE driverType;

   printf("Please select the driver you want for this example:\n"\
      " (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
      " (d) Software Renderer\n (e) Burning's Software Renderer\n"\
      " (f) NullDevice\n (otherKey) exit\n\n");

   char i;
   std::cin >> i;

   switch(i)
   {
      case 'a': driverType = video::EDT_DIRECT3D9;break;
      case 'b': driverType = video::EDT_DIRECT3D8;break;
      case 'c': driverType = video::EDT_OPENGL;   break;
      case 'd': driverType = video::EDT_SOFTWARE; break;
      case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
      case 'f': driverType = video::EDT_NULL;     break;
      default: return 0;
   }
       
    IrrlichtDevice* device = createDevice(driverType, core::dimension2d<s32>(640, 480), 16, false, false, false, &receiver);



   IVideoDriver* driver = device->getVideoDriver();
   ISceneManager* smgr = device->getSceneManager();
   IGUIEnvironment* guienv = device->getGUIEnvironment();



    //Level Map
    device->getFileSystem()->addZipFileArchive("../../media/map-20kdm2.pk3");
   
      scene::IAnimatedMesh* level_mesh = smgr->getMesh("20kdm2.bsp");
   scene::ISceneNode* level_node = 0;
   
   if (level_mesh)
      level_node = smgr->addOctTreeSceneNode(level_mesh->getMesh(0));
      scene::ITriangleSelector* selector = 0;
   
   if (level_node)
   {
      level_node->setPosition(core::vector3df(-1400,-145,-1250));
      selector = smgr->createOctTreeTriangleSelector(level_mesh->getMesh(0), level_node, 128);
      level_node->setTriangleSelector(selector);
   }
   

   
    //Player
   video::SMaterial material;
   material.setTexture(0, driver->getTexture("../../media/faerie2.bmp"));
   material.Lighting = true;
   
   scene::IAnimatedMeshSceneNode* player_node = 0;
   scene::IAnimatedMesh* faerie = smgr->getMesh("../../media/faerie.md2");

   if (faerie)
   {
      player_node = smgr->addAnimatedMeshSceneNode(faerie);
      player_node->getMaterial(0) = material;
      player_node->setPosition(core::vector3df(0,0,50));
      player_node->setScale(core::vector3df(2.f,2.f,2.f));
      player_node->setFrameLoop(0, 0);
      player_node->setAnimationSpeed(15);
                player_node->setMaterialFlag(EMF_LIGHTING, false);
                player_node->setRotation(core::vector3df(0,-90,0));
                player_node->setMD2Animation(scene::EMAT_RUN);
   }
   
   if (selector)
   {
      scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
         selector, player_node,
            core::vector3df(30,50,30),
         core::vector3df(0,-20,0),
         core::vector3df(0,0,0));
      player_node->addAnimator(anim);
      anim->drop();
   }

   
   
   scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS();
   camera->setPosition(core::vector3df(0,0,0));
   device->getCursorControl()->setVisible(false);
   
   
       
    int lastFPS = -1;
   
    u32 then = device->getTimer()->getTime();
   
    const f32 MOVEMENT_SPEED = 40.f;
   
   
   
   while(device->run())
   {
      const u32 now = device->getTimer()->getTime();
      const f32 frameDeltaTime = (f32)(now - then) / 1000.f;
      then = now;                       
       
                       
      core::vector3df player_nodePosition = player_node->getPosition();
        core::vector3df player_nodeRotation = player_node->getRotation();                 
                       
        if(receiver.IsKeyDown(irr::KEY_KEY_W))
         player_nodePosition.Z += MOVEMENT_SPEED* frameDeltaTime;
      else if(receiver.IsKeyDown(irr::KEY_KEY_S))
         player_nodePosition.Z -= MOVEMENT_SPEED* frameDeltaTime;

      if(receiver.IsKeyDown(irr::KEY_KEY_A))
         player_nodeRotation.Y -= MOVEMENT_SPEED* frameDeltaTime;
      else if(receiver.IsKeyDown(irr::KEY_KEY_D))
         player_nodeRotation.Y += MOVEMENT_SPEED* frameDeltaTime;

      player_node->setPosition(player_nodePosition);
      player_node->setRotation(player_nodeRotation);
       
       
       
        driver->beginScene(true, true, SColor(255,100,101,140));

      smgr->drawAll();
      guienv->drawAll();
      
        driver->endScene();
      
      int fps = driver->getFPS();

        if (lastFPS != fps)
         {
            core::stringw str = L"Irrlicht Engine - Game_by_Shades [";
            str += driver->getName();
            str += "] FPS:";
            str += fps;

            device->setWindowCaption(str.c_str());
            lastFPS = fps;
         }      
   }

   device->drop();
   return 0;
}


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Spieler bewegen/steuern
BeitragVerfasst: 17.08.2009, 09:12 
Offline

Registriert: 16.08.2009, 10:31
Beiträge: 7
hmm...

was ich in Deiner Bewegungsroutine vermisse ist eine Berücksichtigung der Blickrichtung. Diese sollte ungefähr so aussehen:

const float piover180 = 0.0174532925f;
...
player.xpos -= (float)sin(heading*piover180) * 0.05f;
player.zpos -= (float)cos(heading*piover180) * 0.05f;

Wenn Du jetzt Bahnhof verstehst, :?: ,empfehle ich Dir NeHe's OpenGL tutorials ( http://nehe.gamedev.net/ )
Auch wenn Du nicht unter OpenGL proggen willst, helfen diese tuts, C++ zu verstehen.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Spieler bewegen/steuern
BeitragVerfasst: 17.08.2009, 12:23 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Oder viel einfacher:

Mach aus deinem MOVEMENT_SPEED* frameDeltaTime; einen Vektor also sowas wie
Code:
core::vector3df movementZ(0,0,MOVEMENT_SPEED * frameDeltaTime);
core::vector3df movementY(0,MOVEMENT_SPEED * frameDeltaTime);


Dann rotierst du den vektor mit der Transformation des objektes:
Code:
core::matrix4 m = player_node->getAbsoluteTransformation();
m.rotateVec( movement );


Und addierst dann noch die Position des objektes hinzu:
Code:
movement += player_node->getAbsolutePosition();

player_node->setPosition( movement );


Und fertig.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Spieler bewegen/steuern
BeitragVerfasst: 18.08.2009, 19:56 
Offline

Registriert: 14.08.2009, 13:56
Beiträge: 17
Danke Yeto und Sylence für eure Tipps,
habe mich dann aber doch für diese Version entschieden:
http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=10611&highlight=3rd+person+camera


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 20 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de