Jump and Run - Unklarheiten

TimeIsTheKey

Aktives Mitglied
Hallo

Ich habe mich nach langer Zeit mal wieder ans Programmieren rangemacht und bin zurzeit an einem Jump and Run Spiel dran. Allerdings habe ich einige ungeklärte Fragen.
Bisher kann man sich in meinem "JnR"-Spiel mit einer Spielfigur bewegen und man kann springen. Allerdings läuft alles statisch ab, sprich die Physikberechnung wird nach 20 Millisekunden gemacht und die Schwerkraft wurde glaube ich noch nicht so gut umgesetzt.

Wie oft sollte die Physikberechnung gemacht werden? Ich habe nun von verschiedenen Varianten gehört. Die eine war z.B. pro Frame eine Physikberechnung zu machen (kann mir allerdings nicht vorstellen wie man dies machen soll) und die andere halt nach einer gewissen Zeit (bei mir nach 20 Millisekunden).

Dann habe ich noch eine Frage zur Schwerkraft. Ich habe das nun so gelöst, dass jedes Objekt, welches von der Schwerkraft betroffen ist, bei jedem Durchlauf um 2 Pixel nach unten gezogen wird. In der Verarbeitung baut sich der Vektor Y bei einer Bewegung um 1 ab. Bedeutet, dass es so aussieht, als würde es immer schneller runterfallen. Bei einem Sprung wird der Spieler 40 Pixel nach oben gezogen und die Schwerkraft (die 2 Pixel pro Durchlauf) regeln dann denn Sprung sozusagen. Sprünge können nur gemacht werden, wenn der Spieler irgendwo am Boden ist.
Gibt es eine bessere Methodik um das zu lösen?

Achja. Ich habe meine Vektoren (x,y) mit int gemacht. Sprich man kann sich nur x/y Pixel weit bewegen. Ich hab mich nun gefragt, ob es sinnvoller wäre, float oder double zu verwenden. Ich habe mir verschiedene Quellcodes angeschaut und ich habe die Vektoren noch nie als float definiert gesehen, aber ich glaube es wäre z.B. für die Schwerkraft sinnvoll eine Gleitkommazahl zu verwenden.
 

Hobelhai

Mitglied
Da es ja keine halben Pixel gibt, wirst Du am Ende sowieso wieder int für deine Vektoren benutzen müssen. Ob eine interne Berechnung mit float oder double den Bewegungsablauf realistischer erscheinen lässt, musst Du wohl selbst entscheiden.
 

Quaxli

Top Contributor
Mein Objekte erben alle von Rectangel2D.Double und sind daher entsprechend ausgestattet. Das liegt zum einen daran, daß Rectangle2D.Double noch ein paar Nettigkeiten im Bauch hat, wie z. B. intersects() etc. :D
Ich würde aber auch so double Werte nehmen, da es sonst bei kleinen Bewegungsintervallen sein kann, daß sich ein Objekt gar nicht bewegt, weil ständig abgerundet wird (Und dann finde den Fehler mal.... :oops:). Zum Zeichnen muß man nach int casten, aber im Objekt selber würde ich mit double arbeiten.

Was meinst Du mit Physikberechnung? Bildest Du die Formel für den schiefen Wurf ab oder sprechen wir von etwas Einfachen?

Einfachste Möglichkeit könnte ja z. b. in etwa so aussehen:
- Wenn die Figur springen soll, Y-Wert merken.
- Bei Y-x (x = Sprunghöhe) umschalten auf "fallen"
- Figur fällt solange, bis sie wieder Boden unter den Füßen hat

Oder halt was kompliziertes:

Java:
	@Override
	public void move(long delta) {
		
		shottime = (System.currentTimeMillis() - start)/1000;
		
		if(velo==0){
			return;
		}
		
		if(shotangle>=0){
			x = xnull + (velo*shottime * (Math.cos(shotangle)));
			y = ynull - (velo*shottime*(Math.sin(shotangle))) + (0.5 * g * shottime * shottime);
			
		}else{
			x = xnull + (velo*shottime * (Math.sin(shotangle)));
			y = ynull - (velo*shottime*(Math.cos(shotangle))) + (0.5 * g * shottime * shottime);
			
		}
	}

Beide Varianten würden aber pro Frame durchgeführt. Ich wüßte auch gar nicht, wie man das anders sinnvoll lösen soll. :oops:
 

TimeIsTheKey

Aktives Mitglied
Da es ja keine halben Pixel gibt, wirst Du am Ende sowieso wieder int für deine Vektoren benutzen müssen. Ob eine interne Berechnung mit float oder double den Bewegungsablauf realistischer erscheinen lässt, musst Du wohl selbst entscheiden.

Okay danke. ^^

Mein Objekte erben alle von Rectangel2D.Double und sind daher entsprechend ausgestattet. Das liegt zum einen daran, daß Rectangle2D.Double noch ein paar Nettigkeiten im Bauch hat, wie z. B. intersects() etc. :D
Ich würde aber auch so double Werte nehmen, da es sonst bei kleinen Bewegungsintervallen sein kann, daß sich ein Objekt gar nicht bewegt, weil ständig abgerundet wird (Und dann finde den Fehler mal.... :oops:). Zum Zeichnen muß man nach int casten, aber im Objekt selber würde ich mit double arbeiten.

Was meinst Du mit Physikberechnung? Bildest Du die Formel für den schiefen Wurf ab oder sprechen wir von etwas Einfachen?

Einfachste Möglichkeit könnte ja z. b. in etwa so aussehen:
- Wenn die Figur springen soll, Y-Wert merken.
- Bei Y-x (x = Sprunghöhe) umschalten auf "fallen"
- Figur fällt solange, bis sie wieder Boden unter den Füßen hat

Oder halt was kompliziertes:

Java:
	@Override
	public void move(long delta) {
		
		shottime = (System.currentTimeMillis() - start)/1000;
		
		if(velo==0){
			return;
		}
		
		if(shotangle>=0){
			x = xnull + (velo*shottime * (Math.cos(shotangle)));
			y = ynull - (velo*shottime*(Math.sin(shotangle))) + (0.5 * g * shottime * shottime);
			
		}else{
			x = xnull + (velo*shottime * (Math.sin(shotangle)));
			y = ynull - (velo*shottime*(Math.cos(shotangle))) + (0.5 * g * shottime * shottime);
			
		}
	}

Beide Varianten würden aber pro Frame durchgeführt. Ich wüßte auch gar nicht, wie man das anders sinnvoll lösen soll. :oops:

Ich verwende auch Rectangle, aber lediglich für die Kollisionsüberprüfung (in der Hauptklasse habe ich 2, die jeweils neu abgefüllt und überprüft werden).

Ich werde double noch einbauen. ^^

Meine "Physikberechnung" ist im Moment ziemlich primitiv, weil ich kA von Physik habe. Ich meine aber mit "Physikberechnung" den Teil im Ablauf, bei dem die physischen Standorte verändert werden (sprich moveObjects() bei mir). Dieser wird bei mir eigentlich die ganze Zeit ausgeführt.
Ich hab mir mal angeschaut, wie du das in deinem Tutorial gelöst hast und werde es glaube ich einfach mal übernehmen.
 

Cola_Colin

Top Contributor
Beide Varianten würden aber pro Frame durchgeführt. Ich wüßte auch gar nicht, wie man das anders sinnvoll lösen soll. :oops:

Indem man die Physikberechnung von dem Zeichnen an sich losmacht. Hat den enormen Vorteil, dass bei niedrigen wie hohen fps die Physik immer gleich bleibt.
Im kurzen tut man nichts weiter als die Physik zwischen den Frames in kleinen Schritten zu berechnen, von konstanter Länge.
Sollen 70ms Physik berechnet werden und man will einen Physik-Step pro 10ms, macht man eben 7 Durchläufe der Physikschleife mit 10ms.

Siehe: Fix Your Timestep!

@int-Vektoren:
Es empfiehlt sich intern ein eigenes Koordinatensystem zu verwenden, dass nicht in Pixeln rechnet, sondern in irgendwas anderem und dabei mindestens mit float.
Ob man dann noch double verwendet, ist wohl Geschmackssache, ich sehe da keinen Vorteil drinne.
Erst beim Zeichnen werden die Koordinaten dann in Pixel auf dem Monitor umgerechnet.
 

Quaxli

Top Contributor
Indem man die Physikberechnung von dem Zeichnen an sich losmacht. Hat den enormen Vorteil, dass bei niedrigen wie hohen fps die Physik immer gleich bleibt.
Bis jetzt komm ich mir verschaukelt vor.... ???:L

Im kurzen tut man nichts weiter als die Physik zwischen den Frames in kleinen Schritten zu berechnen, von konstanter Länge.
Sollen 70ms Physik berechnet werden und man will einen Physik-Step pro 10ms, macht man eben 7 Durchläufe der Physikschleife mit 10ms.
Wir sprechen aber immer noch von einem Spiel bei dem man versucht, die FPS möglichst hoch zu halten, um flüssige Bewegunsabläufe zu erhalten, oder?

Denn was ist im Falle eines einfachen Jump 'n Run die "Physikberechnung" anderes als der Teil des GameLoops in dem das Objekt bewegt wird? Ob das jetzt nach einer komplexen physikalischen Formel erfolgt oder ein x-Parameter linear verändert wird ist dabei ja erst mal nebensächlich.

Und gerade bei Spielen weiß man im Vorhinein selten, wie lange eine Physikberechnung dauert. Woher soll ich also wissen, in wieviel Steps ich eine Bewegung aufteilen soll, wenn ich eine gleichmäßige Bewegung erzielen will. ???:L
Bleibt meiner Ansicht also nur eine Physik-Berechnung pro Frame.

Ob man die Bewegung dann anhand der Zeit des letzten Schleifendurchlaufs berechnet und/oder für den gesamten GameLoop versucht eine gleichmäßige Zeit für jeden Schleifendurchlauf zu erzielen ist dabei erstmal nebensächlich.

Das Thema FPS und Gameloop wird im Übrigen unter folgendem Link ausführlicher und etwas näher am Thema erklärt: http://fivedots.coe.psu.ac.th/~ad/jg/ch1/index.html
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Mein Jump and Run charakter bewegt sich nicht mehr rückwärts... Spiele- und Multimedia-Programmierung 0
E Möchte Jump and Run programmieren Spiele- und Multimedia-Programmierung 2
N Jump and run Spiel - wo anfangen / weitermachen? Spiele- und Multimedia-Programmierung 11
F Jump'n Run Background wiederholen Spiele- und Multimedia-Programmierung 3
E Java Jump and Run Map zu groß Spiele- und Multimedia-Programmierung 14
S Jump 'n' Run-Spiel Kollisionserkennung Spiele- und Multimedia-Programmierung 3
Finalspace Entwicklung eines Jump & Run Spiels Video-Tutorial Spiele- und Multimedia-Programmierung 12
C Doodle Jump Sprung Physik? Spiele- und Multimedia-Programmierung 4
M Jump 'n' Run Game - Blöcke? Spiele- und Multimedia-Programmierung 7
N Problem mit Kollisionsabfrage beim Fallen Jump & Run Spiele- und Multimedia-Programmierung 5
M Empfehlungen für ein 2D-Jump'n'run Spiele- und Multimedia-Programmierung 4
W Doodle Jump Spiele- und Multimedia-Programmierung 6
H Jump&Run Tutorial Spiele- und Multimedia-Programmierung 3
D Jump'n'run Kollision bei Blöcken Spiele- und Multimedia-Programmierung 10
K Jump'N'Run Hügel Spiele- und Multimedia-Programmierung 11
Arcus Jump and Run etwas komplizierter - Benötige Starthilfe Spiele- und Multimedia-Programmierung 12
T Ist meine Jump and Run Engine zu genau? Spiele- und Multimedia-Programmierung 4
N Grundlagen für ein Jump&Run Spiele- und Multimedia-Programmierung 3
F "Doodle Jump" Projekt Spiele- und Multimedia-Programmierung 8
U Jump n' Run 2D Geometrie und Kollisionsabfrage? Spiele- und Multimedia-Programmierung 11
L Jump-n-Run Auslastung verringern Spiele- und Multimedia-Programmierung 16
Apo Kollisionserkennung bei Jump'n'Run Spiele- und Multimedia-Programmierung 69
F jump and run idee Spiele- und Multimedia-Programmierung 2
T Umsetzung eines 2D Jump and Runs Spiele- und Multimedia-Programmierung 7
K Jump n Run Keylistener und Schleifen Spiele- und Multimedia-Programmierung 8
F DJADD Jump and Run Spiele- und Multimedia-Programmierung 10
D Jump 'n run die 2. [spielerbewegen mit zeit] Spiele- und Multimedia-Programmierung 6
D Jump and Run Game -- Kollisionsabfrage Spiele- und Multimedia-Programmierung 30
S Kollisionsprob bei Jump&Run Spiele- und Multimedia-Programmierung 9
S Jump'n'Run: Probleme mit Kollision Spiele- und Multimedia-Programmierung 13

Ähnliche Java Themen

Neue Themen


Oben