Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 10, 2025 06:05

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Jump&Run => Springen
BeitragVerfasst: Do Okt 23, 2003 09:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
So sieht meine Zeichen Methode aus.
Code:
  1.  
  2. procedure TPlayer.DrawPlayer;
  3. const
  4.   PSize = 1;
  5.  
  6.   cJumpPower = 0.2;
  7.   cJumpHigh = 3;
  8. begin
  9.   //******************* Springen *******************
  10.   if FJumpUp then begin
  11.     FJumpDown := False;
  12.     FPosition.y := FPosition.y + cJumpPower;
  13.     Sleep(10);
  14.     If FPosition.y >= cJumpHigh then begin
  15.       FJumpDown := True;
  16.       FJumpUp := False;
  17.     end;
  18.   end;
  19.   if FJumpDown then begin
  20.     FJumpUp :=False;
  21.     FPosition.y := FPosition.y - cJumpPower;
  22.     Sleep(10);
  23.     if FPosition.y <= 1 then begin
  24.       FJumpDown := False;
  25.       FJumpUp := False;
  26.       FPosition.y := 1;
  27.     end;
  28.   end;
  29.   //******************* Springen *******************
  30.   .....  //Zeichnen
  31.  

Die Figur bewegt sich dann so
Code:
  1.  
  2.     .
  3.   .   .
  4. .       .
  5.  

aber ich möchte gern das die Figur oben eine Kurve springt so z.b
Code:
  1.  
  2.     ..  ..
  3.   .        .
  4. .            .
  5.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 23, 2003 09:58 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Das musst du dann mit cos bzw sin lösen, hab da grad keine ahnung.

Was mri aber auffällt, das du nen Sleep drin hast, sowas ist echt nicht gut... du solltest nen High Resolution Timer benutzen, damit du erstens flüssigen spielverlauf bekommst und es nicht von rechner zu rechner unterschiedlich läuft.

Das beste tutorial in der richtung findest auf neobrothers.de, es ist egal ob die D3D machen oder sonst was, das High Resolution Counter zeugs brauch keine grafik, das sind normale Windows API Routinen.
Solltest du aber in jeder 2D/3D Spiel nutzen.

kurz das du dann weisst wie dus anwenden musst:

Player.Position.X := Player.Position.X + (50) * DeltaTime;

Einfach tut lesen

www.neobrothers.de

jamata,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 23, 2003 10:00 
Offline
DGL Member

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
Ich persönlich würde das über ganz normale Kurvengleichungen lösen, das heißt man überlegt sich, wie weit wird wohl meine Figur springen (Beispiel: 4) und wie hoch (Beipsiel 2) ... denn kann man daraus eine normale Kurvenberechnung machen:

ypos := -(((aktuelleweite/2)-1)*((aktuelleweite/2)-1)) + 2;

Damit bekommt man denn keine Auf dem Kopf stehende Parabel mit den Nullstellen 0 und 4, sowie dem Scheitelpunkt 2/2 ...

Ich hoffe, das Hilft dir weiter :D

_________________
Es sind immer die guten,
welche zu früh von uns gehen müssen...

Meine bislang 13 Open Gl - Tuts findet ihr auf www.dcw-group.net
Neu! Ein großer Teil der Demos nach Kylix übersetzt!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 23, 2003 10:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Danke, mal schauen was ich damit machen kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 23, 2003 10:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Mit Sinus und Cosinus kannst du das so machen indem du deinen Sprung in eine Art Winkel aufteilst. Sprich zu begin hast du 0 Grad und am ende hast du 180 Grad. Wenn du dann mit Sinus und Cosinus rechnest, dann bekommst du einen Wert um den du deine Figur bewegen solltest. Musst mal ein wenig mit rumspielen.

Das Nächste was du machen könntest wäre eine Art Verzögerung vor dem Fallen. Da würde es genügen wenn du noch einen dritten State hinzufügst. (FJumpOben) und einen Counter den du runterzählst. Und wenn der tatsächlin 0 ist dann begibt sich dein (was auch immer) wieder auf den Weg nach unten. Allerdings sieht eine richtige Kurve wesentlich besser als so eine state Variante.

Allerdings solltest du dein Sprung nicht nur mit einer Sinuskurve belegen. Das sieht dann auch nicht so gut aus. Für die Höhe deines Sprites solltest du auf Sinus und Cosinus setzen. Für die seitliche Bewegung solltest du allerdings auf die vorherige Geschwindigkeit deines Sprites setzen. Sprich, dass du X und Y bei der Berechnung trennst. Also je schneller dein Sprite vor dem Sprung war um so weiter geht die Kurve. Im Stand springt er ja auch nur hoch und landet wieder unten. Evtl kann die Geschwindigkeit wärend des Fluges auch ein wenig abnehmen. Und je nach belieben solltest du es ermöglichen oder auch nicht, dass man seine Flugrichtung (X) noch ein wenig verändern kann. Oder halt auch nicht. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 23, 2003 10:14 
Offline
DGL Member

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
Haber nochmal drüber nachgedacht: dein Problem ist, dass dein Jump-Power immer gleich bleibt... das ist aber so nicht richtig, da theoretisch Jumppower mit zunehmender Höhe deutlich weniger werden muss ... evtl. geht es so:

Code:
  1.  
  2. procedure TPlayer.DrawPlayer;
  3. const
  4.   PSize = 1;
  5.  
  6.   cJumpPower = 0.2;
  7.   cJumpHigh = 3;
  8. begin
  9.   //******************* Springen *******************
  10.   if FJumpUp then begin
  11.     FJumpDown := False;
  12.     FPosition.y := FPosition.y + cJumpPower*(((cjumphigh+1)-fposition)/(cJumpHigh+1));
  13.     Sleep(10);
  14.     If FPosition.y >= cJumpHigh then begin
  15.       FJumpDown := True;
  16.       FJumpUp := False;
  17.     end;
  18.   end;
  19.   if FJumpDown then begin
  20.     FJumpUp :=False;
  21.     FPosition.y := FPosition.y - cJumpPower*(((cjumphigh+1)-fposition)/(cJumpHigh+1));
  22.     Sleep(10);
  23.     if FPosition.y <= 1 then begin
  24.       FJumpDown := False;
  25.       FJumpUp := False;
  26.       FPosition.y := 1;
  27.     end;
  28.   end;
  29.  


Damit geschiet folgendes: cJumpPower wird durch den Faktor auf einen Wert zwischen 0.2 (Am Anfang und am Ende) und 0.05 "gefadet" ... dadurch sollte das ganze schon deutlich runder wirken....
(Um es noch runder zu machen müsste man cJumpPowerganz oben gegen 0 gehen lasen ... allerdingswird es dann ein wenig harig wegen der Abbruchbedingung)

_________________
Es sind immer die guten,
welche zu früh von uns gehen müssen...

Meine bislang 13 Open Gl - Tuts findet ihr auf www.dcw-group.net
Neu! Ein großer Teil der Demos nach Kylix übersetzt!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 23, 2003 14:39 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Ihr machts vielleicht kompliziert...
Es geht doch auch einfacher:

Man nimmt einen Timer, der die Gravitationskraft simuliert.
Beim Springen wird eine Variable auf einen Wert gesetzt. Dieser Wert steht für die Beschleunigung nach oben.
Sagen wir mal, beim ersten Mal wird diese Variable z.B.: auf 5 gesetzt.
Deine Figur springt z.B.: um 5 Meter nach oben. (Naja, ok. 5 Meter sind ein bisschen hoch...). Damit die beim nächsten Mal nicht nochmal 5 Meter nach oben fliegt, sondern nur noch z.B.: 4 Meter, zieht der Timer immer 1 von der Variable ab. Bei einem negativen Wert wird ja deine Figur gewissermasen falschrum beschleunigt. Also nach unten. Sie fällt. Damit sie immer schneller fällt, machen wir den Timer noch nicht aus. Bei -5 machen wir Schluss, da das schon schnell genug ist.
Und wenn du wieder beim Boden bist, setzt du die Variable auf 0.

Schon hast du dein Problem ohne Sinus und Cosinus gelöst.
Ist zwar nicht die eleganteste Lösung, aber eine unkomplizierte.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]