Beschleunigung
Übersicht

b3_newbieBetreff: Beschleunigung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also ich arbeite an einer ganz simplen "Beschleunigungs-Engine". Nur das Problem ist, dass ich nicht weiss mit welchen Mitteln ich das anstellen soll. Hab eigentlich schon den ganzen Code bis auf das Elementare..
Problem: Folgendes soll gegeben sein... maximalegeschwindigkeit = 40 beschleunigung = 0.5 zeit = 7 (sekunden von 0 bis auf 40) Ich habe es schon mit der for-Schleife versucht, macht aber wenig Sinn. Bitte schreibt mir nicht einfach den Code hin, sondern gebt mir einfache Denkanstösse. Ich will es echt lernen!! Nur verstehe ich nicht sooo viel, deshalb bitte alles auf Kindergarten-Niveau ![]() Bitte helft mir.. Nur zur Info, hier meine aktuelle Steuerung des Objekts: Code: [AUSKLAPPEN] ;Steuerung
If KeyDown(203) = 1 Then x = x-5 If KeyDown(205) = 1 Then x = x+5 If KeyDown(200) = 1 Then y = y-5 If KeyDown(208) = 1 Then y = y+5 |
||
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: maximalegeschwindigkeit = 40
beschleunigung = 0.5 zeit = 7 (sekunden von 0 bis auf 40) Dadurch, dass du die Maximalgeschwindigkeit angegeben hast, und auch eine Zeit in der diese erreicht werden soll, ergibt sich eine Beschleunigung von 40/7000 Pro Millisekunde. Jetzt musst du nur noch schauen wie lange ein Schleifendurchgang dauert in Millisekunden und mal diesem Beschleunigungswert nehmen. Und hier noch ein Codebeispiel, dass du dir aber nicht anschauen solltest wenn du es selber lernen möchtest, nur aus Verständnisgründen vielleicht: MaxSpeed = 40;Maximale Geschwindigkeit AccZeit = 7000 ;Zeit für Beschleunigung(7 x 1000 ms = 7 sec) Global Acc# = Float(MaxSpeed)/AccZeit ;Beschleunigung berechnen Global Time;Hier wird mit Millisecs() immer die aktuelle Spielzeit abgespeichert Global DiffTime;Hier wird abgespeichert wie lange ein Schleifendurchgang aktuell dauert Global X,Y,Xspeed#,Yspeed# Repeat Cls ;Zeit-Update DiffTime = MilliSecs()-Time Time = MilliSecs() If KeyDown(203) = 1 Then Xspeed = Xspeed - (Acc# * DiffTime) If KeyDown(205) = 1 Then Xspeed = Xspeed + (Acc# * DiffTime) If KeyDown(200) = 1 Then Yspeed = Yspeed - (Acc# * DiffTime) If KeyDown(208) = 1 Then Yspeed = Yspeed + (Acc# * DiffTime) ;Maximalgeschwindigkeit begrenzen If Xspeed>MaxSpeed Xspeed = MaxSpeed If Yspeed>MaxSpeed Yspeed = MaxSpeed ;Objekt mit dieser Geschwindigkeit bewegen X = X + Xspeed Y = Y + Yspeed Flip Until KeyHit(1) End |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
b3_newbie |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich gebs auf.. sogar nachdem ich den vorgeschlagenen Code versucht habe klapps immer noch nicht. Findet ihr den Fehler??
Code: [AUSKLAPPEN] ;Name der Engine, graphische Einstellungen, BackBuffer verwenden
AppTitle "Engine: Acceleration" Graphics3D 640,480,16,0 SetBuffer BackBuffer() max_speed = 40 ;Maximale Geschwindigkeit acc_time = 7000 ;Zeit fuer Beschleunigung Global acc# = Float(max_speed/acc_time) ;Beschleunigung Global time ;Spielzeit (ms) Global time_diff ;Dauer eines Schleifendurchgangs Global x,y,xspeed#,yspeed# x = 300 y = 225 Repeat Cls time_diff = MilliSecs() - time time = MilliSecs() Oval x,y,35,25,1 If KeyDown(203) = 1 Then xspeed = xspeed - (acc#*time_diff) If KeyDown(205) = 1 Then xspeed = xspeed + (acc#*time_diff) If KeyDown(200) = 1 Then yspeed = yspeed - (acc#*time_diff) If KeyDown(208) = 1 Then yspeed = yspeed + (acc#*time_diff) ;Maximalgeschwindigkeit If xspeed > max_speed Then xspeed = max_speed If yspeed > max_speed Then yspeed = max_speed x = x+xspeed y = y+yspeed Flip Until KeyDown(1) UpdateWorld RenderWorld End |
||
![]() |
Mr.HydeNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
ALso so wie du das im Moment machst ist acc=0!!! daher bekommst du immer NULL für die Speed Variablen raus... werd mich mal genauer mit beschäftigen mehr später.
EDIT: Frage, soll der wert konstant oder variabel sein? ich würd den einfach vorberechnen und den Wert eintragen, dann müsste es gehn. EDIT2: hab den Wert 0.00571428 für acc genommen und es klappt... EDIT3: und jetzt auch wieder mit variablen: Code: [AUSKLAPPEN] ... max_speed# = 40.0 ;Maximale Geschwindigkeit acc_time# = 7000.0 ;Zeit fuer Beschleunigung Global acc# =max_speed/acc_time;Beschleunigung ... |
||
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ah, hi Mr. Hyde ![]() Zum Problem: Lag an mir, beim berechnen muss man beachten, dass er die Operation im Beispiel mit zwei Integer-Werten macht, da kürzt der automatisch zahlen weg und so bekommt man da immer 0. Um das zu umgehen muss man einfach einen der Int-Werte vorher in einen Float Wert konvertieren: Code: [AUSKLAPPEN] Global acc# = Float(max_speed)/acc_time ;Beschleunigung
Code: [AUSKLAPPEN] ;Name der Engine, graphische Einstellungen, BackBuffer verwenden
AppTitle "Engine: Acceleration" Graphics3D 640,480,16,0 SetBuffer BackBuffer() max_speed = 40 ;Maximale Geschwindigkeit acc_time = 7000 ;Zeit fuer Beschleunigung Global acc# = Float(max_speed)/acc_time ;Beschleunigung Global time ;Spielzeit (ms) Global time_diff ;Dauer eines Schleifendurchgangs Global x,y,xspeed#,yspeed# x = 300 y = 225 Repeat Cls time_diff = MilliSecs() - time time = MilliSecs() Oval x,y,35,25,1 If KeyDown(203) = 1 Then xspeed = xspeed - (acc#*time_diff) If KeyDown(205) = 1 Then xspeed = xspeed + (acc#*time_diff) If KeyDown(200) = 1 Then yspeed = yspeed - (acc#*time_diff) If KeyDown(208) = 1 Then yspeed = yspeed + (acc#*time_diff) ;Maximalgeschwindigkeit If xspeed > max_speed Then xspeed = max_speed If yspeed > max_speed Then yspeed = max_speed x = x+xspeed y = y+yspeed Text 10,10,x+"/"+y Flip Until KeyDown(1) UpdateWorld RenderWorld End |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group