Aktuelle Zeit: 13.05.2024, 22:03

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: 3rd person ansicht - brauche hilfe
BeitragVerfasst: 01.03.2010, 20:26 
Offline

Registriert: 09.08.2009, 21:38
Beiträge: 17
Hallo zusammen :D
ich such schon seit ner weile nach einem Code für eine Simple 3rd Person anischt mit rotierenter Kamera

Bisher hab ich mir aus bruchstücken was eigenes zusammenbegebaut, was aber nicht wirklich gut funktioniert:

Fehler sind z.B.:
- Kamera ist immernoch frei bewegbar
- Wenn ich die Linke maustaste klicke springt die Kamera immer auf ihren anfangspunkt zurück


Mein code:
variablen:
Code:
scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(0, 100.0f, .3f, 0, 0, 0, true, 3.f);

vector3df getPositionOnSphere(f32 angleH, f32 angleV, f32 radius );
    vector3df m_Rot;               
    f32 m_Rad;                       

    bool m_Dragging;                   
    vector2df m_DragStart;             
    vector3df m_DragStartRotation;


im Event Reciever
Code:


   const SEvent::SMouseInput *ev = &event.MouseInput;
        if( ev->Event == EMIE_MOUSE_WHEEL )
        {
            if( ev->Wheel >= 0 )
                m_Rad -= 0.5f;
            else
                m_Rad += 0.5f;

            checkcam();
        }
        else
        {
            if( ! m_Dragging && ev->isLeftPressed() )
            {
                m_DragStart.X = ev->X;
                m_DragStart.Y = ev->Y;
                m_DragStartRotation.X = m_Rot.X;
                m_DragStartRotation.Y = m_Rot.Y;
                m_Dragging = true;
            }
            else if( m_Dragging && ! ev->isLeftPressed() )
            {
                m_Dragging = false;
            }
            else if( m_Dragging && ev->isLeftPressed() )
            {
                // Calculate a rotational offset in the range of -PI to +PI
                f32 dx = (( ev->X - m_DragStart.X ) / driver->getScreenSize().Width ) * PI;
                f32 dy = (( ev->Y - m_DragStart.Y ) / driver->getScreenSize().Height ) * PI;

                // Calculate the new total rotation
                m_Rot.X = m_DragStartRotation.X + dy;
                m_Rot.Y = m_DragStartRotation.Y + dx;

                checkcam();
            }
        }

      return false;
   }


void checkcam()
{

   //
   
   camera->setPosition(core::vector3df( m_Rot.Y, m_Rot.X, m_Rad ));
   camera->setTarget(charnode->getPosition());
   
}




in der main schleife:
Code:
f32 width = 10.0f * ( 1024.0f / 768.0f );
    f32 height = 10.0f;
   m_Rad = 7;
    m_Dragging = false;

if (mesh)
   node = smgr->addOctTreeSceneNode(mesh->getMesh(0));
         
      if (node)
         node->setPosition(core::vector3df(-1370,-130,-1400));

      selector = smgr->createOctTreeTriangleSelector(mesh->getMesh(0), node, 128);
         node->setTriangleSelector(selector);
         selector->drop();

         camera->setPosition(core::vector3df(50,50,-60));
         camera->setTarget(core::vector3df(-70,30,-60));

         scene::ISceneNodeAnimator* anim =
         smgr->createCollisionResponseAnimator(
         selector, camera, core::vector3df(30,50,30),
         core::vector3df(0,-3,0),
         core::vector3df(0,50,0));

         camera->addAnimator(anim);
         
         anim->drop();

// Level und charnode wird ohne fehler geladen

camera->setPosition(charnode->getPosition() - core::vector3df(10,0,0));
      camera->setTarget(charnode->getPosition());



Danke schonmal im vorraus ^^


Nach oben
 Profil  
 
BeitragVerfasst: 04.03.2010, 14:18 
Offline

Registriert: 14.08.2009, 13:56
Beiträge: 17
Hatte zuanfang das selbe Problem, dass ich keine gescheite 3rd Person Cam gefunden habe. Habe mir dann auch selber eine gebastelt. Bei meiner wird der Player mit wasd gesteuert und mit der Maus kann man sich umgucken/drehen.
Ich poste dir mal ein "fertiges Spiel" (hust) von mir. Ist leider sehr schlecht kommentiert und nicht gerade gut gestalltet, aber ich hoffe das es dir etwas bringt.

Main
Code:
#include <irrlicht.h>
#include <math.h>
#include <iostream>
#include "MastEventReceiver.cpp"

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

#ifdef _MSC_VER
#pragma comment(lib, "Irrlicht.lib")
#endif



int main()
{
   MastEventReceiver eventReceiver;
    eventReceiver.init();

   IrrlichtDevice* device = createDevice(video::EDT_DIRECT3D9,core::dimension2d<s32>(1400, 1050), 32, true, false, false, &eventReceiver);
   if (device == 0)
      return 1;

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


   //Level Map
   device->getFileSystem()->addZipFileArchive("media/map-20kdm2.pk3");
   
   IAnimatedMesh* levelmesh = smgr->getMesh("20kdm2.bsp");
   ISceneNode* level = 0;
   
   if (levelmesh)
      level = smgr->addOctTreeSceneNode(levelmesh->getMesh(0));
      ITriangleSelector* selector = 0;
   if (level)
   {
      level->setPosition(core::vector3df(-2800,-200,-2650));
      level->setRotation(core::vector3df(0,0,0));
      level->setScale(core::vector3df(2.f,2.f,2.f));
      selector = smgr->createOctTreeTriangleSelector(levelmesh->getMesh(0), level, 128);
      level->setTriangleSelector(selector);
   }
   


   //Skymap
   ISceneNode* SkyBox = smgr->addSkyBoxSceneNode(
      driver->getTexture("media/irrlicht2_up.jpg"),
      driver->getTexture("media/irrlicht2_dn.jpg"),
      driver->getTexture("media/irrlicht2_lf.jpg"),
      driver->getTexture("media/irrlicht2_rt.jpg"),
      driver->getTexture("media/irrlicht2_ft.jpg"),
      driver->getTexture("media/irrlicht2_bk.jpg"));



   //Player
   IAnimatedMesh* playermesh = smgr->getMesh("media/faerie.md2");
   IAnimatedMeshSceneNode* player = smgr->addAnimatedMeshSceneNode( playermesh );
   if (player)
   {   
      player->setPosition(core::vector3df(0,0,0));
      player->setRotation(core::vector3df(0,-90,0));
      player->setScale(core::vector3df(2.f,2.f,2.f));
      player->setMD2Animation(scene::EMAT_STAND);   
      player->setMaterialFlag(video::EMF_LIGHTING, false);
      player->setAnimationSpeed(2);
      player->setMaterialTexture( 0, driver->getTexture("media/faerie2.bmp"));
   }
   if (selector)
   {
      ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
         selector, player,
         vector3df(30,50,30),
         vector3df(0,-20,0),
         vector3df(0,0,0));
      player->addAnimator(anim);
      anim->drop();
   }



   //Camera
   ICameraSceneNode* camera = smgr->addCameraSceneNode();
   camera->setPosition(vector3df(0,0,0));

   //Mousecouser
   device->getCursorControl()->setVisible(false);
   device->getCursorControl()->setPosition(400,300);
   core::position2d<s32> cursorOld = device->getCursorControl()->getPosition();
   
   //Crosshair
   video::ITexture* images = driver->getTexture("media/crosshair03.png");
   driver->makeColorKeyTexture(images, core::position2d<s32>(0,0));

   //Font
   IGUIFont* font = device->getGUIEnvironment()->getFont("media/myfont.xml");
   
   //Shoot
   core::line3d<f32> line;
   line.start = camera->getPosition();
   line.end = line.start +(camera->getTarget() - line.start).normalize() * 1000.0f;

   

   //Variablen

   //Player
   float speed  = 400.0;
   float sidespeed  = 300.0;
   float rotationspeed  = 200.0;
   float jumpspeed  = 500.0;
   float highjumpspeed  = 4000.0;
   
   int move = 0;
   bool moveSTANDaktiv = 0;
   bool moveRUNaktiv = 0;
   bool moveJUMPaktiv = 0;
   
   //Camera
   f32 cameraOffset = 0.0;
   f32 cameraZoom = 70.0;
   f32 cameraAngle = 0.0;
   f32 cameraDist;

   //Selector
   scene::ISceneNode* selectedSceneNode = 0;
   scene::ISceneNode* lastSelectedSceneNode = 0;

   //FPS
   int lastFPS = -1;
   u32 then = device->getTimer()->getTime();



   while(device->run())
   {
      if (device->isWindowActive())
      {
         eventReceiver.endEventProcess();
         const u32 now = device->getTimer()->getTime();
         const f32 frameDeltaTime = (f32)(now - then) / 1000.f; // Time in seconds
         then = now;



         //Cameraposition
         vector3df playerPosition = player->getPosition();
         vector3df playerRotation = player->getRotation();


         camera->setTarget (vector3df(player->getPosition().X,player->getPosition().Y + 75,player->getPosition().Z));
         cameraDist = cameraZoom * cos(cameraAngle * 3.14159265f/180.f );
         camera->setPosition (vector3df(
               playerPosition.X - cameraDist * cos((playerRotation.Y + cameraOffset) * 3.14159265f/180.f),
            playerPosition.Y + cameraZoom * sin(cameraAngle * 3.14159265f/180.f) + 75,
               playerPosition.Z + cameraDist * sin((playerRotation.Y + cameraOffset) * 3.14159265f/180.f)
         ));

         
         
         //Playermovement/Key
         if(eventReceiver.keyDown('W'))
         {
            playerPosition.X += ( speed * frameDeltaTime * cos(playerRotation.Y * 3.14159265f/180.f));
            playerPosition.Z -= ( speed * frameDeltaTime * sin(playerRotation.Y * 3.14159265f/180.f));
            move = 2;
            player->setPosition(playerPosition);
         }
         if(eventReceiver.keyUp('W'))
         {
            move = 1;
         }
         if(eventReceiver.keyDown('S'))
         {         
            playerPosition.X -= (speed * frameDeltaTime * cos(playerRotation.Y * 3.14159265f/180.f));
            playerPosition.Z += (speed * frameDeltaTime * sin(playerRotation.Y * 3.14159265f/180.f));
            move = 2;
            player->setPosition(playerPosition);
         }
         if(eventReceiver.keyDown('Q'))
         {         
            playerRotation.Y -= rotationspeed * frameDeltaTime;
            player->setRotation(playerRotation);
         }
         if(eventReceiver.keyDown('E'))
         {         
            playerRotation.Y += rotationspeed * frameDeltaTime;
            player->setRotation(playerRotation);
         }
         if(eventReceiver.keyDown('A'))
         {         
            playerPosition.X += (sidespeed * frameDeltaTime * cos((playerRotation.Y-90) * 3.14159265f/180.f));
            playerPosition.Z -= (sidespeed * frameDeltaTime * sin((playerRotation.Y-90) * 3.14159265f/180.f));
            move = 2;
            player->setPosition(playerPosition);
         }
         if(eventReceiver.keyDown('D'))
         {
            playerPosition.X += (sidespeed * frameDeltaTime * cos((playerRotation.Y+90) * 3.14159265f/180.f));
            playerPosition.Z -= (sidespeed * frameDeltaTime * sin((playerRotation.Y+90) * 3.14159265f/180.f));
            move = 2;
            player->setPosition(playerPosition);
         }
         if(eventReceiver.keyDown(' '))
         {
            playerPosition.Y += jumpspeed * frameDeltaTime;
            move = 3;
            player->setPosition(playerPosition);
         }
         if(eventReceiver.keyDown('F'))
         {
            playerPosition.Y += highjumpspeed * frameDeltaTime;
            player->setPosition(playerPosition);
         }
         
         //Cameramovement/Mouse
         core::position2d<s32> cursor = device->getCursorControl()->getPosition();
         
         int cursorDeltaX = (cursor.X) - (cursorOld.X);
         int cursorDeltaY = (cursor.Y) - (cursorOld.Y);
         cursorDeltaX *= 4;
         cursorDeltaY *= 4;

         if((cursor.X) > (cursorOld.X))
         {
            playerRotation.Y += cursorDeltaX * frameDeltaTime;
            player->setRotation(playerRotation);
         }
         if((cursor.X) < (cursorOld.X))
         {
            playerRotation.Y += cursorDeltaX * frameDeltaTime;
            player->setRotation(playerRotation);
         }
         if((cursor.Y) > (cursorOld.Y))
         {
            if ( cameraAngle < 70.0 )cameraAngle += cursorDeltaY * frameDeltaTime;   
            player->setRotation(playerRotation);
         }
         if((cursor.Y) < (cursorOld.Y))
         {
            if ( cameraAngle > -65.0 )cameraAngle += cursorDeltaY * frameDeltaTime;
            player->setRotation(playerRotation);
         }
          
         device->getCursorControl()->setPosition(cursorOld);



         //Move
         if(move == 1)
            if(moveSTANDaktiv == false)
            {
               player->setMD2Animation(scene::EMAT_STAND);
               moveSTANDaktiv = true;
               moveRUNaktiv = false;
               moveJUMPaktiv = false;
            }
         if(move == 2)
            if(moveRUNaktiv == false)
            {
               player->setMD2Animation(scene::EMAT_RUN);
               moveSTANDaktiv = false;
               moveRUNaktiv = true;
               moveJUMPaktiv = false;
            }
         if(move == 3)
            if(moveJUMPaktiv == false)
            {
               player->setMD2Animation(scene::EMAT_JUMP);
               moveSTANDaktiv = false;
               moveRUNaktiv = false;
               moveJUMPaktiv = true;
            }

         


         driver->beginScene(true, true, video::SColor(255,200,200,200));
         smgr->drawAll();
         gui->drawAll();

         //Draw Crosshair and Points
         driver->draw2DImage(images, core::position2d<s32>(384,284), core::rect<s32>(0,0,32,32), 0, video::SColor(255,255,255,255), true);
         

         int fps2 = driver->getFPS();
         int posX = playerPosition.X;
         int posY = playerPosition.Y;
         int posZ = playerPosition.Z;
         
         stringw buf = L"FPS: ";
         buf += fps2;
         buf += "   ";
         buf += "  Player Position [";
         buf += posX;
         buf += ",";
         buf += posY;
         buf += ",";
         buf += posZ;
         buf += "]";
         font->draw(buf.c_str(), core::rect<s32>(10 , 10, 400, 400), video::SColor(255,0, 0,0));
         


         driver->endScene();

         int fps = driver->getFPS();
         if (lastFPS != fps)
         {
            stringw str = L"Third-Person-Shooter by Shades";
            str += "  FPS:";
            str += fps;
            
            str += "  Player_Position [";
            str += posX;
            str += ",";
            str += posY;
            str += ",";
            str += posZ;
            str += "]";
            
            device->setWindowCaption(str.c_str());
            lastFPS = fps;
         }
      
         eventReceiver.startEventProcess();
      }
      else
      device->yield();
   }
   
   device->drop();
   return 0;
}


MastEventReciver:
Code:
/// ==================================================================================================
/// MastEventReceiver code is © (Copyright) Robert E. Demarest, AKA Mastiff or Mastiff Odit
/// This file may be used in any non-commercial or commercial project as long as the following conditions are met:
/// You may not claim this code as being your own.
/// You may not use this code for any harmful, malicious or otherwise damaging programs.
///
/// This is version 1.2a of the class.
/// This class is designed for use with the Irrlicht Engine, it was written for version 1.3 of the engine.
/// ==================================================================================================

//////////////////////////////////////////////////////////////////////////////////////////////////////
//
// To use this Class just add  #include "MastEventReceiver.cpp"  to the end of your includes list. (or add the class in-line into your program)
// Then create an instance of it like so: MastEventReceiver eventReceiver;
// Then call the initialization fucntion like so: eventReceiver.init();
// Then inside your Main Game Loop place "eventReceiver.endEventProcess();" in the beginning of your game loop, before anything -
// that would require input, then put "eventReceiver.startEventProcess();" at the very end of your Main Game Loop.
// yeah I know it's confusing, but it makes alot more sense in the internals of the class.
//
//////////////////////////////////////////////////////////////////////////////////////////////////////

// Change this to the path where your Irrlicht Header Files are.
#include <irrlicht.h>

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

/// ==============================
/// MastEventReceiver
/// ==============================
class MastEventReceiver : public IEventReceiver
{

   protected:
   // Enumeration for UP, DOWN, PRESSED and RELEASED key states. Also used for mouse button states.
   enum keyStatesENUM {UP, DOWN, PRESSED, RELEASED};

   // Enumeration for Event Handling State.
   enum processStateENUM {STARTED, ENDED};

   // Mouse button states.
   keyStatesENUM mouseButtonState[2]; //Left(0), Middle(1) and Right(2) Buttons.

   // Keyboard key states.
   keyStatesENUM keyState[KEY_KEY_CODES_COUNT];

   // Mouse X/Y coordinates and Wheel data.
   struct mouseData
   {
   int X;
   int Y;
   float wheel; //wheel is how far the wheel has moved
   };
   struct mouseData mouse;

   processStateENUM processState; // STARTED = handling events, ENDED = not handling events

   //virtual bool OnEvent(SEvent event)
   virtual bool OnEvent(const SEvent& event)   
   {
      bool eventprocessed = false;

      //////////////////////////////
      // Keyboard Input Event
      //////////////////////////////
      if (event.EventType == EET_KEY_INPUT_EVENT)
      {
         if (processState == STARTED)
         {
            // if key is Pressed Down
            if (event.KeyInput.PressedDown == true)
            {
               // If key was not down before
               if (keyState[event.KeyInput.Key] != DOWN)
               {
                  keyState[event.KeyInput.Key] = PRESSED; // Set to Pressed
               }
               else
               {
                  // if key was down before
                  keyState[event.KeyInput.Key] = DOWN; // Set to Down
               }
            }
            else
            {

                  // if the key is down
                  if (keyState[event.KeyInput.Key] != UP)
                  {
                     keyState[event.KeyInput.Key] = RELEASED; // Set to Released
                  }
            }
         }


         eventprocessed = true;
      }

      //////////////////////////////
      // Mouse Input Event
      //////////////////////////////

      if (event.EventType == EET_MOUSE_INPUT_EVENT)
      {
         if (processState == STARTED)
         {
            //Mouse changed position
            if (event.MouseInput.Event == EMIE_MOUSE_MOVED)
            {
               mouse.Y = event.MouseInput.Y;
               mouse.X = event.MouseInput.X;
            }

            //Wheel moved.
            if (event.MouseInput.Event == EMIE_MOUSE_WHEEL)
            {
               mouse.wheel += event.MouseInput.Wheel;
            }

            //Left Mouse Button Pressed
            if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN)
            {
               //
               if (mouseButtonState[0] == UP || mouseButtonState[0] == RELEASED)
               {
                  mouseButtonState[0] = PRESSED;
               }
               else
               {
                  mouseButtonState[0] = DOWN;
               }
            }

            //Left Mouse Button Rleased
            if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP)
            {
               //
               if (mouseButtonState[0] != UP)
               {
                  mouseButtonState[0] = RELEASED;
               }
            }

            //Middle Mouse Button Pressed
            if (event.MouseInput.Event == EMIE_MMOUSE_PRESSED_DOWN)
            {
               //
               if (mouseButtonState[1] == UP || mouseButtonState[1] == RELEASED)
               {
                  mouseButtonState[1] = PRESSED;
               }
               else
               {
                  mouseButtonState[1] = DOWN;
               }
            }

            //Middle Mouse Button Rleased
            if (event.MouseInput.Event == EMIE_MMOUSE_LEFT_UP)
            {
               //
               if (mouseButtonState[1] != UP)
               {
                  mouseButtonState[1] = RELEASED;
               }
            }

            //Right Mouse Button Pressed
            if (event.MouseInput.Event == EMIE_RMOUSE_PRESSED_DOWN)
            {
               //
               if (mouseButtonState[2] == UP || mouseButtonState[2] == RELEASED)
               {
                  mouseButtonState[2] = PRESSED;
               }
               else
               {
                  mouseButtonState[2] = DOWN;
               }
            }

            //Right Mouse Button Rleased
            if (event.MouseInput.Event == EMIE_RMOUSE_LEFT_UP)
            {
               //
               if (mouseButtonState[2] != UP)
               {
                  mouseButtonState[2] = RELEASED;
               }
            }
         }


         eventprocessed = true;
      }


      return eventprocessed;
   }


   //////////////////////
   // Public functions
   //////////////////////
   public:

   float mouseWheel()
   {
      return mouse.wheel;
   }

   int mouseX()
   {
      return mouse.X;
   }

   int mouseY()
   {
      return mouse.Y;
   }

   bool leftMouseReleased()
   {
      if (mouseButtonState[0] == RELEASED)
      {
         return true;
      }
      else
      {
         return false;
      }
   }
   bool leftMouseUp()
   {
      if (mouseButtonState[0] == RELEASED || mouseButtonState[0] == UP)
      {
         return true;
      }
      else
      {
         return false;
      }
   }

   bool leftMousePressed()
   {
      if (mouseButtonState[0] == PRESSED)
      {
         return true;
      }
      else
      {
         return false;
      }
   }

   bool leftMouseDown()
   {
      if (mouseButtonState[0] == PRESSED || mouseButtonState[0] == DOWN)
      {
         return true;
      }
      else
      {
         return false;
      }
   }

   bool middleMouseReleased()
   {
      if (mouseButtonState[1] == RELEASED)
      {
         return true;
      }
      else
      {
         return false;
      }
   }
   bool middleMouseUp()
   {
      if (mouseButtonState[1] == RELEASED || mouseButtonState[1] == UP)
      {
         return true;
      }
      else
      {
         return false;
      }
   }

   bool middleMousePressed()
   {
      if (mouseButtonState[1] == PRESSED)
      {
         return true;
      }
      else
      {
         return false;
      }
   }

   bool middleMouseDown()
   {
      if (mouseButtonState[1] == PRESSED || mouseButtonState[1] == DOWN)
      {
         return true;
      }
      else
      {
         return false;
      }
   }

   bool rightMouseReleased()
   {
      if (mouseButtonState[2] == RELEASED)
      {
         return true;
      }
      else
      {
         return false;
      }
   }
   bool rightMouseUp()
   {
      if (mouseButtonState[2] == RELEASED || mouseButtonState[2] == UP)
      {
         return true;
      }
      else
      {
         return false;
      }
   }

   bool rightMousePressed()
   {
      if (mouseButtonState[2] == PRESSED)
      {
         return true;
      }
      else
      {
         return false;
      }
   }

   bool rightMouseDown()
   {
      if (mouseButtonState[2] == PRESSED || mouseButtonState[2] == DOWN)
      {
         return true;
      }
      else
      {
         return false;
      }
   }//
   
   bool keyPressed(char keycode)
   {
      if (keyState[keycode] == PRESSED)
      {
         return true;
      }
      else
      {
         return false;
      }
   }

   bool keyDown(char keycode)
   {
      if (keyState[keycode] == DOWN || keyState[keycode] == PRESSED)
      {
         return true;
      }
      else
      {
         return false;
      }
   }

   bool keyUp(char keycode)
   {
      if (keyState[keycode] == UP || keyState[keycode] == RELEASED)
      {
         return true;
      }
      else
      {
         return false;
      }
   }

   bool keyReleased(char keycode)
   {
      if (keyState[keycode] == RELEASED)
      {
         return true;
      }
      else
      {
         return false;
      }
   }


   // This is used so that the Key States will not be changed during execution of your Main game loop.
   // Place this at the very START of your Main Loop
   void endEventProcess()
   {
      processState = ENDED;
   }

   // This is used so that the Key States will not be changed during execution of your Main game loop.
   // Place this function at the END of your Main Loop.
   void startEventProcess()
   {

      processState = STARTED;
      //Keyboard Key States
      for (int i = 0; i < KEY_KEY_CODES_COUNT; i++)
      {
         if (keyState[i] == RELEASED)
         {
            keyState[i] = UP;
         }

         if (keyState[i] == PRESSED)
         {
            keyState[i] = DOWN;
         }
      }
      //Mouse Button States
      for (int i = 0; i <= 2; i++)
      {
         if (mouseButtonState[i] == RELEASED)
         {
            mouseButtonState[i] = UP;
         }

         if (mouseButtonState[i] == PRESSED)
         {
            mouseButtonState[i] = DOWN;
         }
      }
      //Mouse Wheel state
      mouse.wheel = 0.0f;

   }

   void init()
   {
      //KeyBoard States.
      for (int i = 0; i <= KEY_KEY_CODES_COUNT; i++)
      {
         keyState[i] = UP;
      }
      //Mouse states
      for (int i = 0; i <= 2; i++)
      {
         mouseButtonState[i] = UP;
      }
      //Mouse X/Y coordenates.
      mouse.X = 0;
      mouse.Y = 0;
      mouse.wheel = 0.0f;
   }


};
/// ==========================================
/// END OF MastEventReceiver
/// ==========================================

(MastEventReciver hab ich natürlich nicht selbst gemacht.(Gibts im englischem Wiki.))

Bei fragen, einfach posten.


Nach oben
 Profil  
 
BeitragVerfasst: 04.03.2010, 20:12 
Offline

Registriert: 09.08.2009, 21:38
Beiträge: 17
Danke hat mit sehr geholfen ^^
Ein paar fehler noch ausbessern und es ist perfekt


Edit:
Eine Frage noch:

wie genau hast du die Kreisbweegung um den Player berrechnet blick da irgentwie nicht durch Oo


Nach oben
 Profil  
 
BeitragVerfasst: 06.03.2010, 12:40 
Offline

Registriert: 14.08.2009, 13:56
Beiträge: 17
Also damit setzt man die camera hinter den player,:

Code:
//Cameraposition
vector3df playerPosition = player->getPosition();
vector3df playerRotation = player->getRotation();


camera->setTarget (vector3df(player->getPosition().X,player->getPosition().Y + 75,player->getPosition().Z));
cameraDist = cameraZoom * cos(cameraAngle * 3.14159265f/180.f );
camera->setPosition (vector3df(
playerPosition.X - cameraDist * cos((playerRotation.Y + cameraOffset) * 3.14159265f/180.f),
playerPosition.Y + cameraZoom * sin(cameraAngle * 3.14159265f/180.f) + 75,
playerPosition.Z + cameraDist * sin((playerRotation.Y + cameraOffset) * 3.14159265f/180.f)
));


und damit dreht man den player und bekommt so auch eine andere sicht.

Code:
         //Cameramovement/Mouse
         core::position2d<s32> cursor = device->getCursorControl()->getPosition();
         
         int cursorDeltaX = (cursor.X) - (cursorOld.X);
         int cursorDeltaY = (cursor.Y) - (cursorOld.Y);
         cursorDeltaX *= 4;
         cursorDeltaY *= 4;

         if((cursor.X) > (cursorOld.X))
         {
            playerRotation.Y += cursorDeltaX * frameDeltaTime;
            player->setRotation(playerRotation);
         }
         if((cursor.X) < (cursorOld.X))
         {
            playerRotation.Y += cursorDeltaX * frameDeltaTime;
            player->setRotation(playerRotation);
         }
         if((cursor.Y) > (cursorOld.Y))
         {
            if ( cameraAngle < 70.0 )cameraAngle += cursorDeltaY * frameDeltaTime;   
            player->setRotation(playerRotation);
         }
         if((cursor.Y) < (cursorOld.Y))
         {
            if ( cameraAngle > -65.0 )cameraAngle += cursorDeltaY * frameDeltaTime;
            player->setRotation(playerRotation);
         }
         
         device->getCursorControl()->setPosition(cursorOld);



PS: Mir ist gerade aufgefallen, dass du erst denn player bewegen und dann die camera ausrichten solltest.


Nach oben
 Profil  
 
BeitragVerfasst: 06.03.2010, 14:35 
Offline

Registriert: 09.08.2009, 21:38
Beiträge: 17
Ok danke

Nächstes Problem:
ich hab versucht das so umzuschreiben das sich nur die kamera um den Player Dreht
nur komischerweise dreht sich nicht sondern die kamer bleibt einfach so wie sie ist

Code:
Code:
              device->getFileSystem()->addZipFileArchive("C:/Users/****/Desktop/Programmieren/irrlicht-1.6/media/map-20kdm2.pk3");

   
scene::IAnimatedMesh* mesh =smgr->getMesh("20kdm2.bsp");


if (mesh)
   node = smgr->addOctTreeSceneNode(mesh->getMesh(0));
         
      if (node)
         node->setPosition(core::vector3df(-1370,-130,-1400));

      selector = smgr->createOctTreeTriangleSelector(mesh->getMesh(0), node, 128);
         node->setTriangleSelector(selector);
         selector->drop();

         camera->setPosition(core::vector3df(50,50,-60));
         camera->setTarget(core::vector3df(-70,30,-60));

         scene::ISceneNodeAnimator* anim =
         smgr->createCollisionResponseAnimator(
         selector, camera, core::vector3df(30,50,30),
         core::vector3df(0,-3,0),
         core::vector3df(0,50,0));

         camera->addAnimator(anim);
         
         anim->drop();


            scene::IAnimatedMesh* charmesh = smgr->getMesh("C:/Users/****/Desktop/Programmieren/irrlicht-1.6/media/dwarf.x");

            
   video::SMaterial material;
   material.setTexture(0,driver->getTexture("C:/Users/****/Desktop/Programmieren/irrlicht-1.6/media/dwarf.jpg"));
   material.Lighting = true;


         if (charmesh)
            {
              charnode = smgr->addAnimatedMeshSceneNode(charmesh);
              charnode->getMaterial(0) = material;
              charnode->setMD2Animation(scene::EMAT_STAND);
         }


         charnode->setPosition(core::vector3df(-70,0,-60));
         charnode->setRotation(charnode->getRotation() + vector3df(0, 180, 0));


//========== 3rd Person Kamera ========================
      camera->setPosition(charnode->getPosition() - core::vector3df(0,0,30));


   device->getCursorControl()->setPosition(400,300);
   core::position2d<s32> cursorOld = device->getCursorControl()->getPosition();


//========== End 3rd Person Kamera ====================
u32 then = device->getTimer()->getTime();

while(device->run())
{

const u32 now = device->getTimer()->getTime();
         const f32 frameDeltaTime = (f32)(now - then) / 1000.f; // Time in seconds
         then = now;


   

   //===== 3rd Person Kamera

         core::position2d<s32> cursor = device->getCursorControl()->getPosition();


      int cursorDeltaX = cursor.X - cursorOld.X;
      
      int yrot = cursorDeltaX + camera->getRotation().Y;
      
      camera->setRotation(vector3df(0, yrot, 0));

      vector3df camnewpos = charnode->getPosition() - vector3df(0,0,30);

      camera->setPosition(camnewpos);
      camera->setTarget(charnode->getPosition());

      cursorOld = cursor;
      
   //===== Ende 3rd Person Kamera

   core::stringw str = Gamename;
   str += ":::";
   str += yrot;
str += ":::";
   str += cursorDeltaX;


  driver->beginScene(true, true, 0);

  smgr->drawAll();
  driver->endScene();

    device->setWindowCaption(str.c_str());
}
device->drop();
   return 0;
   
}


Nach oben
 Profil  
 
BeitragVerfasst: 11.03.2010, 17:45 
Offline

Registriert: 09.08.2009, 21:38
Beiträge: 17
Hab jetzt inzwischen ein anderes Problem das auch mit der 3rd Person ansicht zusammenhängt.

Wie kann ich es schaffen das eine nicht aktive FPS Camera der Maus folgt wärend der alles über die 3rd Person angezeigt wird?

brauch das für die Kollisionsabfrage den sonst wird immer nur der hauptchar makiert Oo


Nach oben
 Profil  
 
BeitragVerfasst: 22.06.2010, 20:50 
Offline

Registriert: 22.06.2010, 20:40
Beiträge: 4
Servus,

Ich bin zufällig auf diesen Thread gestoßen, ich wollte den Source-Code, welchen Shade in seinem ersten Beitrag gepostet hat kompilieren.
Leider beschwert sich MinGW folgendermaßen:

Code:
main.cpp:19: error: invalid initialization of reference of type 'const irr::core
::dimension2d<irr::u32>&' from expression of type 'irr::core::dimension2d<irr::s32>'
E:/Programme/Irrlicht/include/irrlicht.h:329: error: in passing argument 2 of `irr::IrrlichtDevice* irr::createDevice(irr::video::E_DRIVER_TYPE, const irr::core::dimension2d<irr::u32>&, irr::u32, bool, bool, bool, irr::IEventReceiver*)'


Und dann folgen noch eine Reihe Warnings, welche ich jetzt aber außer Acht lasse.
Offensichtlich kann man der 'createDevice'-Funktion nicht so leicht einen extra Parameter aufschwatzen.
Nun, meine kleiner Sinn für Debugging hat mich dazu bewogen, den letzten Parameter (also '&eventReceiver') auszukommentieren, was komischerweiße aber zum gleichen Ergebnis führte. Jetzt frage ich mich, wie sieht der Compiler - wo er doch Kommentare ignoriert - dass ich da einen zusätzlichen Parameter hatte?

Und wie habt ihr das bewerkstelligt, dass der Compiler das ganze durchrattert?

Danke schonmal.
mfg rungaaz


Nach oben
 Profil  
 
BeitragVerfasst: 23.06.2010, 06:16 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Das Problem ist, dass sich mit einem der letzten Irrlicht Versionsupdates der Parameter für die Auflösung von irr::core::dimension2d<irr::s32> auf irr::core::dimension2d<irr::u32> geändert hat.

_________________
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 23.06.2010, 13:09 
Offline

Registriert: 22.06.2010, 20:40
Beiträge: 4
Ah, Danke, jetzt kann ich das ganze problemlos kompilieren.
Leider bekomme ich von Windows einen Fehlermeldung, wenn ich die EXE ausführen will. (Von wegen, die .exe soll einen Fehler festgestellt haben ... blablabla)

Was mache ich da falsch?


Nach oben
 Profil  
 
BeitragVerfasst: 24.06.2010, 06:10 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Hmm ... vielleich mal debuggen, dann siehst du ja, wo's kracht.

_________________
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 24.06.2010, 13:02 
Offline

Registriert: 22.06.2010, 20:40
Beiträge: 4
OK, Ich hab das ganze mal durch GDB durchrattern lassen und folgendes ist dabei rausgekommen.

Code:
[...]

Could not open file of texture: media/crosshair03.png
warning: Could not load font because the file does not exist: media/myfont.xml
warning:

Could not load font because the file does not exist: media/myfont.xml
warning: Resizing window (1400 1050)
warning:

Resizing window (1400 1050)

Program received signal SIGSEGV, Segmentation fault.
0x00403778 in main () at E:/Programme/Irrlicht/include/irrAllocator.h:30
30              virtual ~irrAllocator() {}
(gdb) q
error return ../../gdb-6.3-1/gdb/win32-nat.c:2126: [5] Zugriff verweigert


Gut, wenn ich die Zeilen im Code auskommentiere, wo myfont.xml und crosshair03.png geladen werden, dann kann ich es - unter einer ganzen Menge von Warnings - problemlos kompilieren, und ausführen.
Und es funktioniert auch prima, lediglich werden in der map manchmal ein paar polygone einfach unsichtbar.


Nach oben
 Profil  
 
BeitragVerfasst: 25.06.2010, 06:25 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Benutzt du Code::Blocks? Falls du dein Projekt mit dem Irrlicht Template angelegt hast, dann solltest du mal den Working-Path überprüfen (Project -> Properties glaub ich). Der steht standardmässig auf dem Irrlicht Verzeichnis, das du angegeben hast, und dann dürfte das Programm deine eigenen Dateien nicht finden.

_________________
Bild


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de