Aktuelle Zeit: 23.12.2024, 10:11

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Problem mit Bewegung
BeitragVerfasst: 22.04.2009, 09:09 
Offline

Registriert: 16.01.2008, 12:31
Beiträge: 79
Ich bastel an so nem kleinen 2d Side Scroller, hier ist der Code in dem Events verarbeitet werden.

Code:
///////////////////////////////////////////////////////////////////////////////////////////////////
bool CGSRunning::OnEvent(const irr::SEvent &e) {
///////////////////////////////////////////////////////////////////////////////////////////////////

  switch(e.EventType) {
    case irr::EET_GUI_EVENT: {
      return true;
    }
   
    case irr::EET_KEY_INPUT_EVENT: {
      //if (e.KeyInput.PressedDown) {
        switch(e.KeyInput.Key) {
          // move left
          case irr::KEY_LEFT: {
            this->playerValue->SetPosX(this->playerValue->GetPosX()-5);
            return true;
          }
         
          // move right
          case irr::KEY_RIGHT: {
            this->playerValue->SetPosX(this->playerValue->GetPosX()+5);
            return true;
          }
         
          // move up
          case irr::KEY_UP: {
            this->playerValue->SetPosY(this->playerValue->GetPosY()-5);
            return true;
          }
         
          // move down
          case irr::KEY_DOWN: {
            this->playerValue->SetPosY(this->playerValue->GetPosY()+5);
            return true;
          }
         
          // fire
          case irr::KEY_SPACE: {
            return true;
          }
         
          default: {
            return false;
          }
        } // switch
      //}
    } // irr::EET_KEY_INPUT_EVENT
   
    case irr::EET_LOG_TEXT_EVENT: {
      return false;
    }
   
    case irr::EET_MOUSE_INPUT_EVENT: {
      return false;
    }
   
    case irr::EET_USER_EVENT: {
      return false;
    }
   
    default: {
      return false;
    }
  } // switch

}


Das funktioniert auch ich kann mich nach links, rechts, oben und unten bewegen. Wenn ich nun aber die Tasten RECHTS und UNTEN gedrückt halte, dann will ich mich schräg nach unten bewegen. Wie bekomme ich das hin?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit Bewegung
BeitragVerfasst: 22.04.2009, 13:21 
Offline

Registriert: 12.09.2008, 21:41
Beiträge: 187
Wohnort: Deutschland
Hi,

machs doch einfach so:
Code:
if (key_left_gedrückt() && key_down_gedrückt())
{
gehe links;
gehe unten;
}
[code]

Oder du benutzt statt switch case einfach jede Menge unabhängige if's

[code]
if (key_left_gedrückt())
{
gehe links;
}
if (key_down_gedrückt())
{
gehe unten;
}


Gruß
Scarabol

_________________
My Toolbox:
- Irrlicht 1.7.1
- Blender 2.49a
- Microsoft Visual C++ Express Edition 2008
- Newton Game Dynamics 2.xx
Regeln zur Programmierung:
Regel 1: Die Programmiersprache hat keine Fehler.
Regel 2: Solltest du doch einen Fehler finden, tritt automatisch Regel 1 in Kraft.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit Bewegung
BeitragVerfasst: 22.04.2009, 14:20 
Offline

Registriert: 16.01.2008, 12:31
Beiträge: 79
Wie kann ich denn prüfen ob mehr als eine bestimmte Taste gedrückt ist in Irrlicht?

Ich bekomme ja immer nur die Information zu einer bestimmten Taste.

EDIT:
Habs gesehen steuert sich über PressedDown, finde ich aber ziehmlich kompliziert.
Hab den Code bei mir jetzt so verändert das ich 2 Events bekomme, wen es interessiert das steht in "CIrrDeviceWin32.cpp".

EDIT die 2.:
Habs wieder alles zurück geändert. Hab nun ein einfaches Array in dem festgehalten wird ob eine Taste (nicht)gedrückt ist. In der Event Methode wird nur noch das Array verändert, in einer extra Update-Methode (die hatte ich schon vorgesehen :D) wird jetzt die Position verändert. Dort habe ich auch die vergangene Zeit seit dem letzten Bild. :)
Ist schon schön wenn einem wieder einfällt wofür man Dinge gebaut hat. :D


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit Bewegung
BeitragVerfasst: 22.04.2009, 15:31 
Offline

Registriert: 16.01.2008, 12:31
Beiträge: 79
Neues Problem, alles zu schnell. :(
Ich will mich im Grunde immer einen Pixel weiter nach Rechts bewegen, aber mein Bild flizt über den Bildschirm wie nichts gutes. ^^
Wie mache ich das langsamer?
Der Code sieht doch auch soweit gut aus oder (die schrägen Bewegungen funzen nun auch einwandfrei)?

Hier ist der Code der die Bewegungen macht.
Code:
///////////////////////////////////////////////////////////////////////////////////////////////////
void CGSRunning::OnUpdate(irr::f32 timeElapsed) {
///////////////////////////////////////////////////////////////////////////////////////////////////
  if (this->keyValues[irr::KEY_LEFT]) {
    if ( this->playerValue->GetPosX() - timeElapsed > 0) {
      this->playerValue->SetPosX(this->playerValue->GetPosX() - timeElapsed);
    }
  }
 
  if (this->keyValues[irr::KEY_RIGHT]) {
 
    if ( this->playerValue->GetPosX() + this->playerValue->GetTexture()->getSize().Width + timeElapsed <  SCREEN_WIDTH) {
      this->playerValue->SetPosX(1 + timeElapsed + this->playerValue->GetPosX());
    }
  }
 
  if (this->keyValues[irr::KEY_UP]) {
    if (this->playerValue->GetPosY() - timeElapsed > 0) {
      this->playerValue->SetPosY(this->playerValue->GetPosY() - timeElapsed);
    }
  }
 
  if (this->keyValues[irr::KEY_DOWN]) {
    if (this->playerValue->GetPosY() + this->playerValue->GetTexture()->getSize().Height + timeElapsed < SCREEN_HEIGHT) {
      this->playerValue->SetPosY(1 + timeElapsed + this->playerValue->GetPosY());
    }
  }
}


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit Bewegung
BeitragVerfasst: 22.04.2009, 15:37 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
1 + zeit ist blöd.
1 * zeit.

die 1 musst du natürlich ein wenig tweaken.

Also die Grundformel ist:
position += geschwindigkeit * zeit

_________________
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: Problem mit Bewegung
BeitragVerfasst: 23.04.2009, 09:30 
Offline

Registriert: 16.01.2008, 12:31
Beiträge: 79
Ja das ist mein Problem, wenn ich z.B. 1000 * Zeit + aktuellePosition rechne, dann ist es genauso schnell wie 1 + Zeit + aktuellePosition, wohingegen bei 100 * Zeit + aktuellePosition sich praktisch nichts tut. :(


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit Bewegung
BeitragVerfasst: 23.04.2009, 09:42 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Zwischen 100 und 1000 sind aber noch ganz schön viele Zahlen ;)

Du kannst dich ja erstmal in 100er Schritten steigern. Wenn dir dann zb. 500 zu langsam ist und 600 zu schnell dann gehst du in 10er Schritten weiter, etc.

_________________
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: Problem mit Bewegung
BeitragVerfasst: 23.04.2009, 20:15 
Offline

Registriert: 16.01.2008, 12:31
Beiträge: 79
Ja das habe ich schon probiert. Ich poste morgen nochmal mehr Code.

Im Prinzip rufe ich erst die Update-Methode, ändere die Position etc. und danach rufe ich die Methode zum rendern. Die Zeitabstände selbst sind ziehmlich gering.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit Bewegung
BeitragVerfasst: 24.04.2009, 13:34 
Offline

Registriert: 16.01.2008, 12:31
Beiträge: 79
Also wenn ich z.B. 800 als Faktor nehme, dann rucket das wie blöd. Mal ist es schnell, mal ist es super langsam, verstehe ich irgendwie nicht.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit Bewegung
BeitragVerfasst: 24.04.2009, 14:42 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Wie sieht denn deine Framerate dazu aus ?

_________________
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: Problem mit Bewegung
BeitragVerfasst: 24.04.2009, 16:03 
Offline

Registriert: 16.01.2008, 12:31
Beiträge: 79
Kann ich leider erst Montag posten, mache ich dann auch, die ist aber hoch.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit Bewegung
BeitragVerfasst: 24.04.2009, 19:34 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Naja wenn sie zu hoch ist kann das zu Problemen führen, da der Irrlicht timer nur eine auflösung von 1ms hat. Braucht ein Frame weniger Zeit, dann ist der Wert 0 und dementsprechend gibt es auch keine Bewegung. Beim nächsten Frame wird der Wert dann aber wahrscheinlich 2ms betragen und eine dementsprechende schnellere bewegung erzeugen.

_________________
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  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 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 1 Gast


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