Entwickler-Ecke
Multimedia / Grafik - delphiX und Springen
mimi - So 15.12.02 18:32
Titel: delphiX und Springen
Hallo,
ich schreibe gerade ein tolls spiel, wo man auch springen aber wie geht das ?
die spieler pos wird in
Game.Player.x
Game.Player.y
gepseichert.
kann mir jemmand ein beispiel geben ?
MFG
mimi
Aya - So 15.12.02 19:28
Hi,
ist es ein 2D-Spiel???
Also sowas wie die alten SuperMario spiele auf dem SNES??
In dem falle wäre X die Position deiner Figur Horrizontal und Y die höhe.. also wie hoch sie springt.. :)
Dann mach einfach nen Timer o.ä. in dem du das machst:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var JumpY: Single;
procedure Jump; begin if Game.Player.Y<JumpY then Game.Player.Y:=Game.Player.Y+0.1; if Game.Player.Y>JumpY then Game.Player.Y:=Game.Player.Y-0.1; if Game.Player.Y=JumpY then JumpY:=0; end; |
Wenn er jetzt Springen soll, z.B. per Leertaste machst du das:
Quelltext
1: 2: 3: 4: 5:
| procedure OnKeyDown(...); begin if Key=VK_SPACE then JumpY:=3; end; |
Dadurch springt deine Figur jetzt 3 Einheiten nach oben und dannach wieder runter.. :) (Die procedure "Jump" mußt einfach jedesmal aufrufen wenn du deine Scene Zeichnest, oder halt in nem timer..)
Au'revoir,
Aya~
PS: Wenn es 3D ist, ist es im grunde genauso... nur das Z dann noch die TiefenPosition der Figur angibt :)
mimi - So 15.12.02 19:46
ja ist ein 2D Spiel
aber ich habe nur interger und keine singel wie bekomme ich das auch ohne singel hin ?
Aya - So 15.12.02 19:51
Na ja,
nimmst halt für JumpY einfach nen Integer, machst in der Jump Procedure jedesmal +1/-1 anstatt 0.1 und fertig *g*
(und JumpY dann vieleicht auf 300 setzen anstatt auf 3 ^^)
Au'revoir,
Aya~
mimi - So 15.12.02 19:59
also ich habe die jupm nun so gemacht aber das es ist auch noch nicht was ich will:
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:
| procedure Jump; var is_unten:bool; begin is_unten:=False; if Game.karte[Game.Player.x,Game.Player.y+1].typ <> -1 then is_unten:=True; if Game.karte[Game.Player.x+1,Game.Player.y+1].typ <> -1 then is_unten:=True;
if Game.karte[Game.Player.x-1,Game.Player.y-1].typ <> -1 then is_unten:=True; if Game.karte[Game.Player.x-1,Game.Player.y].typ <> -1 then is_unten:=True;
if (Game.Player.Y=JumpY) or (is_unten = True) then JumpY:=0;
if (Game.Player.Y<JumpY) or (is_unten = True) then Game.Player.Y:=Game.Player.Y+1;
if Game.Player.Y>JumpY then Game.Player.Y:=Game.Player.Y-1;
if (Game.Player.x<JumpY) or (is_unten = True)then Game.Player.x:=Game.Player.x+1;
if Game.Player.x>Jumpy then Game.Player.x:=Game.Player.x-1; end;
MFG mimi |
mimi - So 15.12.02 20:06
ich möte einach das der Spieler ein bogen spring nicht weiter.
Also einen halb bogen soll es springen, von A nach B
und dabei muss er schaun ob ne wand da ist wenn ja sdann soll es das springen abbrechen.
MFG
mimi
tommie-lie - So 15.12.02 20:20
einen Bogen also...
dafür musst du zeitabhängig die Y-Position langsam erhöhen, bis die Figur am höchsten Punkt des Sprunges angelangt ist. Gleichzeitig musst du sie nach vorne bewegen.
um einen echten Bogen zu machen, gehört da schon ein bisschen Mathe rein, aber wenns auch ein Dach macht, dann kannst du einfach einen Timer mit niedriger Frequenz nehmen und in ihm dann die Position erhöhen, bis sie 300 (oder 3) ist. Anschließend das ganze wieder rückwärts, also immer um ein paar Pixel erniedrigen. So springt er dann keinen Bogen, sodnern ein "Dach", aber für den Anfang dürfte es das sein.
Ach ja, der Timer darf nur enabled sein, wenn man auch wirklich den Sprung ausführt ;-)
Aya - So 15.12.02 20:21
hi,
das geht im grunde genauso... nur das du dann mit irgendeiner MatheFormel noch den Bogen berechnen mußt :)
Aber da kann ich dir leider nich weiterhelfen, bin kein Mathe Genie.. :cry:
Au'revoir,
Aya~
mimi - So 15.12.02 20:31
ich auch nicht, deshalb frage ich ja hier im forum ;)
UcL - So 22.12.02 12:38
bewegung in x richtung:
s(t) = v*t
(s der zurückgelegte weg, v die geschwindigkeit, t die zeit)
bewegung in y richtung:
s(t) = -(g/2)*t^2 + v*t
so ... -(g/2) ist die erdbeschleunigung (g= 9.81 m/s^2), v die absprunggeschwindigkeit .. naja t wieder die zeit ...
mit v kannst du also regulieren wie hoch er springen soll, mit v in x-richtung wie weit...
hoffe das hilft
gruß
ucl
Addy - So 22.12.02 13:31
Man sollte anmerken, dass v in diesem Fall die Anfangsgeschwindigkeit, also eine Konstante, ist.
Ich gehe davon aus, dass deine Spielfigur (oder was auch immer) von einer horizontalen Ebene abspringt (und nicht von einer Rampe fährt).
Dann ist v in der sx(t)-Funktion gleich der Laufgeschwindigkeit der Figur, während v in der sy(t)-Funktion von der Kraft, mit der die Figur abspringt, abhängt. Um hierfür schöne Werte zu finden, musst du etwas probieren.
Zudem wirst du jeden zurückgelegten Wert (also dass, was du aus sx bzw. sy erhalten hast) mit einem konstanten, für beide Richtungen (horizontal und vertikal) gleichen Faktor multiplizieren, damit die Figur in den richtigen Verhältnissen springt (also z.B. nicht nur 3 Pixel hoch).
g kannst du verändern (z.B. verkleinern wenn die Figur auf dem Mond ist), für erdähnliche Sprünge sollte es aber ~10 sein.
mimi - So 22.12.02 14:02
Danke ! und wie sieht das in einer Procedure aus ?
Weil so ganz verstehe ich das nicht ;)
MFG
michael
Addy - Mo 23.12.02 11:43
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| [b]function[/b] sx( t, v_x_0, s_x_0: Single ); [b]begin[/b] Result := v_x_0 * t + s_x_0; [b]end[/b];
[b]function[/b] sy( t, v_y_0, s_y_0: Single ); [b]begin[/b] Result := -( 9.81 * PixelPerMeter / 2 ) * t * t + v_x_0 * t + s_x_0; [i]// Wenn deine positiven y nach unten gehen musst du das Minus weglassen:[/i] [i]// Result := ( 9.81 * PixelPerMeter / 2 ) * t * t + v_x_0 * t + s_x_0;[/i] [b]end[/b]; |
sx bzw. sy liefern die absoluten Koordinaten der springenden Figur nach t Sekunden nach dem Absprung zurück.
v_x_0 ist die Laufgeschwindigkeit der Figur während des Absprungs in Pixel/Sekunde, v_y_0 ist die Absprunggeschw. der Figur in Pixel/Sekunde (wie gesagt, ausprobieren).
s_x_0 und s_y_0 sind die Koordinaten des Absprungs. Lässt du diese Parameter weg, erhälst du die Koordinaten der Figur relativ zu Absprung.
PixelPerMeter ist eine globale Konstante, sie gibt das Verhältnis Pixel zu Meter in deinem Spiel an. Beispiel: 30 Pixel in deinem Spiel entsprechen 1 Meter => PixelPerMeter = 30 / 1;
P.S. Warum funktioniert der UBB-Code nicht?
mimi - Do 26.12.02 17:12
Tut mir leid das ich jetzt erst antworte aber ich verlaus mich auf das Automatische Antworten per mail.
und wie verwende ich die funktionen ?
Könnte man daraus keine Jump Funktion machen ?
MFG
mimi
UcL - Do 26.12.02 18:42
also erstmal : ist erst mein 2. programm, also wundert euch nicht wenns nicht ellegant ist, funzt aber:
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:
| // Gravitaion wenn Player_On_Ground = false procedure gravitation(SpielFigur : TImage; g_beschleunigung : integer); var frei_fall_zeit_s : real; begin If Player_On_Ground = false then begin frei_fall_zeit_s := frei_fall_zeit_ms / 1000; SpielFigur.Top := SpielFigur.Top + Round(g_beschleunigung * frei_fall_zeit_s * frei_fall_zeit_s); end; // Ende der Abwärtsbewegung sobald Boden erreicht ist If SpielFigur.Top > 120 then begin Player_On_Ground := true; SpielFigur.Top := 120; end; end; // ENDE "Gravitaion wenn Player_On_Ground = false"
// Gleichmäßige Bewegung Vertikal mit Absprunggeschwindikeit procedure jump(SpielFigur : TImage;Timer : TTimer; Absprunggeschwindigkeit : integer; x_bewegung : integer); var sprung : integer; timer_interval : real; begin timer_interval := Timer.Interval / 1000; sprung := Round(Absprunggeschwindigkeit * timer_interval); // HIER TIMERINTERVALL !! SpielFigur.Top := SpielFigur.Top - sprung; case richtung of true: SpielFigur.Left := SpielFigur.Left + x_bewegung; false: SpielFigur.Left := SpielFigur.Left - x_bewegung; end; end; // ENDE "Gleichmäßige Bewegung Vertikal mit Absprunggeschwindikeit" |
und so ruf ichs auf:
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:
| begin absprung_geschwindigkeit := 120; If Keys[vk_down] then // wenn down gedrückt wird, wird die aufwärstbewegung gebremst begin absprung_geschwindigkeit := 0; end; If Keys[vk_up] then // wenn up gedrückt wird, wird die aufwärstbewegung beschleunigt begin absprung_geschwindigkeit := 180; end; If Keys[vk_right] then begin player_speed := 2; // Flügel schlagen -> beschleunigung end; Player_On_Ground := false; frei_fall_zeit_ms := frei_fall_zeit_ms + Timer.Interval; gravitation(SpielFigur,5); jump(SpielFigur,Timer,absprung_geschwindigkeit,player_speed); AnimateFigur(SpielFigur, 2); // Animation fürs Fliegen If Player_On_Ground = false then // solange durchlaufen bis spieler wieder am boden begin Timer.Enabled := true; end else begin frei_fall_zeit_ms := 0; end; end; |
mimi - Do 26.12.02 19:10
Danke werde ich mal teste
MFG
mimi
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!