1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Berechnung

  • Pasi
  • 25. April 2009 um 14:43
  • Unerledigt
  • Pasi
    3
    Pasi
    Mitglied
    Punkte
    55
    Beiträge
    8
    • 25. April 2009 um 14:43
    • #1

    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

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 25. April 2009 um 15:57
    • #2

    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.

    *plantsch*

    Einmal editiert, zuletzt von Plantschkuh! (25. April 2009 um 16:19)

  • Pasi
    3
    Pasi
    Mitglied
    Punkte
    55
    Beiträge
    8
    • 25. April 2009 um 16:22
    • #3

    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



    Alles anzeigen



    ich hoffe das reicht

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 25. April 2009 um 18:15
    • #4
    Zitat von Pasi

    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
    #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;
    }
    Alles anzeigen


    Tut bei mir ungefähr das, was ich mir wünsche. Tut es auch das, was du dir wünscht?

    *plantsch*

  • Pasi
    3
    Pasi
    Mitglied
    Punkte
    55
    Beiträge
    8
    • 25. April 2009 um 21:00
    • #5

    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.

    Einmal editiert, zuletzt von Pasi (25. April 2009 um 21:03)

  • sutupud
    13
    sutupud
    Mitglied
    Reaktionen
    59
    Punkte
    1.659
    Beiträge
    320
    • 25. April 2009 um 21:09
    • #6
    Zitat von Plantschkuh!


    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ßen

    PHP
    #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;
    }
    Alles anzeigen

    "All through my life I've had this strange unaccountable feeling that something was going on in the world, something big, even sinister, and no one would tell me what it was."
    "No," said the old man, "that's just perfectly normal paranoia. Everyone in the Universe has that."

    &#128513;&#128514;&#128515;&#128516;&#128517;&#128518;&#128519;&#128520;&#128521;&#128522;&#128523;&#128524;&#128525;&#128526;&#128527;&#128528;&#128530;&#128531;&#128532;&#128534;&#128536;&#128538;&#128540;&#128542;&#128544;&#128545;&#128546;&#128547;&#128549;&#128552;&#128553;&#128554;&#128555;&#128557;&#128560;&#128561;&#128562;&#128563;&#128565;&#128566;&#128567;

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 26. April 2009 um 07:18
    • #7
    Zitat von Pasi

    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?

    Zitat von sutupud

    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 :)

    *plantsch*

  • Pasi
    3
    Pasi
    Mitglied
    Punkte
    55
    Beiträge
    8
    • 26. April 2009 um 20:26
    • #8

    So danke für die mühe .
    Hab es schon geschafft.

    Code
    ypos -= std::cos(winkel * (pi / 180)) * -50 * timestep;

    So hätte es sein müssen , und ich hab pi nicht richtig deklariert.

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 2 Besucher

Rechtliches

Impressum

Datenschutzerklärung