Hier ein Code, den ich mal gefunden hatte. (NICHT von mir)
Nicht vergessen ein Car-Sprite anzugeben!
Code: Alles auswählen
;Author: BalrogSoft
InitSprite()
InitSprite3D()
InitKeyboard()
Procedure.f min(a.f, d.f)
If a < d
ProcedureReturn a
Else
ProcedureReturn d
EndIf
EndProcedure
Procedure.f max(a.f, d.f)
If a > d
ProcedureReturn a
Else
ProcedureReturn d
EndIf
EndProcedure
Procedure.f sign(a.f)
If a.f < 0
ProcedureReturn -1.0
Else
ProcedureReturn 1.0
EndIf
EndProcedure
Procedure.f adjust(v.f,threshold.f,maximum.f)
vx.f = 0
If (v <= threshold)
vx=(v/threshold)*1.0
Else
vx = 1
EndIf
ProcedureReturn vx
EndProcedure
Quit.b = #False
accel.f = 0.2 ; acceleration due To gas (up arrow)
steer.f = 0.08 ; steering tightness
steer_normal.f = 0.08 ; Default Steering
steer_handbrake.f = 0.099 ; Incremental increases For handbrakeys
steer_threshold.f = 4 ; Speed where steering at its most manouvreable
MINspd.f = -5 ; max reverse speed
MAXspd.f = 22 ; max speed on straightaway
MAXskiddisplay.f = 2 ; Display skids on slides till this value reached
MAXturnSpd.f = 10 ; maximum speed While turning
MaxTurnSkid.f = 18 ; Maximum speed in turn before skidding
deccel.f = 0.92 ; decelleration due To brakes (down arrow)
handbrake.f = 0.93 ; decelleration due To brakes (down arrow)
handbrake_traction.f = 20 ; Amount of slide For handbrake higher is more
drift.f = 0.98 ; deceleration after letting off gas
speed.f = 0 ; duuuh!
surface.f = 3 ; Tar = 10 gravel = 1 ice = 0.5
traction.f = 5 ; the higher the more slippery init value
traction_max.f = 1 ; Max Traction
Dim vector.f(1) ; vector of the direction of the car
bounceBack.f = 0.6 ; percent of speed when bounced back from hitting an obstacle
angle.f
collide = false ; Used To make sure car doesnt get stuck in collision checks
If OpenWindow(0, 0, 0, 640, 480, "Car Physics", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0), 0, 0, 640, 480, 0, 0, 0)
LoadSprite(0, "car.bmp", #PB_Sprite_Texture)
CreateSprite3D(0, 0)
Repeat
WEvent = WindowEvent()
If WEvent = #PB_Event_CloseWindow
Quit = #True
EndIf
rotation = angle * 180 / #PI
ExamineKeyboard()
UP = KeyboardPushed(#PB_Key_Up) >> 7
DOWN = KeyboardPushed(#PB_Key_Down) >> 7
HAND = KeyboardPushed(#PB_Key_LeftControl) >> 7
LEFT = KeyboardPushed(#PB_Key_Left) >> 7
RIGHT = KeyboardPushed(#PB_Key_Right) >> 7
UD = UP - DOWN
LR = RIGHT - LEFT
If LR
angle + (LR*steer*adjust(Abs(speed),steer_threshold, MAXSpd))
EndIf
If UD = #False
speed * drift
ElseIf UD <> #False And HAND = #False
speed = Min(Max(speed+UD*accel,MINspd),MAXspd)
EndIf
If (Abs(speed) < accel/2)
speed = 0
EndIf
If HAND
speed * handbrake
If (speed > MAXskiddisplay)
steer = steer_handbrake
EndIf
traction = handbrake_traction/surface
Else
traction = Max(traction_max, Abs((speed-MAXturnSpd)/surface))
steer = steer_normal
EndIf
If (speed < 0 )
traction = 1.0
EndIf
xv.f = ((Cos(angle) * speed) - vector(0))/traction
yv.f = ((Sin(angle) * speed) - vector(1))/traction
vector(0) + xv.f
vector(1) + yv.f
track_x.f + vector(0)
track_y.f + vector(1)
StartDrawing(ScreenOutput())
DrawText(0, 0, "Car x: " + StrF(x))
DrawText(0, 20, "Car y: " + StrF(y))
DrawText(0, 60, "speed: "+ StrF(speed))
DrawText(0, 80, "angle: " + StrF(rotation))
StopDrawing()
Start3D()
RotateSprite3D(0, rotation + 275, 0)
DisplaySprite3D(0, track_x, track_y, 255)
Stop3D()
FlipBuffers()
ClearScreen(0)
Delay(30)
Until Quit = #True
CloseWindow(0)
EndIf
Ich werde jetzt mal kurz den Autor hiervon suchen...
EDIT:
kommt von BalrogSoft:
http://www.purebasic.fr/english/viewtopic.php?t=25481