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

17.04.2016, 23:10

SFML + Box2d - Timer - Framerate

Guten abend,

Ich scheitere imoment daran einen Timer in mein Spiel einzubauen. Es will einfach nicht auf unterschiedlichen Rechnern gleich schnell laufen.

Zum Spiel:
Es wird ein 2d Top-Down spiel.
Der Charakter bewegt sich in der Box2d Welt und überträgt die Bewgung an die SFML-Welt.
Dadruch scheint es für den Spieler als ob sich nur die Wände bewegen würden.

Nun zum eig Problem.
Ich habe eine Timerklasse die jeden Zyklus die verstrichene Zeit ausgibt.
Die Spielerinputs werden als "direction" übergeben und mit einem Faktor "speed" multipliziert.
Das Ergebnis wird mit der verstrichenen Zeit des letzten Zyklus multipliziert.
Dieser impuls wird in form von "setLinearVeloctiy" an Box2d weitergebeen.
Anschließend wird die zurückgelegene Strecke des Charakters zurückgegeben um die Wände von SFML neu auszurichten.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const sf::Vector2f CGame::calcVelocity(b2Vec2 direction)
{
const float speed = 500;
    b2Vec2 new_posi, old_posi;

    old_posi = Charakter.getPosition();
    Charakter.update(b2Vec2((direction.x * speed) * Timer->getElapsed(), (direction.y * speed) * Timer->getElapsed()));
    simulatePhysics();
    new_posi = Charakter.getPosition();

    //Invert Speed for SFML
    sf::Vector2f velocity;

    velocity.x = (new_posi.x - old_posi.x) * -1;
    velocity.y = (new_posi.y - old_posi.y) * -1;

    return velocity;
}


Leider funzt es nicht ganz wie geplant.
Setze ich unterschiedliche FPS limits (SFML setFramerateLimit()), so merkt man stark die Tempo unterschiede.


ich bitte um hilfe.

MFG

Urprimat
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

2

18.04.2016, 01:37

so wie es ausschaut versucht du eine konstante geschwindigkeit für den spieler zu nutzen.
sieht richtig aus, wenn auch zu kompliziert geschrieben.

hat velocity einen einfluss, oder ist das nur zum anzeigen da? das problem mit unterschiedlichen geschwindigkeiten kenne ich nämlich. bei mir lage es daran, dass ich die physik nicht korrekt implementiert hatte. ich habe aber keine konstante geschwindikeit benutzt.

s = v*t + 0.5*a*t^2
v = v + a*t;

simulatePhysics ist auch ein potentieller fehlerherd, da für mich nicht ersichtlich ist was es macht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

18.04.2016, 06:52

Wenn schon Box2D benutzt wird, wieso die Geschwindigkeit jeden Frame ändern? Die linear velocity sollte doch wohl ohnehin immer gleich bleiben, denn Geschwindigkeit ist schließlich Strecke pro Zeit. Wozu die jeden Frame neu ausrechnen und neu zuweisen?
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

18.04.2016, 07:23

Ich verstehe nicht warum die Wände von SFML neu ausgerichtet werden müssen?

Normal sollte sich deine Spielfigur durch die Weltbewegen und die Kamera folgt der Spielfigur und alles andere bleibt an seinem Platz (abgesehen von Gegnern und so).
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

5

18.04.2016, 10:48

Hallo,

hat velocity einen einfluss, oder ist das nur zum anzeigen da?


Ja, Velocity wird nicht nur zum Anzeigen benutzt sondern um die Sprites zu bewegen.

Ich verstehe nicht warum die Wände von SFML neu ausgerichtet werden müssen?
Normal sollte sich deine Spielfigur durch die Weltbewegen und die Kamera folgt der Spielfigur und alles andere bleibt an seinem Platz (abgesehen von Gegnern und so).


Vielleicht habe ich mir das leben auch zu Kompliziert gemacht aber ich erklärs mal:

In Box2d gibt es Dynamic und Static objekte.
Ich hatte erst damit begonnen alle Wände auf Dynamic zu setzen und den Charakter auf Static. Somit war der Charakter in der Mitte des Bildes und die Wände bewegten sich (Cameraeffekt). Colidierte jedoch eine Wand mit dem Charakter, gab diese nach, alle anderen Wände zogen jedoch weiter.
Zudem fand ich es blöd das meine ca 100 Wände bewegt werden.

Daraufhin setze ich den Charakter auf Dynamic und die Wände auf Static. Jetzt bewegt sich der Charakter in der Box2d-Welt durch die Gegend, die Geschwindgikeit wird berechnet und dann INVERTIERT an die SFML Sprites gegeben.
Somit kommt man auch wieder auf den Cameraeffekt, nur das in Wahrheit sich nur der Charakter in der Box2d-Welt bewegt.

Ich fand die lösung ganz interessant da ich dadurch auch ein bisschen Performance gespart habe, da nicht meine ganzen wände berechnet werden müssen sondern nur der Charakter


MFG Urprimat
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

6

18.04.2016, 11:00

Wenn schon Box2D benutzt wird, wieso die Geschwindigkeit jeden Frame ändern? Die linear velocity sollte doch wohl ohnehin immer gleich bleiben, denn Geschwindigkeit ist schließlich Strecke pro Zeit. Wozu die jeden Frame neu ausrechnen und neu zuweisen?


Du hast recht... :huh: Box2d kriegt ja in "simulatePhysics" eine TimeStamp. somit müsste ich nur "Direction" übergeben und Box2d sollte das selber berechnen.

Ich probiers zuhaus direkt mal aus. :search:
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

18.04.2016, 11:01

So herum ist das auch richtig, Wände sind statisch, nur der Spieler und die Kamera bewegen sich. Allerdings berechnest und setzt Du jeden Frame die Geschwindigkeit der Spielfigur und das ist überflüssig. Box2D macht doch genau das für Dich. Du musst ihn nur passend beschleunigen oder bremsen, wenn der Spieler entsprechenden Input liefert. Die Berechnung der Bewegung macht dann Box2D für Dich und Du musst nur Deine Sprites mit den Positionen aus Box2D updaten.
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

18.04.2016, 11:36

Grundsätzlich ist das schon Richtig, nur das Verstehe ich noch nicht.

die Geschwindgikeit wird berechnet und dann INVERTIERT an die SFML Sprites gegeben.


Die Sprites bleiben in der Regel an Ort und Stelle.
Wenn ein Objekt bei Box2d an Position 10,10 und in SFML an Position 100,100 dann bleiben die Objekte da. Nur die Kamera wechselt ggf. die Position (der Spielfigur folgend) bei SFML entspricht die Kamera sf::View.

So wie es sich anhört berechnest du für die SFML Grafik immer wieder die Position neu, das wäre aber unnötig.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

9

19.04.2016, 01:35

Also wenn velocity einen Einfluss hat, dann ist das Charakter.update(...) schon mal komisch. Dort machst du die Positionsupdates, wenn ich das richtig verstehe. Würde heissen, durch das setzen von velocity machst du das irgendwie doppelt?

Desweiteren ist velocity ganz klar falsch berechnet. Du setzt velocity = strecke. Je grösser dein Zeitschritt wird, desto grösser auch velocity -> unterschiedliche Resultate bei unterschiedlichen Framerates.

geschwindikeit = strecke/zeit

velocity.x = (old_posi.x - new_posi.x) / Timer->getElapsed();

aber aufpassen das getElapsed nicht 0 ist :D

10

27.04.2016, 19:00

Die Sprites bleiben in der Regel an Ort und Stelle.
Wenn ein Objekt bei Box2d an Position 10,10 und in SFML an Position 100,100 dann bleiben die Objekte da. Nur die Kamera wechselt ggf. die Position (der Spielfigur folgend) bei SFML entspricht die Kamera sf::View.



Mooooment :crazy:

Die Sprites bewegen sich bei mir aktuell um dem Spieler das gefühl zu geben das der Charakter sich bewegt!
Ich dachte das man das so macht.... :dash:

ich schau mir mal sf::View an.
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

Werbeanzeige