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

27.07.2013, 00:08

SDL Problem beim bewegen einer Textur

Hey,
also mein Problem ist Folgendes:
Ich will ein Sprite mit den Tasten S und W nach oben und unten verschieben. Beim normalen verändern der Y-Koordinate Funktioniert das auch einwandfrei. Wenn ich allerdings die Werte mit einem Timer multipliziere verändert sich die Geschwindigkeit die ganze Zeit. Meistens ist beim nach oben verschieben das Sprite viel schneller als nach unten. Jedoch ist nicht einmal das Konstant, manchmal kriecht die Textur so dahin, und manchmal ist sie sofort am jeweiligen Ende des Fensters. Hoffe mir kann jemand Helfen. Hier nochmal die betroffenen Code Abschnitte.

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
25
26
27
28
29
30
void Game::Update(){
     SDL_PumpEvents();

     if(KeyDown(SDLK_w))
         player.Move("up");

    if(KeyDown(SDLK_s))
         player.Move("down");

    if(KeyDown(SDLK_ESCAPE))
         gamerun = false;
}

void Timer::Update (){  
        CurTime = SDL_GetTicks() / 1000.0f;
        Elapsed = CurTime - LastTime;
        LastTime = CurTime;
}

void Player::Move(string direction){
    if(direction == "up")
        y -= speed * timer->GetElapsed();

    else if(direction == "down")        
        y += speed * timer->GetElapsed();
    
if(y < 0) y = 0;    
if(y > 380) y = 380;
sprite->SetPos(x, y);
}

feider

Frischling

Beiträge: 8

Wohnort: Jena

Beruf: Student

  • Private Nachricht senden

2

27.07.2013, 11:23

Kannst du auch die Teile des Codes posten, in denen CurTime etc deklariert werden?
Welcher Datentyp ist CurTime? Gibt SDL_GetTicks die Millisekunden seit programmstart als int oder als float/double zurück?

Meine Vermutungen:
1. SDL_GetTicks gibt dir ein Integer.. sollte zwar beim Teilen durch einen float umgewandelt werden, aber versuche es dennoch mal mit ((float) SDL_GetTicks()) / 1000.0f
2. CurTime ist keine Gleitkommazahl
3. In Timer::GetElapsed() passiert etwas seltsames

Wie sieht deine Timer-Klasse aus?
Wo wird Timer::Update() aufgerufen?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

27.07.2013, 13:19

1. SDL_GetTicks gibt dir ein Integer.. sollte zwar beim Teilen durch einen float umgewandelt werden, aber versuche es dennoch mal mit ((float) SDL_GetTicks()) / 1000.0f
Überflüssig.

Punkt 2 und 3 sind bessere Ideen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

4

27.07.2013, 13:23

1. Funktioniert leider nicht und CurTime ist ein float.

Hier meine Timer Klasse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <SDL.h>
#include "Singleton.hpp"

#define g_pTimer Timer::Get ()
class Timer : public Singleton<Timer>
{
    public:
        Timer           ();
        void  Update     ();
        float GetElapsed () {return Elapsed;}

    private:
        float Elapsed;  // Vergangene Zeit seit dem letzten Frame
        float CurTime;  // Aktuelle Zeit
        float LastTime; // Zeit des letzten Frames

};


in GetElapsed wird ja wohl kaum etwas seltsames passieren, denn sie gibt ja einfach Elapsed zurück.

Timer::Update wird hier aufgerufen:

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
25
26
void Game::Run()
{
    screen = NULL;

    screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
    gamerun = true;
    ks = SDL_GetKeyState(NULL);

    bg.Load(screen);
    player.Load(screen, "player");

    while(gamerun)
    {
        Update();
        g_pTimer->Update();

        bg.Draw();
        player.Draw();


        SDL_Flip(screen);
    }


    bg.Quit();
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

27.07.2013, 13:48

Ist jetzt ganz so wild, aber wo initialisierst du "LastTime"? Oder machst Du das gar nicht und im ersten Frame kommt immer Grütze raus für Elapsed?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

6

27.07.2013, 13:51

LastTime wird im Konstruktor initialisiert.

C-/C++-Quelltext

1
2
3
4
5
6
7
Timer::Timer ()
{
    CurTime  = 0.0f;
    LastTime = SDL_GetTicks() / 1000.0f;
    Elapsed  = 0.0f;

}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

27.07.2013, 13:53

Aha. Tja. Dann noch eine kleine Anmerkung: Wirf Singleton weg. Schmeiß es einfach in die Tonne.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

8

27.07.2013, 14:10

Ok mach ich. Aber gibt es einen Grund dafür? Hab mir so ein Buch gekauft, wo Singletons stark empfohlen werden, wenn im ganzen Programm nur eine Instanz der Klasse gebraucht wird. Ich persönlich finde es eigentlich eher kompliziert :)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

27.07.2013, 14:14

Singletons werden sehr oft fälschlicher Weise als "saubere OOP Variante globaler Variablen" verwendet/verkauft. Das ist falsch. Singletons haben nur einen einzigen Zweck: Auf jeden Fall verhindern, dass es von etwas mehr als eine Instanz geben kann, wenn es nur eine einzige geben darf.
Alles andere ist Zweckentfremdung und kommt einer globalen statischen Variablen gleich.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige