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

07.05.2015, 14:04

C++, SFML, Jump, Gravity

Hallo, ich lerne gerade etwas SFML kennen, und wollte das Springen für ein jump 'n' Run ausprobieren

dafür habe ich dieses tutorial verwendet: https://www.spieleprogrammierer.de/wiki/…_and_Run-Spiele

dort wird ja ein Pseudocode angegebn wie man das Springen umsetzen könnte. Dies habe ich jetzt auch ausprobiert jedoch springt er extrem langsm und extrem hoch.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <SFML\Graphics.hpp>
#include <iostream>
#include <Windows.h>
sf::Time GetTime();
void Jump(float *playerY, sf::Time Zeit);
int main()
{
    sf::Time Zeit;
    sf::RenderWindow Window;
    Window.create(sf::VideoMode(800, 600), "Test!");
    float playerX = 400.00f, playerY = 500.00f;
    sf::Texture pText;
    sf::Sprite pPlayer;
    pText.loadFromFile("Test.png");
    pPlayer.setTexture(pText);
    
    while (Window.isOpen())
    {
        sf::Event Event;
        while (Window.pollEvent(Event))
        {
            switch (Event.type)
            {
            case sf::Event::Closed:
                Window.close();
                break;
            
            }
        }
        
        Window.draw(pPlayer);
        Zeit = GetTime();
        Jump(&playerY, Zeit);
        pPlayer.setPosition(playerX, playerY);
        Window.display();
        Window.clear();
    }
}

sf::Time GetTime()
{
    static sf::Clock Clock;
    sf::Time t = Clock.restart();
    return t;
}

void Jump(float *playerY, sf::Time Zeit)
{
    static float ySpeed = -50.00f;
    *playerY = *playerY + (ySpeed * Zeit.asSeconds());
    
    ySpeed = ySpeed + 9.81 * (Zeit.asSeconds());
    
}

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

07.05.2015, 16:15

Wenn er zu langsam und zu hoch springt dann stimmt da etwas noch nicht. Gravitation und Sprungkraft sind normal die Größen mit denen du rum spielen kannst. Eine realistische Gravitation brauchst du bei einem Spiel normalerweise nicht. In den meisten Spielen springt der Charakter ja auch überhaupt nicht realistisch. Ansonsten kannst du aber natürlich erst mal mit realistischen Werten starten und dich langsam zum Ziel heran tasten.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

3

07.05.2015, 16:17

Dein spieler bewegt sich am anfang um 50 pixel pro sekunde (ich denke jetzt einfach mal du verwendest pixel als einheit). Pro sekunde verringert sich die geschwindigkeit um 9 pixel. Es dauert also ca. 6 sekunden, bis der spieler stoppt und wieder fällt. Du kannst diese werte entweder entsprechend anpassen oder du verwendest gleich eine einheit, die größer als pixel ist. (Z.b 1 einheit = 40 pixel oder was abstrakteres)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

07.05.2015, 16:30

Generell zeigt die Rechnung eins ganz deutlich. Es werden P/s (Pixel pro Sekunde) als Geschwindigkeit verwendet, aber m/s² (Meter pro Sekunde zum Quadrat) als Gravitation. Schon in der Schule bekommt man beigebracht, dass man niemals mit verschiedenen Einheiten rechnen darf.
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]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

07.05.2015, 17:56

Damit hast du ja Recht BC, er versucht hier mit realen Werten mit falscher Skalierung zu arbeiten. Aber wenn ich mir klassische j'n'r Spiele ansehe wie Super Mario dann benutzt von denen keines realistische Größen. Hier wirkt es durch die 9.81 natürlich als wäre das dennoch gewünscht gewesen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

6

07.05.2015, 18:57

Ich habe es jetzt so gelöst :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
void Jump(float *playerY, sf::Time Zeit)
{
    static float ySpeed = -200.00f;
    *playerY = *playerY + (ySpeed * Zeit.asSeconds());
    float WurzelZeit = sqrt(Zeit.asSeconds());
    ySpeed = ySpeed + 9.81 * WurzelZeit;
    
}


Vielen Dank für eure Hilfe :thumbsup:

7

07.05.2015, 19:15

Ähhh okey, betrachten wir mal die Einheiten, die hier jeweils verrechnet werden.
playerY: §\text{pixels} + \frac{\text{pixels}}{s}\cdot s=\text{pixels}§ GG voll dufte
ySpeed: §\text{pixels} + \frac{m}{s^2} \cdot s^\frac{1}{2}=\text{pixels}+\frac{m}{s^\frac{3}{2}}§ ..."sollte" eigentlich die Einheit §\frac{\text{pixels}}{s}§ haben....
Was das sein soll, weiß ich nicht wirklich, aber ich bin froh, dass du dir, wie auch immer, geholfen hast. Vermutlich wird es aber bald zu gewissen Problemen mit dieser Rechnung kommen, ich empfehle dir innig die Rechnung anzupassen und vor allem mit anderen Gravitationswerten herum zu spielen....
Persönliche löse ich dieses Problem der Umrechnung von Meter und Pixel, die durch dpi alles andere als strikt realistisch kompatibel ist, indem ich komplett in Metern rechne und, wie damals in der Antike, einfach eine "Linie" an Pixeln als einen Meter definiere. Einfach so, was auch immer das für ein Wert sein soll. Aber naja, jedem steht ja frei, wie er's macht :)

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

07.05.2015, 20:05

float WurzelZeit = sqrt(Zeit.asSeconds());
Sicher nicht.
d = v + 0.5 * a * t² und nicht wie bei Dir d = v + a * sqrt(t)
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]

9

07.05.2015, 20:17

bei mir wäre d und v ja das selbe? Also müsste ich nur

C-/C++-Quelltext

1
ySpeed = ySpeed + 0.5 * 9.81 * Zeit.asSeconds();

machen?

Tut mir echt leid euch mit meinen Anfängerfehlern aufzuhalten.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

07.05.2015, 20:18

d und v sind nie dasselbe
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