Voiture et virage
Publié : dim. 18/nov./2007 10:02
Je visite de temps en temps le forum allemand, le dimanche quand j'y pense, et je viens de tomber sur ce code, je ne l'ai pas encore analysé, mais j'aime bien ce que je vois sur l'écran, et ça peut servir à d'autres, notamment huitbit et ses petites voitures ?
Source de l'information
Source de l'information
Code : Tout sélectionner
;http://www.purebasic.fr/german/viewtopic.php?t=14815
InitSprite()
InitSprite3D()
InitKeyboard()
OpenScreen(1024, 768, 32, "test")
CreateSprite(1, 64, 64, #PB_Sprite_Texture)
StartDrawing(SpriteOutput(1))
Box(0, 16, 32, 32, RGB(192,192,192))
Box(32, 16, 32, 32, #Gray)
StopDrawing()
CreateSprite3D(1, 1)
; startposition Auto
carx.f = 200
cary.f = 200
; startwinkel Auto
cara.f = 0
; Geschwindigkeit
cars.f = 0
carsmax.f = 5
carb.f = 0.1
; radabstand
l = 32
; lenkeinschlag
alpha.f = 0*#PI/180
; gegenwinkel zu alpha
beta.f = 90*#PI/180-alpha
; winkel des Autos
angle.f = cara*#PI/180
; max Lenkausschlag
maxlenk.f = 25*#PI/180
Repeat
FlipBuffers()
ClearScreen(0)
ExamineKeyboard()
; Lenkung
If KeyboardPushed(#PB_Key_Left)
alpha - 0.05
ElseIf KeyboardPushed(#PB_Key_Right)
alpha + 0.05
EndIf
If alpha > maxlenk
alpha = maxlenk
ElseIf alpha < -maxlenk
alpha = -maxlenk
EndIf
; beta neu berechnen: beta=90-alpha
beta.f = 0.5*#PI-alpha
; Radius der Vorderachse
r1.f = l/Cos(beta)
; Radius der Hinterachse
r2.f = Tan(beta)*l
; Wendepunkt der Kurve bestimmen
mx.f = carx + Sin(angle)*r2
my.f = cary + Cos(angle)*r2
If KeyboardPushed(#PB_Key_Down) ; Bremsen
If cars > 0 : cars - carb : EndIf
If cars < 0 : cars = 0 : EndIf
ElseIf KeyboardPushed(#PB_Key_Up) ; Gasgeben
cars + carb
If cars > carsmax : cars = carsmax : EndIf
Else ; Rollen
cars - carb*0.1
If cars < 0 : cars = 0 : EndIf
EndIf
; speed (cars) auf dem Bogen vorangehen
angle - cars/r1
If Abs(beta-#PI/2) > 0.01
; neue Position des Autos bestimmen
carx = mx - Sin(angle)*r2
cary = my - Cos(angle)*r2
Else
; neue Position des Autos bestimmen
carx + Cos(angle)*cars
cary - Sin(angle)*cars
EndIf
If alpha < 0
alpha + 0.02
If alpha > 0
alpha = 0
EndIf
ElseIf alpha > 0
alpha - 0.02
If alpha < 0
alpha = 0
EndIf
EndIf
Start3D()
; Sprite drehen
RotateSprite3D(1, -angle*180/#PI, 0)
; Sprite auf der Hinterachse zentrieren
DisplaySprite3D(1, carx-32+Cos(angle)*16, cary-32-Sin(angle)*16)
Stop3D()
StartDrawing(ScreenOutput())
; Hinterachse anzeigen
Circle(carx, cary, 3, #Red)
; Drehpunkt anzeigen
Circle(mx, my, 3, #Green)
DrawingMode(4)
; Auto Richtung anzeigen
Line(carx, cary, Cos(angle)*l, -Sin(angle)*l, #Red)
; Radius Vorderachse
If Cos(beta) <> 0
Circle(mx, my, l/Cos(beta), #Red)
EndIf
; Radius Hinterachse
If Cos(beta) <> 0
Circle(mx, my, Tan(beta)*l, #Blue)
EndIf
; Lenkung anzeigen
Line(carx+Cos(angle)*l, cary-Sin(angle)*l, Cos(angle-alpha)*10, -Sin(angle-alpha)*10, #White)
Line(carx+Cos(angle)*l, cary-Sin(angle)*l, Cos(angle-alpha+#PI)*10, -Sin(angle-alpha+#PI)*10, #White)
DrawingMode(1)
FrontColor(#White)
DrawText(10, 10, "Lenkeinschlag: "+Str(alpha*180/#PI)+"°", #White)
DrawText(10, 30, "CarAngle: "+StrF(angle*180/#PI, 2)+"°", #White)
DrawText(10, 50, "r2: "+StrF(r2,2), #White)
StopDrawing()
Until KeyboardReleased(#PB_Key_Escape)
End