Ich hoffe ihr könnt mir weiterhelfen ..
Ich habe die derzeitigen Koordinaten und den Winkel des Spielers gegeben und will ihn sich fortbewegen lassen.
2Dimensional
Dazu hätte ich die folgende Formeln genommen
m_fXPOS += sin(winkel*(3,14159 / 180))*50* elapsedTime
m_fYPOS += cos(winkel*(3,14159 / 180))*-50* elapsedTime
Was ist hier falsch?
danke im voraus
Berechnung
-
-
Wuzikleines, aber vollständiges Programm posten. Mit Input (kann auch schon im Programm stehen). Mit erwarteter und tatsächlicher Ausgabe.
Edit: "Kommazahlen" schreibt man in C übrigens mit Punkt statt Beistrich.
-
hmm ich weiß nicht genau was ich jetz postn soll...
Zitat
Als erster mal der Ausschnitt aus der cpp datei
//
// Aufgabe: Bewegung des Spielers
//
void CPlayer::ProcessMoving ()
{
// Nach links?
if (g_pFramework->KeyDown (SDLK_LEFT))
{
// Spieler nach links drehen
m_fPlayerRot -= 50.0f * g_pTimer->GetElapsed ();
if (m_fPlayerRot < 0.0)
{
m_fPlayerRot = 355.0;
}
// Animieren
//m_fAnimPhase -= 20.0f * g_pTimer->GetElapsed ();
}
// Nach rechts?
else if (g_pFramework->KeyDown (SDLK_RIGHT))
{
// Spieler nach rechts drehen
m_fPlayerRot += 50.0f * g_pTimer->GetElapsed ();
if (m_fPlayerRot > 355.0)
{
m_fPlayerRot = 0.0;
}
// Animieren
// m_fAnimPhase += 20.0f * g_pTimer->GetElapsed ();
}
// Nach oben?
else if (g_pFramework->KeyDown (SDLK_UP))
{
m_fXPos += float(sin(double(m_fPlayerRot*(PI/180)))) *50.0f* g_pTimer->GetElapsed ();
m_fYPos += float(cos(double(m_fPlayerRot*(PI/180)))) *(-50.0f)* g_pTimer->GetElapsed ();
}
//
// Spieler wurde nicht bewegt
else
{
// Animation zurück zum Ausgangspunkt
if (m_fAnimPhase > 5.0f)
m_fAnimPhase -= 20.0f * g_pTimer->GetElapsed ();
if (m_fAnimPhase < 5.0f)
m_fAnimPhase += 20.0f * g_pTimer->GetElapsed ();
}
}
´
dann die hpp datei dazu
#ifndef PLAYER_HPP
#define PLAYER_HPP
#include <list>
#include "Sprite.hpp"
class CPlayer
{
public:
CPlayer ();
void Init ();
void Quit ();
void Render ();
void Update ();
void Reset ();
private:
void ProcessMoving ();
void CheckPosition ();
CSprite *m_pSpritePlayer; // Sprite für Spieler
float m_fXPos; // X-Position des Spielers
float m_fYPos; // Y-Position des Spielers
float m_fAnimPhase; // Aktuelle Animationsphase
float m_fPlayerRot;
};
#endif
und die Zeilen für die Zeit:
#include "Timer.hpp"
// Konstruktor
//
// Aufgabe: Initialisierung
//
CTimer::CTimer ()
{
// Initialisierung
m_fCurTime = 0.0f;
m_fLastTime = SDL_GetTicks() / 1000.0f;
m_fElapsed = 0.0f;
} // Konstruktor
// Update
//
// Aufgabe: Timer updaten
//
void CTimer::Update ()
{
// Vergangene Zeit seit dem letzten Frame berechnen
m_fCurTime = SDL_GetTicks() / 1000.0f;
m_fElapsed = m_fCurTime - m_fLastTime;
m_fLastTime = m_fCurTime;
} // Update
und dessen hpp datei:
#ifndef TIMER_HPP
#define TIMER_HPP
#include <SDL.h>
#include "singleton.hpp"
#define g_pTimer CTimer::Get ()
class CTimer : public TSingleton<CTimer>
{
public:
CTimer ();
void Update ();
float GetElapsed () {return m_fElapsed;}
private:
float m_fElapsed; // Vergangene Zeit seit dem letzten Frame
float m_fCurTime; // Aktuelle Zeit
float m_fLastTime; // Zeit des letzten Frames
};
#endif
ich hoffe das reicht -
hmm ich weiß nicht genau was ich jetz postn soll...
Etwas vollständiges, damit andere Leute auch in den Genuss kommen, das Programm zu kompilieren und laufen zu lassen.
Etwas möglichst kleines, erstens um Leute nicht mit unnötigen Details zu erschlagen; zweitens, weil nicht jeder sdl.h installiert hat oder wegen deinem Programm installieren will.
Inputdaten, damit man weiß, was man mit dem Programm anstellen soll, wenn es mal läuft.
Erwartete Outputdaten, damit man weiß, wann man mit dem Debugging fertig ist.Insgesamt also sowas (code-Tags heißen "code"):
C
Alles anzeigen#include <iostream> #include <cmath> int main(void) { const float pi = 3.14159; float winkel = 90; float xpos = 10; float ypos = 10; float timestep = 1; std::cout << "vor move in Richtung " << winkel << ": " << "pos ist (" << xpos << ", " << ypos << ")" << std::endl; // move! xpos += std::sin(winkel * (pi / 180)) * 50 * timestep; ypos += std::cos(winkel * (pi / 180)) * -50 * timestep; std::cout << "nach move: pos ist (" << xpos << ", " << ypos << ");" << " erwartet: (60, 10)" << std::endl; return 0; }
Tut bei mir ungefähr das, was ich mir wünsche. Tut es auch das, was du dir wünscht? -
Nein tut es leider nicht .
Die Formel gibt mir die falschen Koordinaten aus.
Dadurch hab ich dann falsche x- und y- Koordinaten .
Wie würdest du die Koordinaten berechen , wenn du zum Beispiel eine Figur hast die sich dreht (also dann den Winkel hat)
und wenn du dann "Vorwärts" drückst die Figur vorbewegt. -
Tut bei mir ungefähr das, was ich mir wünsche. Tut es auch das, was du dir wünscht?
würde man bei einer bewegung um 50 unter einem winkel von 90° (von der x-achse aus gemessen), ausgehend von 10, 10 nicht bei 10, 60 landen?
das würde dann heißenPHP
Alles anzeigen#include <iostream> #include <cmath> int main(void) { const float pi = 3.14159; float winkel = 90; float xpos = 10; float ypos = 10; float timestep = 1; std::cout << "vor move in Richtung " << winkel << ": " << "pos ist (" << xpos << ", " << ypos << ")" << std::endl; // move! xpos += std::cos(winkel * (pi / 180)) * 50 * timestep; ypos += std::sin(winkel * (pi / 180)) * 50 * timestep; std::cout << "nach move: pos ist (" << xpos << ", " << ypos << ");" << " erwartet: (10, 60)" << std::endl; return 0; }
-
Nein tut es leider nicht .
Die Formel gibt mir die falschen Koordinaten aus.
Dadurch hab ich dann falsche x- und y- Koordinaten .
Und du willst noch immer nicht posten, was für dich richtig wäre... Verstehst du wirklich nicht, daß man dir kein "richtiges" Programm vorkauen kann, wenn du nicht definierst, was "richtig" ist?würde man bei einer bewegung um 50 unter einem winkel von 90° (von der x-achse aus gemessen), ausgehend von 10, 10 nicht bei 10, 60 landen?
Wenn man so misst, ja. Für mich war 90 Grad Richtung rechts, 0 Grad wäre nach vorne (d.h. an der positiven y-Achse entlang). Ohne Spezifikation können wir beide nur raten -
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!