Sprungbewegung

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

LorDtaiBsn

Betreff: Sprungbewegung

BeitragMi, Jan 13, 2010 19:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute, helft mir mal.

Ich bin gerade dabei, meine Sprungbewegungen zu optimieren. Der Code sieht im Moment so aus:
BlitzBasic: [AUSKLAPPEN]

If KeyHit(57) Then

If trittzeit < MilliSecs() Then
trittzeit = MilliSecs() + 500
EmitSound (sprung,camera)
TranslateEntity camera,0,1.5,0

EndIf
EndIf


Meine Kamera (bzw. mein Player) wird jetzt zwar nach oben versetzt, aber mithilfe der Gravitation:
BlitzBasic: [AUSKLAPPEN]
	Grav = Grav - 1
If EntityCollided(camera,TER_COL) Then
Grav = 0
EndIf
TranslateEntity camera,0,(Grav*0.00001),0


wieder runtergezogen. Sieht aber alles total abgestockt aus. Gibt es eine Art Berechnung, mithilfe derer ich die Kamera langsamer hoch- bzw. runterkommen lassen kann?
 

Kruemelator

BeitragMi, Jan 13, 2010 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutz eine Variable für die Auf- und Abbewegung, z.B. "ymove#". Mach das selbe wie bei "Grav" als immer etwas abziehen (jenachdem wie groß die Schwerkraft ist, nicht so wie bei dir genau 1, ist viel zu groß) und dann einfach Translate entity,x,ymove#,z.
Und beim Sprung einfach ymove# auf einen positiven Wert setzen, das lässt die Figur dann nach oben bewegen, sie wird aber immer langsamer und fällt irgendwann auch wieder.
 

LorDtaiBsn

BeitragDo, Jan 14, 2010 15:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Kruemelator hat Folgendes geschrieben:
Benutz eine Variable für die Auf- und Abbewegung, z.B. "ymove#". Mach das selbe wie bei "Grav" als immer etwas abziehen (jenachdem wie groß die Schwerkraft ist, nicht so wie bei dir genau 1, ist viel zu groß) und dann einfach Translate entity,x,ymove#,z.
Und beim Sprung einfach ymove# auf einen positiven Wert setzen, das lässt die Figur dann nach oben bewegen, sie wird aber immer langsamer und fällt irgendwann auch wieder.

Was heißt auf einen positiven Wert setzen? Soll ich einfach dann beim Sprung sagen ymove#=1?
 

Kruemelator

BeitragDo, Jan 14, 2010 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja genau.
So würde das dann aussehen:
Code: [AUSKLAPPEN]
If KeyHit(57) Then
   ymove# = 0.1
EndIf

ymove# = ymove# - 0.01
If EntityCollided(camera,TER_COL) Then
   ymove# = 0
EndIf
TranslateEntity camera,0,ymove#,0

Midimaster

BeitragDo, Jan 14, 2010 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Also die Idee ist ja folgende....

Das gibt es die Entity und die bewegt sich mit einer bestimmten Y-Speed%:

0 wenn es nur waagrecht voran geht
+0.01 bis 1 wenn es nach oben geht
-0.01 bis -1 wenn es wieder nach unten geht

Bei deinem aktivien Sprung wird ja Kraft nach oben erzeugt. Die steckst Du in die Speed
z.b.
BlitzBasic: [AUSKLAPPEN]

YSpeed = YSpeed+1

das geschieht nur 1x pro Sprung

Die Gravitiy ist ja immer eine Kraft nach unten z.b. -0.1
das ziehst Du laufend von der YSpeed ab. jede 1/60-sec
BlitzBasic: [AUSKLAPPEN]
YSpeed = YSpeed-0.1


Die Y-Speed selber wirkt sich auch jede 1/60-sec auf die Entity aus
BlitzBasic: [AUSKLAPPEN]
TranlateEntity camera 0, YSpeed, 0


Dadurch wird sich jetzt deine Camera sehr natürlich (schwerkraftmäßig) bewegen:

Zunächst geht es kräftig nach oben:

Figur steht bei Höhe 0
Y Speed ist da 1
Figur steht bei Höhe 1


Die Gravitiy wirkt sich auf Y-Speed aus und macht den Zuwachs immer kleiner:

Y-Speed ist dann 0.9
Figur steht bei Höhe 1.9

Y-Speed ist dann 0.8
Figur steht bei Höhe 2.7

....

Irgendwann ist Y-Speed dann 0 und die Figur schwebt einen Moment waagrecht

Figur steht bei Höhe 5.5
Y-Speed ist dann 0.0
Figur steht bei Höhe 5.5


Dann macht die Gravity die Speed < 0 und das führt dazu, dass die Höhe abfällt

Figur steht bei Höhe 5.5
Y-Speed ist dann -0.1
Figur steht bei Höhe 5.4

Y-Speed ist dann -0.2
Figur steht bei Höhe 5.2

....
Irgendwann ist der Boden erreicht.

Dabei macht deine Figur eine Art Hyperbel durch, was sehr realistisch aussieht und fällt immer schneller.

BlitzBasic: [AUSKLAPPEN]
YSpeed# = 0
Grav# = 0.1
Kraft# = 1

If KeyHit(57) Then
If trittzeit < MilliSecs() Then
trittzeit = MilliSecs() + 500
EmitSound (sprung,camera)
YSpeed=Kraft
EndIf
EndIf

YSpeed = YSpeed - Grav
If EntityCollided(camera,TER_COL) Then
Speed = 0
EndIf
TranslateEntity camera,0,(YSpeed),0


Du musst jetzt nur noch mit den Werten Kraft und Grav so lange rumspielen, bis es realistisch aussieht. Springt er zu hoch, reduzierst Du Kraft und stellst Grav aber sofort auch auf eine 1/10 von Kraft. Danach experimentierst Du mit dem 1/10-Verhältnis

z.b.
Bei Kraft=0.5 und Grav= 0.01 fliegt er schon ganz weich (1:50)
  • Zuletzt bearbeitet von Midimaster am Fr, Jan 15, 2010 12:52, insgesamt einmal bearbeitet
 

LorDtaiBsn

BeitragDo, Jan 14, 2010 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Verstehe, das macht Sinn. Jetzt erklärt sich auch, warum der vorher so abgehackt gesprungen is. Danke sehr Smile

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group