Autor Beitrag
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 15.12.02 18:32 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 15.12.02 19:59 
also ich habe die jupm nun so gemacht aber das es ist auch noch nicht was ich will:
ausblenden volle Höhe 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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 ;-)

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 15.12.02 20:31 
ich auch nicht, deshalb frage ich ja hier im forum ;)
UcL
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 43



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 43



BeitragVerfasst: Mo 23.12.02 11:43 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 26.12.02 18:42 
also erstmal : ist erst mein 2. programm, also wundert euch nicht wenns nicht ellegant ist, funzt aber:

ausblenden volle Höhe 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 26.12.02 19:10 
Danke werde ich mal teste

MFG
mimi