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

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

41

10.09.2016, 09:41

https://de.wikipedia.org/wiki/Gleichm%C3…unigte_Bewegung

Dafür braucht man keinen einzigen Vektor, das kann man alles Skalar machen.

Wenn du das sowohl in die x- als auch in die y-Richtung machst, kannst du aber auch gleich einen Vektor nehmen ;)

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

42

11.09.2016, 09:31

https://de.wikipedia.org/wiki/Gleichm%C3…unigte_Bewegung

Dafür braucht man keinen einzigen Vektor, das kann man alles Skalar machen.

Wenn du das sowohl in die x- als auch in die y-Richtung machst, kannst du aber auch gleich einen Vektor nehmen ;)
Kann man, klar. Aber Aussagen wie "Man braucht Vektoren um eine Gravitation zu erstellen" implizieren das man das muss.

  • »DerSpieleprogger« ist der Autor dieses Themas

Beiträge: 19

Beruf: Elektroniker

  • Private Nachricht senden

43

12.09.2016, 22:23

Meine Gravitation funktioniert so echt gut, nur sinkt meine Spielfigur in den Boden ein.
Desto größer die höhe von der sie fällt, desto weiter sinkt sie in den Boden ein.

Der Code ist ganz einfach, funktioniert aber sehr gut, bis auf das mit dem einsinken.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
float speed;
float velocity = 1;
float ypos;

  if(kollision == true){
                        
     speed = speed +0.1f;
     ypos = ypos + velocity*speed;
  }

  else{
     kollision = true;
  }


Kann es sein, das nach der Kollisionsermittlng der "ypos"-Wert noch mal um einen bestimmten Wert nach unten gesetzt wird und dadurch der spieler in den Boden versinkt?
Das würde auch erklären, warum er bei einem Fall aus geringer höhe nur etwas in den Boden einsinkt und bei größer höhe eben tiefer.

Das ist meine Vermutung, da die Kollisionserkennung sofort anschlägt, wenn der Spieler den Block berührt.


MfG

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

44

12.09.2016, 22:32

Na überleg doch mal: Wenn die Kollision erkannt wird, steckt die Spielfigur ja schon im Boden drin. Wie tief, hängt von der Fallgeschwindigkeit ab + ein bisschen "Zufall". Das ist ja nicht wie in der realen Welt, wo eine Bewegung quasi in unendlich kleinen Schritten passiert, sondern du bewegst die Spielfigur von Frame zu Frame über größere Strecken. Du musst dann natürlich dafür sorgen, dass sie wieder nach oben bewegt wird, bis keine Kollision mehr erkannt wird.

  • »DerSpieleprogger« ist der Autor dieses Themas

Beiträge: 19

Beruf: Elektroniker

  • Private Nachricht senden

45

27.09.2016, 14:16

Hallo zusammen,

Sorry für die lange Pause meinerseits.

Mittlerweile funktioniert die Gravitation schon recht gut.
Das Problem mit dem einsinken der Spielfigur in den Boden habe ich auch gelöst, sehr sicher nicht gut programmiert funktioniert aber.
Wenn die Spielfigur in den Boden einsinkt, dann aktiviert sich eine if-Anweisung, die dann die Spielfigur so lange nach oben schiebt, bis keine Kollision mehr erkannt wird.
If-Anweisung deshalb, da die Spielfigur nicht immer gleich tief in den Boden einsinkt.

An eine paar anderen sachen muss ich noch arbeiten, meld mich wieder.

MfG & Danke!

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

46

27.09.2016, 14:45

Zu meinst wohl eine Schleife und nicht if. Du kannst dir aber auch berechnen wie weit du die Spielfigur nach oben drücken musst. Du nimmst den Punkt der Kollision und guckst wie tief die Figur eingesunken ist. Um Diesen Wert schiebst du sie nun in einem nach oben. Möglicherweise meintest du ja aber auch genau das.
„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.“

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

47

27.09.2016, 15:26


In einem Jump and Run-Spiel kannst du die Gravitation einfach als eine konstante Beschleunigung nach unten modellieren. Gib dazu jedem Objekt zusätzlich zu seiner Position (x, y) auch noch einen Bewegungsvektor (vx, vy). In jedem (festen) Zeitschritt erhöhst du x um vx und y um vy, jeweils multipliziert mit der Länge des Zeitschritts. Dadurch bewegt sich das Objekt seinem Bewegungsvektor entsprechend.

Für die Gravitation erhöhst du in jedem Zeitschritt vy um die Gravitationsbeschleunigung multipliziert mit der Länge des Zeitschritts, so dass das Objekt eine Beschleunigung nach unten erfährt. Wenn das Objekt den Boden berührt, darf es natürlich nicht weiter fallen, dann setzt du vy immer wieder auf 0.

Wenn das Objekt "springen" soll, setzt du einmalig vy auf einen hohen negativen Wert (angenommen, dass y nach unten größer wird), so dass es erst einmal nach oben fliegt, aber langsam von der Gravitation wieder nach unten beschleunigt wird.

...


Ist das nicht genau das hier?

  • »DerSpieleprogger« ist der Autor dieses Themas

Beiträge: 19

Beruf: Elektroniker

  • Private Nachricht senden

48

28.09.2016, 14:11

Nein, bei mir gibt es eine if-Anweisung in der update-Methode die solange aufgerufen wird bis die Bedingung nicht mehr erfüllt ist.

MfG

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

49

28.09.2016, 14:18

Nein, bei mir gibt es eine if-Anweisung in der update-Methode die solange aufgerufen wird bis die Bedingung nicht mehr erfüllt ist.

MfG

Mach doch mal Pseudocode. Aktuell klingt das für mich so:

Quellcode

1
2
3
4
5
MainLoop {
    if(player.CollidesFloor()) {
        player.pushSomeRandomValueUp();
    }
}

Das bedeutet dass der Spieler 1 mal pro Frame ein Stück nach oben geschoben wird wenn er im Boden hängt. Das wäre aber nicht besonders schön. Besser wäre:

Quellcode

1
2
3
4
5
MainLoop {
    while(player.CollidesFloor()) {
        player.pushSomeRandomValueUp();
    }
}

Und noch viel besser:

Quellcode

1
2
3
4
5
MainLoop {
    if(player.CollidesFloor()) {
        player.pushPlayerOurOfFloor();
    }
}

Wobei pushPlayerOutOfFloor eben berechnet wie weit der Spieler nach oben geschoben werden muss und den Spieler dann verschiebt.
„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.“

  • »DerSpieleprogger« ist der Autor dieses Themas

Beiträge: 19

Beruf: Elektroniker

  • Private Nachricht senden

50

02.10.2016, 22:22

Ich werde das mal versuchen.

Ein kleines Problem habe ich noch, bei folgendem Code:

else if(in.isKeyPressed(in.KEY_SPACE)){
{

wenn ich in dieser else if-Anweisung einen boolean wert auf true setzen möchte, dann wird der Wert beim drücken der Spacetaste auf true gesetzt und dann gleich wieder auf false.
Der Wert soll aber nachdem die Taste gedrückt wurde auf true bleiben, da er weiter unten im Code wieder auf false gesetzt wird.

Wie könnte ich das machen?

Die "isKeyDown" Methode ist für mein Programm nicht die richtige abfrage der Spacetaste.

MfG

Werbeanzeige