Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

10.09.2009, 15:32

SFML Bewegung (Pong) >>GELÖST<<

Hallo,

ich dachte mir das ich mal aus langeweile ein Pongspiel mache. Game und Schlägerklasse steht bereits, nur habe ich irgendwo einen Fehler in der Bewegung eingebaut, den ich leider nicht finde.

Bei jeder Bewegung wird +1 zum Y vom Geschwindigkeitsvektor des Schlägers addiert. Jeder Frame wird 10% vom Y Wert abgezogen und danach die neue Position mithilfe von Time, dem Y-Wert und dem alten Wert berechnet. Mein Problem ist nun das der Geschwindigkeitsvektor irgendwie nicht durch *0.9f verringert wird, ganz im gegenteil.
Pro Frame scheint es das der Y-Wert um die Zeit addiert wird. Darauf bin ich gekommen als ich einfach mal bei jeder Bewegung den Y-Wert auf Konsole ausspucke. Fast im Sekundentakt erhöht sich der Wert. Wenn ich nun mal nach unten Gehen (-1 Y-Wert) wird der Wert einfach negativ. Ich hoffe jemand findet den Fehler. (Kommentiert ist nur wenig, es sollte ziemlich übersichtlich sein)

Link:

Zum direkten Testen bitte die RELEASE Version nehmen, debug ist noch eine alte bei der es zwar funktionierte, ich die Bewegung aber nicht übertragen konnte, dank einem Helfer aber auf den Fehler kam das ich das Objekt mit Zeigern übergeben muss, nun siehts wie in Release aus)

MfG
Tarliotama

2

10.09.2009, 15:53

kopier doch mal bitte codeausschnitte hier rein. Hab gerade keine Lust das zu laden und die meisten anderen denk ich mal auch nicht.

3

10.09.2009, 15:59

Schwer die wichtigsten rauszuholen, aber ich denke das wären die hier:

Move Methode von Schläger:

C-/C++-Quelltext

1
2
3
4
5
void CSchläger::Move(float Time)
{
    CSchläger::Geschwindigkeitsvektor.y *= 0.9f;
    CSchläger::Grafik.SetPosition(25,(CSchläger::Grafik.GetPosition().y + CSchläger::Geschwindigkeitsvektor.y * Time));
}


Input von GameKlasse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void CGame::Input(float Time, CSchläger *SchlägerSpieler1)
{
        //Events

        sf::Event Event;

        while (App.GetEvent(Event))
        {
           //Close

           if (Event.Type == sf::Event::Closed)
                App.Close();
           if (Event.Type == sf::Event::KeyPressed && Event.Key.Code == sf::Key::Up)
                {
                    SchlägerSpieler1->Geschwindigkeitsvektor.y = SchlägerSpieler1->Geschwindigkeitsvektor.y - 1.0f * Time;
                    std::cout<<SchlägerSpieler1->Geschwindigkeitsvektor.y<<"\n";
                }   
           if (Event.Type == sf::Event::KeyPressed && Event.Key.Code == sf::Key::Down)
                {
                    SchlägerSpieler1->Geschwindigkeitsvektor.y = SchlägerSpieler1->Geschwindigkeitsvektor.y + 1.0f * Time;
                    std::cout<<SchlägerSpieler1->Geschwindigkeitsvektor.y<<"\n";
                  }

        }

}

Main.cpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
        //Variablen

        CGame               Game;
        bool                Running = true;
        sf::Clock           Clock;
        CSchläger          SchlägerSpieler1;
        //GameInit

        Game.Init();
        //MainLoop


        while(Running == true)
        {
        float Time = Clock.GetElapsedTime();
        Game.Input(Time, &SchlägerSpieler1);
        /*Game.Calculation(Time, &SchlägerSpieler1);*/
        SchlägerSpieler1.Move(Time);
        Game.Render(SchlägerSpieler1);
        }

    return 0;
}

4

10.09.2009, 18:00

Momentan bin ich soweit das es ein Problem mit einem Timer geben muss. (ich vermute das dieser nicht zurückgesetzt wird?!)

Iljaronaldo

Treue Seele

Beiträge: 99

Wohnort: Hadamar

Beruf: Schüler[9.Klasse Realschule]

  • Private Nachricht senden

5

10.09.2009, 19:15

o wie ich es verstanden habe funzt der chläger nciht richitg.Der Abstand indem er sich bewegt wird bei jedem Schritt größer.
Ich habe das Problem folgendermaßen gelöst:

Die Zeile:
float Time = Clock.GetElapsedTime();

über die while Schleife in der main schreiben und es sollte funzen.
tutti colpevole, nessuno colpevole. - Wenn einer Schuld ist, sind Alle Schuld.
Die Mafia ist wie ein Staat. Sie mordet nicht, Sie richtet hin.

Wenn man zwei Stunden lang mit einem Mädchen zusammensitzt, meint man, es wäre eine Minute. Sitzt man jedoch eine Minute auf einem heißen Ofen, meint man, es wären zwei Stunden. Das ist Relativität. (Albert Einstein)

Mein System

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

6

10.09.2009, 19:29

Du musst das Clock object auch mal resetten ;)
Anonsten gibts da die Funktion RenderWindow::GetFrameTime(), die dir die Zeit seit dem letzten Frame zurückgibt.

7

10.09.2009, 19:50

Vielen Dank euch 2, da hab ich mal wieder nicht weit genug gedacht :D

MfG
Tarliotama

(Thema gelöst)

Werbeanzeige