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