Beschleunigung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

b3_newbie

Betreff: Beschleunigung

BeitragDi, Feb 14, 2006 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy

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

BeitragDi, Feb 14, 2006 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 14, 2006 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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.Hyde

Newsposter

BeitragDi, Feb 14, 2006 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 14, 2006 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, hi Mr. Hyde Wink

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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group