3D Examples need few changes to work --> SetVehicleSteering() become ApplyVehicleSteering(), etc.
Code: Select all
;
; ------------------------------------------------------------
;
; PureBasic - CreateVehicle
;
; (c) Fantaisie Software
;
; ------------------------------------------------------------
;
IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"
#CameraSpeed = 2
Global.f KeyX, KeyY, MouseX, MouseY, ElapsedTime
Structure Vector3
x.f
y.f
z.f
EndStructure
Macro VECTOR3(V, a, b, c)
V\x = a
V\y = b
V\z = c
EndMacro
Structure s_Vehicle
Chassis.i
Wheels.i[4]
EngineBrake.f
EngineForce.f
Steering.f
SteeringLeft.i
SteeringRight.i
EndStructure
Global Recul = #False
Global MaxEngineForce.f = 2000.0
Global MaxEngineBrake.f = 150.0
Global SteeringIncrement.f = 0.5
Global SteeringClamp.f = 27
Global WheelRadius.f = 0.5;
Global WheelWidth.f = 0.4 ;
Global SuspensionStiffness.f = 20.0
Global SuspensionDamping.f = 3.3
Global SuspensionCompression.f = 4.4
Global MaxSuspensionTravelCm.f = 500.0;
Global FrictionSlip.f = 20
Global RollInfluence.f = 0.3
Global SuspensionRestLength.f = 0.6;
Global Vehicle.s_Vehicle
#CUBE_HALF_EXTENTS = 1
Declare BuildVehicle(*Vehicle.s_Vehicle)
Declare HandleVehicle()
Declare ControlVehicle(elapsedTime.f)
Declare.f Interpolation(x1.f, x2.f, percent.f)
If InitEngine3D()
InitSprite()
InitKeyboard()
InitMouse()
If Screen3DRequester()
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures/", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Packs/desert.zip", #PB_3DArchive_Zip)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Scripts" , #PB_3DArchive_FileSystem)
Parse3DScripts()
WorldShadows(#PB_Shadow_Modulative, -1, RGB(105, 105, 105))
;- Material
;
CreateMaterial(0, LoadTexture(0, "Wood.jpg"))
GetScriptMaterial(1, "SphereMap/SphereMappedRustySteel")
CreateMaterial(2, LoadTexture(2, "Dirt.jpg"))
ScaleMaterial(2,0.05,0.05)
GetScriptMaterial(3, "Scene/GroundBlend")
;-Ground
;
CreatePlane(0, 500, 500, 5, 5, 5, 5)
CreateEntity(0,MeshID(0),MaterialID(2))
EntityRenderMode(0, 0)
CreateEntityBody(0, #PB_Entity_PlaneBody, 0, 0, 1)
;-Walls
;
CreateCube(1, 1)
CreateEntity(1,MeshID(1),MaterialID(2),0,1, 250)
ScaleEntity(1,500,2,0.5)
CreateEntityBody(1, #PB_Entity_PlaneBody, 0, 0, 1,-1,-1,-1, 0,0,-1)
CreateEntity(2,MeshID(1),MaterialID(2),0,1, -250)
ScaleEntity(2,500,2,0.5)
CreateEntityBody(2, #PB_Entity_PlaneBody, 0, 0, 1,-1,-1,-1, 0,0,1)
CreateEntity(3,MeshID(1),MaterialID(2),250,1, 0)
ScaleEntity(3,0.5,2,500)
CreateEntityBody(3, #PB_Entity_PlaneBody, 0, 0, 1,-1,-1,-1, -1,0,0)
CreateEntity(4,MeshID(1),MaterialID(2),-250,1, 0)
ScaleEntity(4,0.5,2,500)
CreateEntityBody(4, #PB_Entity_PlaneBody, 0, 0, 1,-1,-1,-1, 1,0,0)
CylinderMEsh = CreateCylinder(#PB_Any, 0.5, 2)
For i=-250 To 250 Step 30
Cylinder = CreateEntity(#PB_Any,MeshID(CylinderMEsh),MaterialID(1), 0, 1, i)
CreateEntityBody(Cylinder, #PB_Entity_CylinderBody, 0, 0, 1)
Next
;- Light
;
CreateLight(0 ,RGB(190, 190, 190), 400, 120, 100,#PB_Light_Directional)
SetLightColor(0, #PB_Light_SpecularColor, RGB(255*0.4, 255*0.4,255*0.4))
LightDirection(0 ,0.55, -0.3, -0.75)
AmbientColor(RGB(255*0.2, 255*0.2,255*0.2))
;- Camera
;
CreateCamera(0, 0, 0, 100, 100)
MoveCamera(0, 800, 400, 80, #PB_Absolute)
; SkyBox
;
SkyBox("desert07.jpg")
;-
BuildVehicle(@Vehicle)
;-Main
;
Repeat
Screen3DEvents()
ExamineMouse()
ExamineKeyboard()
HandleVehicle()
ControlVehicle(ElapsedTime/20)
CameraFollow(0, EntityID(Vehicle\Chassis),180, 3.5, 10, 0.1, 0.1)
ElapsedTime = RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End
EndIf
Else
MessageRequester("Error","Can't initialize engine3D")
EndIf
Procedure Clamp(*var.float, min.f, max.f)
If *var\f < min
*var\f = min
ElseIf *var\f > max
*var\f = max
EndIf
EndProcedure
Procedure BuildVehicle(*Vehicle.s_Vehicle)
Protected.VECTOR3 connectionPointCS0; wheelDirectionCS0,wheelAxleCS,
With *Vehicle
\SteeringLeft = #False
\SteeringRight = #False
\EngineForce = 0
\Steering = 0
;- >>> create vehicle <<<<<
connectionHeight.f = 0.6
ChassisMesh = CreateCube(#PB_Any, 2)
ChassisEntity = CreateEntity(#PB_Any, MeshID(chassisMesh), MaterialID(3), 0, 1, 0)
ScaleEntity(ChassisEntity, 0.8, 0.7, 2)
\Chassis = CreateVehicle(#PB_Any)
AddSubEntity(\Chassis, ChassisEntity, #PB_Entity_BoxBody)
EntityRenderMode(\Chassis, #PB_Entity_CastShadow)
CreateVehicleBody(\Chassis, 700, 0.3, 0.8,suspensionStiffness, suspensionCompression, suspensionDamping, maxSuspensionTravelCm, frictionSlip)
MoveEntity(\Chassis, 0, 3, 0,#PB_Absolute)
DisableDebugger
SetEntityAttribute(\Chassis, 27, 0.0)
SetEntityAttribute(\Chassis, 28, 0.0)
EnableDebugger
Wheel = CreateSphere(#PB_Any, WheelRadius)
For i = 0 To 3
\Wheels[i] = CreateEntity(#PB_Any, MeshID(Wheel), #PB_Material_None)
ScaleEntity(\Wheels[i], WheelWidth,1,1)
Next
;-WheelSteerable and WheelsEngine
VECTOR3(connectionPointCS0, #CUBE_HALF_EXTENTS-(0.2*WheelWidth), connectionHeight,2*#CUBE_HALF_EXTENTS-WheelRadius)
AddVehicleWheel(\Chassis, \Wheels[0],
connectionPointCS0\x, connectionPointCS0\y,connectionPointCS0\z,
-1, 0,0, SuspensionRestLength, WheelRadius, #True, RollInfluence)
VECTOR3(connectionPointCS0, -#CUBE_HALF_EXTENTS+(0.2*WheelWidth), connectionHeight, 2*#CUBE_HALF_EXTENTS-WheelRadius)
AddVehicleWheel(\Chassis, \Wheels[1],
connectionPointCS0\x, connectionPointCS0\y,connectionPointCS0\z,
-1, 0,0, SuspensionRestLength, WheelRadius, #True, RollInfluence)
VECTOR3(connectionPointCS0, -#CUBE_HALF_EXTENTS+(0.2*WheelWidth), connectionHeight, -2*#CUBE_HALF_EXTENTS+WheelRadius);
AddVehicleWheel(\Chassis, \Wheels[2],
connectionPointCS0\x, connectionPointCS0\y,connectionPointCS0\z,
-1, 0,0, SuspensionRestLength, WheelRadius, #False, RollInfluence)
VECTOR3(connectionPointCS0, #CUBE_HALF_EXTENTS-(0.2*WheelWidth), connectionHeight, -2*#CUBE_HALF_EXTENTS+WheelRadius);
AddVehicleWheel(\Chassis, \Wheels[3],
connectionPointCS0\x, connectionPointCS0\y,connectionPointCS0\z,
-1, 0,0, SuspensionRestLength, WheelRadius, #False, RollInfluence)
EndWith
EndProcedure
Procedure HandleVehicle()
If KeyboardPushed(#PB_Key_Left)
Vehicle\SteeringLeft = #True
Vehicle\SteeringRight = #False
ElseIf KeyboardPushed(#PB_Key_Right)
Vehicle\SteeringRight = #True
Vehicle\SteeringLeft = #False
Else
Vehicle\SteeringRight = #False
Vehicle\SteeringLeft = #False
EndIf
If KeyboardPushed(#PB_Key_Down)
If GetEntityAttribute(Vehicle\Chassis, #PB_Entity_LinearVelocity)< 0.4
Recul = #True
EndIf
If Recul
Vehicle\EngineForce = -MaxEngineForce
Vehicle\EngineBrake = 0
Else
Vehicle\EngineForce = 0
Vehicle\EngineBrake = MaxEngineBrake
EndIf
ElseIf KeyboardPushed(#PB_Key_Up)
Vehicle\EngineForce = MaxEngineForce
Vehicle\EngineBrake = 0
Else
Vehicle\EngineBrake = MaxEngineForce/ 100
Vehicle\EngineForce = 0
Recul = #False
EndIf
EndProcedure
Procedure ControlVehicle(elapsedTime.f)
; apply engine Force on relevant wheels
For i = 0 To 1
ApplyVehicleBrake(Vehicle\Chassis, i, Vehicle\EngineBrake)
ApplyVehicleForce(Vehicle\Chassis, i, Vehicle\EngineForce)
Next
If (Vehicle\SteeringLeft)
Vehicle\Steering + SteeringIncrement*elapsedTime
If (Vehicle\Steering > SteeringClamp)
Vehicle\Steering = SteeringClamp
EndIf
ElseIf (Vehicle\SteeringRight)
Vehicle\Steering - SteeringIncrement*elapsedTime
If (Vehicle\Steering < -SteeringClamp)
Vehicle\Steering = -SteeringClamp
EndIf
Else
Vehicle\Steering = Interpolation(Vehicle\Steering, 0, 0.05)
EndIf
; apply Steering on relevant wheels
For i = 0 To 1
ApplyVehicleSteering(Vehicle\Chassis, i, Vehicle\Steering)
Next
EndProcedure
Procedure.f Interpolation(x1.f, x2.f, percent.f)
If percent<0
percent=0
EndIf
If percent>1
percent=1
EndIf
ProcedureReturn x1 + percent * (x2 - x1)
EndProcedure