hier ist ein abgewandeltes Beispiel aus einem anderen Thread, beim Herumspielen habe ich bemerkt, dass Restitution und Friction vertauscht sind.
Code: Alles auswählen
EnableExplicit
#MINFPS = 30
#PLAYER_SIZE = 1.8
#CAMERA_DIST = 8
#SCALE_WALK = 1.0
#SCALE_RUN = 1.4
#SCALE_TURN = 0.1
Structure fVector3
x.f
y.f
z.f
EndStructure
Structure structKeysettings
forward.i
backward.i
turnLeft.i
turnRight.i
strafeLeft.i
strafeRight.i
run.i
EndStructure
Structure structPlayer
init.b
Keys.structKeysettings
Rotate.fVector3
Move.fVector3
entity.i
physic.i
camera.i
bbCross.i
nodeMain.i
nodeForward.i
nodeStrafe.i
nodeCamera.i
EndStructure
Structure structLevel
sun.i
floor.i
grass.i
Array houses.i(25)
EndStructure
Define.b DoLoop = #True
Define.f TimeSinceLastFrame
Define.structPlayer Player
Define.structLevel Level
Declare Level_Create()
Declare Player_Create()
Declare Player_UpdateControls()
Declare Player_Update()
Declare CheckCollisions()
; init
InitEngine3D(#PB_Engine3D_DebugLog)
InitSprite()
InitKeyboard()
InitMouse()
OpenWindow(0,0,0,1024,768,"Simple 3rd Person",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0), 0, 0, 0, #PB_Screen_WaitSynchronization)
Add3DArchive(#PB_Compiler_Home + "Examples\3D\Data\Textures\", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "Examples\3D\Data\Scripts\", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "Examples\3D\Data\Models\", #PB_3DArchive_FileSystem)
Parse3DScripts()
WorldShadows(#PB_Shadow_Additive)
EnableWorldPhysics(#True)
EnableWorldCollisions(#True)
Level_Create()
Player_Create()
WorldDebug(#PB_World_DebugBody)
Repeat
While WindowEvent() : Wend
Player_Update()
TimeSinceLastFrame = RenderWorld(#MINFPS) / 60
FlipBuffers()
CheckCollisions()
Until DoLoop = #False
End
Macro SetPosition(Object, PositionX=0, PositionY=0, PositionZ=0)
If IsNode(Object)
MoveNode(Object, PositionX, PositionY, PositionZ, #PB_Absolute)
ElseIf IsEntity(Object)
MoveEntity(Object, PositionX, PositionY, PositionZ, #PB_Absolute)
ElseIf IsCamera(Object)
MoveCamera(Object, PositionX, PositionY, PositionZ, #PB_Absolute)
EndIf
EndMacro
Macro GetPosition(Object, Position)
If IsNode(Object)
Position\x = NodeX(Object)
Position\y = NodeY(Object)
Position\z = NodeZ(Object)
ElseIf IsEntity(Object)
Position\x = EntityX(Object)
Position\y = EntityY(Object)
Position\z = EntityZ(Object)
ElseIf IsCamera(Object)
Position\x = CameraX(Object)
Position\y = CameraY(Object)
Position\z = CameraZ(Object)
EndIf
EndMacro
Macro AddVec3(v1, v2, vResult)
vResult\x = v1\x + v2\x
vResult\y = v1\y + v2\y
vResult\z = v1\z + v2\z
EndMacro
Macro SubVec3(v1, v2, vResult)
vResult\x = v1\x - v2\x
vResult\y = v1\y - v2\y
vResult\z = v1\z - v2\z
EndMacro
Procedure Level_Create()
Shared Level
Protected.l i
Protected.i tempTexture, tempMaterial, tempMesh
Protected.f radius, scale, height
SkyDome("clouds.jpg", 60)
; floor
tempTexture = LoadTexture(#PB_Any, "grass.jpg")
tempMaterial = CreateMaterial(#PB_Any, TextureID(tempTexture))
tempMesh = CreatePlane(#PB_Any, 512, 512, 1, 1, 128, 128)
Level\floor = CreateEntity(#PB_Any, MeshID(tempMesh), MaterialID(tempMaterial), 0, -#PLAYER_SIZE/2, 0)
EntityPhysicBody(Level\floor, #PB_Entity_StaticBody)
FreeMesh(tempMesh)
FreeMaterial(tempMaterial)
FreeTexture(tempTexture)
; grass
tempTexture = LoadTexture(#PB_Any, "grass1.png")
tempMaterial = CreateMaterial(#PB_Any, TextureID(tempTexture))
MaterialBlendingMode(tempMaterial, #PB_Material_AlphaBlend)
Level\grass = CreateBillboardGroup(#PB_Any, MaterialID(tempMaterial), 1, 1)
For i = 0 To 10240
AddBillboard(i, Level\grass, Random(512)-256, 0, Random(512)-256)
Next
FreeMaterial(tempMaterial)
FreeTexture(tempTexture)
; houses
tempMesh = LoadMesh(#PB_Any, "tudorhouse.mesh")
radius = MeshRadius(tempMesh)
scale = 6 * #PLAYER_SIZE / radius
height = scale * (radius / 2) + 1.75
For i = 0 To 19
Level\houses(i) = CreateEntity(#PB_Any, MeshID(tempMesh), #PB_Material_None, Random(384)-162, height, Random(384)-162)
RotateEntity(Level\houses(i), 0, Random(90), 0, #PB_Absolute)
ScaleEntity(Level\houses(i), scale, scale, scale, #PB_Absolute)
EntityPhysicBody(Level\houses(i), #PB_Entity_StaticBody)
Next
FreeMesh(tempMesh)
; sun
Level\sun = CreateLight(#PB_Any, RGB(255, 250, 205), -512, 512, 0, #PB_Light_Point)
; done !
EndProcedure
Procedure Player_Create()
Shared Player
Protected.i tempTexture, tempMaterial, tempMesh
Protected.f radius, scale
tempTexture = LoadTexture(#PB_Any, "viseur-jeux.png")
tempMaterial = CreateMaterial(#PB_Any, TextureID(tempTexture))
MaterialBlendingMode(tempMaterial, #PB_Material_AlphaBlend)
tempMesh = LoadMesh(#PB_Any, "ninja.mesh")
radius = MeshRadius(tempMesh)
scale = #PLAYER_SIZE / radius
With Player
\entity = CreateEntity(#PB_Any, MeshID(tempMesh), #PB_Material_None, 0, 1, 0)
ScaleEntity(\entity, scale, scale, scale, #PB_Absolute)
EntityPhysicBody(\entity, #PB_Entity_CapsuleBody, 0.8, 0, 0.01)
SetEntityAttribute(\entity, #PB_Entity_LinearSleeping, 0)
SetEntityAttribute(\entity, #PB_Entity_AngularSleeping, 0)
;\physic = CreateEntity(#PB_Any, MeshID(tempMesh), #PB_Material_None, 0, 0, 0)
;ScaleEntity(\physic, scale, scale, scale, #PB_Absolute)
;HideEntity(\physic, #False)
;EntityPhysicBody(\physic, #PB_Entity_StaticBody, 0.8, 0, 0)
\bbCross = CreateBillboardGroup(#PB_Any, MaterialID(tempMaterial), 1, 1, 0, 0, -10)
AddBillboard(0, \bbCross, 0, 0, 0)
\nodeMain = CreateNode(#PB_Any, 0, #PLAYER_SIZE, 0)
\nodeForward = CreateNode(#PB_Any, 0, 0, -1)
\nodeStrafe = CreateNode(#PB_Any, -1, 0, 0)
\nodeCamera = CreateNode(#PB_Any, 0, #CAMERA_DIST/4, #CAMERA_DIST)
\camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
RotateCamera(\camera, -10, 0, 0, #PB_Absolute)
AttachNodeObject(\nodeMain, NodeID(\nodeForward))
AttachNodeObject(\nodeMain, NodeID(\nodeStrafe))
AttachNodeObject(\nodeMain, NodeID(\nodeCamera))
AttachNodeObject(\nodeMain, BillboardGroupID(\bbCross))
AttachNodeObject(\nodeCamera, CameraID(\camera))
\Keys\forward = #PB_Key_W
\Keys\backward = #PB_Key_S
\Keys\turnLeft = #PB_Key_A
\Keys\turnRight = #PB_Key_D
\Keys\strafeLeft = #PB_Key_Q
\Keys\strafeRight = #PB_Key_E
\Keys\run = #PB_Key_LeftShift
EndWith
FreeMesh(tempMesh)
FreeMaterial(tempMaterial)
FreeTexture(tempTexture)
EndProcedure
Procedure Player_UpdateControls()
Shared Player, DoLoop, TimeSinceLastFrame
Protected.f speed, speed2
Protected.fVector3 mainPos, forwardPos, strafePos, forwardDir, strafeDir, forwardMove, strafeMove
With Player
GetPosition(\nodeMain, mainPos)
GetPosition(\nodeForward, forwardPos)
GetPosition(\nodeStrafe, strafePos)
SubVec3(forwardPos, mainPos, forwardDir)
SubVec3(strafePos, mainPos, strafeDir)
EndWith
If ExamineKeyboard()
If KeyboardReleased(#PB_Key_Escape)
DoLoop = #False
EndIf
With Player\Keys
If KeyboardPushed(\run)
speed = #SCALE_RUN * TimeSinceLastFrame
Else
speed = #SCALE_WALK * TimeSinceLastFrame
EndIf
speed2 = speed / 2
If KeyboardPushed(\forward)
forwardMove\x = forwardDir\x * speed
forwardMove\z = forwardDir\z * speed
ElseIf KeyboardPushed(\backward)
forwardMove\x = forwardDir\x * -speed2
forwardMove\z = forwardDir\z * -speed2
Else
forwardMove\x = 0
forwardMove\z = 0
EndIf
If KeyboardPushed(\turnLeft)
Player\Rotate\y = 1
ElseIf KeyboardPushed(\turnRight)
Player\Rotate\y = -1
Else
Player\Rotate\y = 0
EndIf
If KeyboardPushed(\strafeLeft)
strafeMove\x = strafeDir\x * speed2
strafeMove\z = strafeDir\z * speed2
ElseIf KeyboardPushed(\strafeRight)
strafeMove\x = strafeDir\x * -speed2
strafeMove\z = strafeDir\z * -speed2
Else
strafeMove\x = 0
strafeMove\z = 0
EndIf
EndWith
EndIf
If ExamineMouse()
If Player\Rotate\y = 0
Player\Rotate\x = -MouseDeltaY() * #SCALE_TURN
Player\Rotate\y = -MouseDeltaX() * #SCALE_TURN
EndIf
EndIf
AddVec3(forwardMove, strafeMove, Player\Move)
EndProcedure
Procedure Player_Update()
Shared Player
Static.b walking
Player_UpdateControls()
With Player
If \Move\x <> 0 Or \Move\z <> 0
If Not walking
StartEntityAnimation(\entity, "Walk")
walking = #True
EndIf
Else
If walking
StopEntityAnimation(\entity, "Walk")
EndIf
walking = #False
EndIf
ApplyEntityForce(\entity, \Move\x, 0, \Move\z)
MoveEntity(\entity, \Move\x, 0, \Move\z, #PB_Relative)
RotateEntity(\entity, 0, \Rotate\y, 0, #PB_Relative)
;;MoveNode(\nodeMain, \Move\x, 0, \Move\z, #PB_Relative)
;;RotateNode(\nodeMain, 0, \Rotate\y, 0, #PB_Relative)
RotateNode(\nodeCamera, \Rotate\x, 0, 0, #PB_Relative)
MoveNode(\nodeMain, EntityX(\entity), #PLAYER_SIZE, EntityZ(\entity), #PB_Absolute)
RotateNode(\nodeMain, 0, EntityYaw(\entity), 0, #PB_Absolute)
;;MoveEntity(\entity, NodeX(\nodeMain), -#PLAYER_SIZE/2, NodeZ(\nodeMain), #PB_Absolute)
;;RotateEntity(\entity, 0, NodeYaw(\nodeMain), 0, #PB_Absolute)
;;MoveEntity(\physic, NodeX(\nodeMain), -0.1, NodeZ(\nodeMain), #PB_Absolute)
EndWith
EndProcedure
Procedure CheckCollisions()
Shared Level
Protected.i first, second
If ExamineWorldCollisions(#True)
While NextWorldCollision()
first = FirstWorldCollisionEntity()
second = SecondWorldCollisionEntity()
If first <> Level\floor And second <> Level\floor
Debug "Entity #"+Str(first)+" collide with Entity #"+Str(second)
EndIf
Wend
EndIf
EndProcedure
Fehler in der Doku oder auf damit ins englische Lager?