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

28.02.2009, 19:17

Frage "Boden-Berechnung" & Sprung

Hallo,

ich bin momentan an einem Spiel am ausprobieren.
Ich bin soweit das ich, wenn zwar nicht optisch hervorragend, einen Sprung mit anschließendem Landen auf der "Erde" (unterem Teil des Bildschirmes) hinbekomme.

Ich habe es so realisiert (Code des Sprunges):

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
 if (App.GetInput().IsKeyDown(sf::Key::Space))
               {

                   if (status == false && Sprite.GetPosition().y > 599 - Sprite.GetSize().y)
                       {
                       höhe = 75;
                       status = true;
                       }

               }




                           
                               
                           if (höhe > 0)
                           {
                           Sprite.Move( 0 , -200 * ElapsedTime);
                           höhe = höhe-1;
                           }

                           if (höhe == 0)
                           status = false;

                             tempy = Sprite.GetPosition().y;
               
               
               
               if (tempy < 602 - Sprite.GetSize().y && status == false)
               {
                   Sprite.Move(0, tempy * ElapsedTime);
               }
                
               if (tempy > 599 - Sprite.GetSize().y)
               {
                   Sprite.SetY(600 - Sprite.GetSize().y);
               }


Das tempy ist die Position der Figur(Sprite).
Das "status" bezieht sich darauf ob sich die Figur im Sprung befindet oder ob sie schon wieder auf 600 ist und bereit zum weiteren Sprung.
Meine Frage ist nun wie man das ganze "intelligenter" verpacken kann bzw. ob man es kommplet anders machen kann.
Das dort oben ist nur eine Notlösung von mir da ich selber auch noch ziemlich am Anfang mit allem stehe.
Probleme sehe ich nun darin die Figur auf z.B. einem Gegenstand der sich "unter" 600, also über dem unteren Bildschirm rand, befindet zu bewegen.

Ich hoffe das man das, was ich dort oben versucht habe, nachvollziehen kann. :(

MfG
Bloore

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

2

28.02.2009, 23:05

dass wurde mir von Blakpanther empfohlen :

v(t + dt) = v(t) - g * dt
y(t + dt) = y(t) + v(t + dt) * dt

dt ist die vergangene Zeit seit dem letzen Frame
g ist die Gravitationsbeschleunigung: Im Normalfall g = 9.81f
y(t), v(t) sind die Werte vom letzten frame
y(t + dt), v(t + dt) sind die neuen Werte

und wenn due springen willst musste einfach die v(t) vertikale geschwindigkeit auf einen gewissen start Wert setzen und dannach musste halt noch abfragen wann dein männchen wieder auf dem boden ist
..also die Formel berechnet dir alles außer die if abfrage wenn du wieder auf den boden kommst
New Project: Operation CityRacer

3

01.03.2009, 10:29

Hmm, gibt es das ganze auch für Dumme ? :D
Bzw. eine Erklärung? Eine "Schwerkraft" habe ich ja schon selber hinbekommen, das was Du beschrieben hast ist ja nur ein bisschen ausführlicher und realitätsnäher.
Mich würde allerdings interessieren wie man es nun hinbekommt das man auf anderen Objekten landet und nicht durchfällt.
Muss ich etwa für jeden x-Wert einen entsprechenden y-Wert bestimmen wo die Figur nicht durchkommt?
Oder funktioniert das ganze per Koordinaten Vergleich?
Über eine genauere Erklärung von Deiner Berechnung würde ich mich freuen, ich verstehe nicht was die Werte in Klammern sollen.

MfG
Bloore

4

01.03.2009, 10:49

Zitat

ich verstehe nicht was die Werte in Klammern sollen.

Die sind eher als Index gemeint.

Quellcode

1
v(t + dt) = v(t) - g * dt 

v(t+dt) steht hier also für die neue Geschwindigkeit; v(t) für die alte.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

5

01.03.2009, 11:16

Zitat

Muss ich etwa für jeden x-Wert einen entsprechenden y-Wert bestimmen wo die Figur nicht durchkommt?



Na sowas realisierst du doch am besten mit einer stinknormalen Kollisionsabfrage...
Du überprüfst, ob die Spieler-BB (bounded box, also das Rechteck, welches den Spieler umgibt) eins der Objekt-BBs berührt. Falls dem so ist, verändert sich die Y-Positionen nicht mehr nach unten(eigentlich nach oben aber ich nehme es jetzt einfach visuell), bleibt also so wie sie jetzt ist. Ein Sprung ist dann auch wieder möglich.

Nach dem selben Prinzip machst du das auch bei Berührungen auf der X-Achse, allerdings musst du dort noch die entsprechende Seite "filtern".


P.S: Es gibt sicherlich bessere Methoden, aber für mich scheint das die einfachste zu sein.

6

01.03.2009, 11:23

Ok, so hab ich mir das auch gedacht. Danke.
Ich habe allerdings noch Probleme mit der Berechnung.
Wäre es theoretisch so richtig?

C-/C++-Quelltext

1
2
3
4
5
                    v = valt - 9.81 * ElapsedTime;
                    y = yalt + v * ElapsedTime;
                    yalt = Sprite.GetPosition().y;
                    valt = v;
                    Sprite.SetY(y);


v, valt, y und yalt sind alles Int-Variablen.
Wenn ich das nun in folgender Stelle einsetze...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
if (yalt < 602 - Sprite.GetSize().y && status == false)
               {
                    
                    
                    v = valt - 9.81 * ElapsedTime;
                    y = yalt + v * ElapsedTime;
                    yalt = Sprite.GetPosition().y;
                    valt = v;
                    Sprite.SetY(y);
               }

...bewegt sich die Figur kein Stück.(Das .draw hab ich nicht vergessen und status ist in diesem Fall auch immer false.)
Die Startposition des Sprites ist y = 100.

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

7

01.03.2009, 13:41

benutz lieber für alle diese Variablen float oder double, die du dann nach int castest.

Ist die Variable Elapsed Time eigentlich auch ein int? wenn ja leigt dort auf jedenfall der fehler...

8

01.03.2009, 14:01

Ich habe nun mal die Variablen in Float gesetzt. Elapsed Time war schon float.
Wenn ich die Formel so änder:

C-/C++-Quelltext

1
2
3
4
5
                    v = valt - 9.81 * ElapsedTime;
                    y = yalt - v * ElapsedTime;
                    yalt = Sprite.GetPosition().y;
                    valt = v;
                    Sprite.SetY(y);


Funktioniert es zwar aber sehr langsam! Durch ändern der 9.81 verändert sich auch nichts. Hab ich was falsch gemacht? wenn ich die Berechnung mit dem + und dem - lasse fliegt die Figur genau so langsam nach oben.

Edit: Wenn ich den Wert sehr hoch setze (400) wirkt es realistisch. Kann ich es so benutzen?

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

9

01.03.2009, 15:03

ja, wenns realistisch wirkt..
New Project: Operation CityRacer

Frede

Treue Seele

Beiträge: 259

Wohnort: Hameln

Beruf: Schüler

  • Private Nachricht senden

10

01.03.2009, 22:31

Zitat


Edit: Wenn ich den Wert sehr hoch setze (400) wirkt es realistisch. Kann ich es so benutzen?

Natürlich sieht es dann realistischer aus ^^
9.81 ist der ungefähre lokale Ortsfaktor. Wenn du den verwendest heißt das, das ein Pixel bei dir einem Meter in der Realität entspricht. Das ist ja meistens nicht der Fall, deshalb musst du den Wert entsprechend erhöhen.
Mit dem Wert 400 heißt das dann Pi*Daumen, dass ein Meter bei dir rund 40 Pixel entpricht. Das dürfte ja dann schon eher zutreffen.
Hier könnte ihre Werbung stehen.

Werbeanzeige