In this example, the NPC's speed changes dramatically depending on where the camera is pointing.
When moving, the speed can change unpredictably.
How to solve this correctly?
Code: Select all
;- CONST
Global scale=20*10
;Camera
Global.i camR = 1000 ;Camera range
Global GUI, room_ok
#PlayerSpeed = 60
#CameraSpeed = 0.8
#window = 2
#kam_0 = 1
#plane = 0
#planent = 0
#cam_type = 2 ;main -2, - 1
#Light=3
init=0
Global ScreenWidth, ScreenHeight
Structure s_Key
Up.i
Down.i
Left.i
Right.i
Jump.i
EndStructure
Structure s_Entity
EntityBody.i
BodyOffsetY.f
elapsedTime.f
rot_x.f
rot_y.f
rot_z.f
Fov.f
Key.s_Key
MainNode.i
CameraNode.i
HandNode.i
ForwardNode.i
StrafeNode.i
LampNode.i
hidelamp.i
HideMenu.i
EndStructure
Global main_Entity.s_Entity
Macro GetNodePosition(Position, Node)
Position\x = NodeX(Node)
Position\y = NodeY(Node)
Position\z = NodeZ(Node)
EndMacro
Macro SubVector3(V, V1, V2)
V\x = V1\x - V2\x
V\y = V1\y - V2\y
V\z = V1\z - V2\z
EndMacro
;-Declare
Declare HandleEntity(*Entity.s_Entity)
Declare OnGround(*Entity.s_Entity)
Define Robot.s_Entity
Global prefix$ = "main"
Global Scroll_stor, Scroll_inv
;;;;;;;;;;;;;;;;
Global global_x.l = 24;256-200
Global global_y.l = 12;32-10
Global global_z.l = 24;256-200
Global flash_on = 0
Declare g_start(type)
Structure game
state_base_lamp.l
wrds_id.l
cur_save_ver.l
item_up.l
inv.l
room_id.l
inventory.s
th_light.l
sg.l
flashlight.l
EndStructure
Global game.game
;- INIT
InitEngine3D();#PB_Engine3D_EnableCG)
InitSprite()
InitKeyboard()
InitMouse()
If #window=1
OpenWindow(#window, 0, 0, 1280, 1024, "FPS-Test", #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#window), 10, 10, 1280-20, 1024-20, 1, 10, 10, #PB_Screen_SmartSynchronization)
EndIf
If #window=2
OpenScreen(1280, 1024, 32, "test", #PB_Screen_SmartSynchronization)
AntialiasingMode(#PB_AntialiasingMode_x6)
SetFrameRate(60)
EndIf
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)
;Add3DArchive("D:\~3D\m2", #PB_3DArchive_FileSystem)
Parse3DScripts()
Enumeration mesh 100 Step 10
#mesh_baseblock
EndEnumeration
Global FPS, block$, index_cur.l
Global light2
;> LoadMesh
;Robot Body
LoadMesh(0, "robot.mesh")
TransformMesh(0, 0, 0, 0, 1, 1, 1, 0, -90, 0)
LoadMesh(1, "AKM.mesh")
LoadMesh(2, "ninja.mesh")
; TransformMesh(2, 0, 0, 0, 1, 1, 1, 0, 90, 0)
LoadTexture(0, "Dirt.jpg")
;- Material
CreateMaterial(1, LoadTexture(1,"viseur-jeux.png"))
MaterialBlendingMode(1, #PB_Material_AlphaBlend)
CreateMaterial(4, LoadTexture(4, "Dirt.jpg"))
CreateMaterial(5, LoadTexture(5, "t1.jpg"))
CreateMaterial(6, LoadTexture(6, "r2skin.jpg"))
CreateMaterial(7, LoadTexture(7, "RustySteel.jpg"))
;LoadMesh(#mesh_baseblock, "Barrel.mesh");
LoadMesh(#mesh_baseblock, "chassis.mesh");
TransformMesh(#mesh_baseblock, 0, 0, 0, 10, 10, 10, 0, 0, 0)
;CreateCube(#mesh_baseblock, 180)
;TransformMesh(#mesh_baseblock, -100, 10, -100, 1.1, 1.1, 0.1, 90, 0, 0)
BuildMeshShadowVolume(#mesh_baseblock)
NormalizeMesh(#mesh_baseblock)
;<
Procedure Create_static(sg, mesh, Material, x, y, z, body=1, pick_mask=1, ent_grp=1, ent_mask=1, vis_mask=2);, scale=1, rot_x=0, rot_y=0, rot_z=0
ent = CreateEntity(#PB_Any, mesh, Material, x, y, z, pick_mask, vis_mask)
If ent
;EntityRenderMode(ent, #PB_Shadow_None)
EntityRenderMode(ent, #PB_Entity_CastShadow)
SetRenderQueue(EntityID(ent), 50 , 1000)
If body
CreateEntityBody(ent, #PB_Entity_StaticBody);, 0, 0.8, 1
SetEntityCollisionFilter(ent, ent_grp, ent_mask)
EndIf
If vis_mask=2
AddStaticGeometryEntity(sg, EntityID(ent), x, y, z, 1, 1, 1)
HideEntity(ent, 1)
EndIf
EndIf
ProcedureReturn ent
EndProcedure
Procedure StaticGeometry()
Define rf_x, rf_y, rf_z, r_x, r_y, r_z, f, ok, inn, x, z, y
Define.i ent, sg
Define rx, ry, rz, rrx, rry, rrz, inner_room, light_lamp, room$
sg = CreateStaticGeometry(#PB_Any, global_x*scale, global_y*scale, global_z*scale, 0)
Debug "Static " + sg
create_static(sg, MeshID(0), MaterialID(4), -1*scale, 0*scale, -1*scale)
create_static(sg, MeshID(0), MaterialID(4), (global_x+1)*scale, 0*scale, -1*scale)
create_static(sg, MeshID(0), MaterialID(4), -1*scale, 0*scale, (global_z+1)*scale)
create_static(sg, MeshID(0), MaterialID(4), (global_x+1)*scale, 0*scale, (global_z+1)*scale)
create_static(sg, MeshID(0), MaterialID(4), -1*scale, (global_y+1)*scale, -1*scale)
create_static(sg, MeshID(0), MaterialID(4), (global_x+1)*scale, (global_y+1)*scale, -1*scale)
create_static(sg, MeshID(0), MaterialID(4), -1*scale, (global_y+1)*scale, (global_z+1)*scale)
create_static(sg, MeshID(0), MaterialID(4), (global_x+1)*scale, (global_y+1)*scale, (global_z+1)*scale)
For u = 0 To 12
For i = 0 To 12
create_static(sg, MeshID(#mesh_baseblock), MaterialID(4), (-1+i)*scale, (0)*scale, (-1+u)*scale)
; create_static(sg, MeshID(#mesh_baseblock), MaterialID(4), (global_x+1+i)*scale, (global_y+1)*scale, -1*scale)
; create_static(sg, MeshID(#mesh_baseblock), MaterialID(4), (-1+i)*scale, (global_y+1)*scale, (global_z+1)*scale)
; create_static(sg, MeshID(#mesh_baseblock), MaterialID(4), (global_x+1+i)*scale, (global_y+1)*scale, (global_z+1)*scale)
cnt+1
Next
Next
For t = 0 To 60-40
For u = 0 To 12
For i = 0 To 12
create_static(sg, MeshID(#mesh_baseblock), MaterialID(4), (-22+i)*scale, (t)*scale/8, (-12+u)*scale)
; create_static(sg, MeshID(#mesh_baseblock), MaterialID(4), (global_x+1+i)*scale, (global_y+1)*scale, -1*scale)
; create_static(sg, MeshID(#mesh_baseblock), MaterialID(4), (-1+i)*scale, (global_y+1)*scale, (global_z+1)*scale)
; create_static(sg, MeshID(#mesh_baseblock), MaterialID(4), (global_x+1+i)*scale, (global_y+1)*scale, (global_z+1)*scale)
cnt+1
Next
Next
Next
Debug cnt
; ProcedureReturn sg
ProcedureReturn sg
EndProcedure
Procedure game_start()
Define.i ground, t, i
;- config
game\state_base_lamp=1
;game\state_base_lamp=3
game\sg=StaticGeometry()
Debug game\sg
BuildStaticGeometry(game\sg)
Debug "SG==="
PosMain_x = 0*scale
PosMain_y = 5*scale
PosMain_z = 0*scale
MoveEntity(main_Entity\EntityBody, PosMain_x, PosMain_y, PosMain_z, #PB_Absolute)
SoundListenerLocate(PosMain_x, PosMain_y, PosMain_z)
MoveNode(main_Entity\MainNode, PosMain_x, PosMain_y - main_Entity\BodyOffsetY, PosMain_z, #PB_Absolute)
Debug main_Entity\EntityBody
Debug EntityX(main_Entity\EntityBody)
Debug EntityY(main_Entity\EntityBody)
Debug EntityZ(main_Entity\EntityBody)
main_Entity\rot_x = Rot_x
main_Entity\rot_y = Rot_y
main_Entity\rot_z = Rot_z
RotateEntity(main_Entity\EntityBody, 0, main_Entity\Rot_y, 0, #PB_Absolute)
RotateNode(main_Entity\CameraNode, main_Entity\Rot_x, 0, 0, #PB_Absolute)
RotateNode(main_Entity\HandNode, main_Entity\Rot_x, 0, 0, #PB_Absolute)
RotateNode(main_Entity\MainNode, 0, EntityYaw(main_Entity\EntityBody), 0)
EndProcedure
;- -----------------------------------------------------------------------
global_x.l = 12;256-200
global_y.l = 3;32-10
global_z.l = 12;256-200
flash_on = 1
prefix$ = "main_0"
EnableExplicit
;- START
Define.f KeyX, KeyY, MouseX, MouseY
Define nx.f, nz.f, Boost.f = 2.2, Yaw.f, Pitch.f, zaehler
Define.i ground, t, i
Define.b firster = #True
Define Mesh_plane, ent_plane, Mesh_robot, ent_robot, light1, Light.l
Mesh_plane=CreatePlane(#PB_Any, global_x*scale*2, global_z*scale*2, scale, scale, 20, 20)
ground = GetScriptMaterial(#PB_Any, "Scene/GroundBlend")
;TransformMesh(Mesh_plane, 256*10, -10, 256*10, 1, 1, 1, 0, 0, 0)
ent_plane=CreateEntity(#PB_Any, MeshID(Mesh_plane), MaterialID(ground), 0, -1.5, 0)
EntityRenderMode(ent_plane, 0)
CreateEntityBody(ent_plane, #PB_Entity_StaticBody)
;- GAME
;WorldShadows(#PB_Shadow_Modulative, #PB_Default, RGB(205, 205, 205), 128)
AmbientColor(RGB(22, 14, 35))
Fog(RGB(126, 58, 1), 2048+5, 1*scale, 28*scale)
; WorldDebug(#PB_World_DebugBody)
; WorldDebug(#PB_World_DebugEntity)
EnableWorldCollisions(1)
EnableWorldPhysics(1)
WorldGravity(-90.806)
AntialiasingMode(#PB_AntialiasingMode_x6)
light2 = CreateLight(#PB_Any ,RGB(255*0.4, 255*0.4,255*0.4), (1*scale), (1*scale), (1*scale), #PB_Light_Spot)
SetLightColor(light2, #PB_Light_SpecularColor, RGB(128, 50, 50))
LightAttenuation(light2, 8050, 0.9)
SpotLightRange(light2, 1, 60, 1)
Global lamp_y = -35
Global lamp_x = 15
Global lamp_z = 0
Global lamp_i = 0
Global lamp_o = 70
Global lamp_f.f = 1
Define onflore = 15
CreateEntity(0, MeshID(0), #PB_Material_None, 5*scale-100+30, 3*scale+50, 5*scale-100)
SetEntityAttribute(0,#PB_Entity_LinearSleeping,0)
SetEntityAttribute(0,#PB_Entity_AngularSleeping, 0.0)
ScaleEntity(0, 0.8, 0.8, 0.8)
HideEntity(0, 1)
;- Gun
CreateEntity(1, MeshID(1), MaterialID(6))
ScaleEntity(1, 0.05, 0.05, 0.05)
RotateEntity(1, 90, -85, 0)
;- Body
CreateEntityBody(0, #PB_Entity_CapsuleBody, 60.00, 0.0001, 1)
; EntityAngularFactor(0, 0, 0, 0)
;-Billboard
CreateBillboardGroup(0, MaterialID(1), 0.05, 0.05, 0, 0, 13)
AddBillboard(0, 0, 0, 0)
With main_Entity
\Fov = 70
\rot_x = 0
\rot_y = 0
\rot_z = 0
\EntityBody = 0
\BodyOffsetY = 15
If #cam_type = 2
\Key\Down = #PB_Key_S ;Down
\Key\Left = #PB_Key_A ;Left
\Key\Right = #PB_Key_D;Right
\Key\Up = #PB_Key_W;Up
\Key\Jump = #PB_Key_Space
ElseIf #cam_type = 1
\Key\Down = #PB_Key_Down
\Key\Left = #PB_Key_Left
\Key\Right = #PB_Key_Right
\Key\Up = #PB_Key_Up
\Key\Jump = #PB_Key_Space
EndIf
\MainNode = CreateNode(#PB_Any) ; Entity position
\ForwardNode= CreateNode(#PB_Any, 0, 0, -3) ; Direction normalized
\StrafeNode = CreateNode(#PB_Any, -1, 0, 0) ; Direction normalized
\LampNode = CreateNode(#PB_Any, 0, 50, 10) ;
; \LampNode = CreateNode(#PB_Any, 0, 50, 10) ;
\HandNode = CreateNode(#PB_Any, 6, 43, -8) ; Hand position
\CameraNode = CreateNode(#PB_Any, 0, 50, -10) ; Camera position 40
\HideMenu = 1
AttachNodeObject(\MainNode , NodeID(\CameraNode))
AttachNodeObject(\MainNode , NodeID(\HandNode))
AttachNodeObject(\MainNode , NodeID(\ForwardNode))
AttachNodeObject(\MainNode , NodeID(\StrafeNode))
AttachNodeObject(\MainNode , NodeID(\LampNode))
AttachNodeObject(\HandNode , EntityID(1))
AttachNodeObject(\CameraNode, BillboardGroupID(0))
RotateNode(\HandNode, 5, 0, 0, #PB_Relative)
MoveBillboardGroup(0, 0, 0, -15)
MoveEntity(1, 0.1, -0.1, 0.01)
; RotateEntity(\EntityBody, 0, 90, 0, #PB_Absolute)
EndWith
;- Camera float
If #cam_type = 1
;-Camera
CreateCamera(#kam_0, 0, 0, 100, 100, 2)
; MoveCamera(#kam_0, -50, 50, -50, #PB_Absolute)
MoveCamera(#kam_0, 0*scale, 5*scale, 5*scale, #PB_Absolute)
CameraLookAt(#kam_0, 20*scale, 0, 20*scale)
CameraBackColor(#kam_0, RGB(0 , 0, 0))
CameraRange(#kam_0, 0, camR*1000)
EndIf
;- Camera main
If #cam_type = 2
CreateCamera(0, 0, 0, 100, 100)
CameraRange(0, 0.08, 2000)
; RotateCamera(0, 0, 0, 0)
AttachNodeObject(main_Entity\CameraNode, CameraID(0))
CameraLookAt(0, NodeX(main_Entity\ForwardNode) * 100, NodeY(main_Entity\CameraNode), NodeZ(main_Entity\ForwardNode) * 100)
EndIf
Define set_empty
Define Input$, Event
Define.i Quit
Define close_gui, Gadget, click_els, els, move
;- GAME START
game_start()
Repeat
; Debug "--------------------------------------------"
Debug "Tris: " + Engine3DStatus(#PB_Engine3D_NbRenderedTriangles)
Debug "Batches: " + Engine3DStatus(#PB_Engine3D_NbRenderedBatches)
Debug "FPS: " + Engine3DStatus(#PB_Engine3D_CurrentFPS)
; Debug "Min FPS: " + Engine3DStatus(#PB_Engine3D_MinimumFPS)
;
If #window=1
Repeat
Until WindowEvent() = 0
EndIf
If GUI=0
HandleEntity(@main_Entity)
EndIf
Define.f TimeSinceLastFrame
TimeSinceLastFrame = RenderWorld()
main_Entity\elapsedTime = TimeSinceLastFrame
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
Procedure OnGround(*Entity.s_Entity)
Protected nx, nz, ny
Protected ent, ent1, ent2, ent3, ent4
nx=NodeX(*Entity\MainNode)
ny=NodeY(*Entity\MainNode)
nz=NodeZ(*Entity\MainNode)
; Debug nx
;Debug *Entity\BodyOffsetY
; ProcedureReturn RayCollide(nx, ny-*Entity\BodyOffsetY, nz, nx+10, ny-*Entity\BodyOffsetY-10, nz)
ent=RayCollide(nx, ny-*Entity\BodyOffsetY, nz, nx, ny-*Entity\BodyOffsetY-15, nz)
; CreateLine3D(#PB_Any, nx, ny-*Entity\BodyOffsetY, nz, $FFFF, nx, ny-*Entity\BodyOffsetY-15, nz, $FFFF)
If ent=-1
ent1=RayCollide(nx-2, ny-*Entity\BodyOffsetY, nz-2, nx+10, ny-*Entity\BodyOffsetY-10, nz+10)
; CreateLine3D(#PB_Any, nx-2, ny-*Entity\BodyOffsetY, nz-2, $FFFF, nx+10, ny-*Entity\BodyOffsetY-10, nz+10, $FFFF)
If ent1=-1
ent2=RayCollide(nx-2, ny-*Entity\BodyOffsetY, nz+2, nx+10, ny-*Entity\BodyOffsetY-10, nz-10)
; CreateLine3D(#PB_Any, nx-2, ny-*Entity\BodyOffsetY, nz+2, $FFFF, nx+10, ny-*Entity\BodyOffsetY-10, nz-10, $FFFF)
If ent2=-1
ent3=RayCollide(nx+2, ny-*Entity\BodyOffsetY, nz-2, nx-10, ny-*Entity\BodyOffsetY-10, nz+10)
; CreateLine3D(#PB_Any, nx+2, ny-*Entity\BodyOffsetY, nz-2, $FFFF, nx-10, ny-*Entity\BodyOffsetY-10, nz+10, $FFFF)
If ent3=-1
ent4=RayCollide(nx+2, ny-*Entity\BodyOffsetY, nz+2, nx-10, ny-*Entity\BodyOffsetY-10, nz-10)
; CreateLine3D(#PB_Any, nx+2, ny-*Entity\BodyOffsetY, nz+2, $FFFF, nx-10, ny-*Entity\BodyOffsetY-10, nz-10, $FFFF)
EndIf
EndIf
EndIf
EndIf
If ent
ProcedureReturn ent
ElseIf ent1
ProcedureReturn ent1
ElseIf ent2
ProcedureReturn ent2
ElseIf ent3
ProcedureReturn ent3
ElseIf ent4
ProcedureReturn ent4
EndIf
EndProcedure
Procedure OnWall(*Entity.s_Entity, fx, fz)
Protected ent1, ent2, grp1, grp2, ent3, ent4, grp3, grp4, x, z, nx, nz, ny
If IsNode(*Entity\MainNode)
nx=NodeX(*Entity\MainNode)
ny=NodeY(*Entity\MainNode)
nz=NodeZ(*Entity\MainNode)
x=nx+10*fx
z=nz+10*fz
; CreateLine3D(#PB_Any, NodeX(*Entity\MainNode)+3, NodeY(*Entity\MainNode)+38, nz, $FFFF, NodeX(*Entity\MainNode)-3, NodeY(*Entity\MainNode)+38, nz, $FFFF)
; CreateLine3D(#PB_Any, NodeX(*Entity\MainNode), NodeY(*Entity\MainNode)+38, nz+3, $FFFF, NodeX(*Entity\MainNode), NodeY(*Entity\MainNode)+38, nz-3, $FFFF)
CreateLine3D(#PB_Any, nx, ny+38, nz, $FFFF, x, ny+38, z, $FFFF)
ent1=RayCollide(nx+3, ny+38, nz, nx-3, ny+38, nz)
; Debug ent1
ent2=RayCollide(nx, ny+38, nz+3, nx, ny+38, nz-3)
; Debug ent2
ent3=RayCollide(nx-3, ny+38, nz, nx+3, ny+38, nz)
; Debug ent3
ent4=RayCollide(nx, ny+38, nz-3, nx, ny+38, nz+3)
; Debug ent4
If ent1 And IsEntity(ent1)
grp1=GetEntityCollisionGroup(ent1)
EndIf
If ent2 And IsEntity(ent2)
grp2=GetEntityCollisionGroup(ent2)
EndIf
If ent3 And IsEntity(ent3)
grp3=GetEntityCollisionGroup(ent3)
EndIf
If ent4 And IsEntity(ent4)
grp4=GetEntityCollisionGroup(ent4)
EndIf
; Debug grp1
; Debug grp2
; Debug grp3
; Debug grp4
If grp1=5
ProcedureReturn ent1
ElseIf grp2=5
ProcedureReturn ent2
ElseIf grp3=5
ProcedureReturn ent3
ElseIf grp4=5
ProcedureReturn ent4
EndIf
EndIf
; ProcedureReturn
EndProcedure
Global jcnt=0
Procedure HandleEntity(*Entity.s_Entity)
Protected.Vector3 Forward, Strafe, PosMain, PosDir, PosStrafe, PosLamp
Protected.f Speed.f, Speed2.f
Protected x, y, bx, by, bz, Ground
Protected.f MouseX, MouseY
Static Jump.f, Speedjmp.f, MemJump.i, Rot.Vector3, Trans.Vector3, Clic
Protected room.Vector3, PosEnt.Vector3
Protected PlayerSpeed, PlayerSpeedS, OnWall
Protected nx, ny, nz, ent, stor
With *Entity
GetNodePosition(PosMain, \MainNode)
GetNodePosition(PosDir, \ForwardNode)
GetNodePosition(PosStrafe, \StrafeNode)
GetNodePosition(PosLamp, \LampNode)
SubVector3(Forward, PosDir, PosMain)
SubVector3(Strafe, PosStrafe, PosMain)
; Debug PosMain\x
bx=Round(PosMain\x / scale, #PB_Round_Up)
by=Round(PosMain\y / scale, #PB_Round_Up)-1
bz=Round(PosMain\z / scale, #PB_Round_Up)
;*TimeSinceLastFrame*#PlayerSpeed
;\elapsedTime = 2.6
Speed = 260 * 2.3 ;* \elapsedTime;#PlayerSpeed * \elapsedTime
Speed2 = Speed * 0.8;back
Speedjmp = Speed * 0.8
If ExamineMouse()
MouseX = -(MouseDeltaX()/3000) * \Fov * 5.8;\elapsedTime
MouseY = -(MouseDeltaY()/3000) * \Fov * 5.8;\elapsedTime
\rot_y + MouseX
\rot_x + MouseY
\rot_z = 0
; Debug NodePitch(\CameraNode)
; Debug NodeRoll(\CameraNode)
; If NodePitch(\CameraNode) < 80 And MouseY > 0
; Rot\x + MouseY
; ElseIf NodePitch(\CameraNode) > -80 And MouseY < 0
; Rot\x + MouseY
; EndIf
EndIf
If ExamineKeyboard()
Ground=OnGround(*Entity)
If KeyboardPushed(#PB_Key_LeftShift)
Speed = Speed * 2.5
EndIf
If KeyboardPushed(\Key\Jump); And OnGround(*Entity)>-1 ;KeyboardReleased
If Ground>-1; Or OnWall(*Entity, Forward\x, Forward\z) ; And MemJump=0
Jump = Speedjmp ;* \elapsedTime
MemJump = 1
EndIf
EndIf
If Ground>-1 And MemJump = 0
Jump = 0
jcnt = 0
;Debug "jcnt = 0"
Else
If MemJump
Jump + 140;Speedjmp
If Jump > 1160
MemJump = 0
Jump = 1160
EndIf
;Debug "Jump + "
Else
;Debug "Jump - "
If Jump > -350
Jump - 320; * \elapsedTime
If Jump < -350
Jump - 350
EndIf
EndIf
EndIf
EndIf
;Debug Jump
; If Jump > -800
; jcnt + 1
; Jump - (20 * jcnt); * \elapsedTime
; EndIf
Trans\x = 0; * 0.80
Trans\y = Jump
Trans\z = 0;* 0.80
If KeyboardPushed(\Key\Up)
Trans\x = Forward\x * Speed
Trans\z = Forward\z * Speed
ElseIf KeyboardPushed(\Key\Down)
Trans\x = Forward\x * -Speed2
Trans\z = Forward\z * -Speed2
EndIf
If KeyboardPushed(\Key\Left)
Trans\x = Strafe\x * Speed
Trans\z = Strafe\z * Speed
ElseIf KeyboardPushed(\Key\Right)
Trans\x = Strafe\x * -Speed
Trans\z = Strafe\z * -Speed
EndIf
; DisableEntityBody(\EntityBody, #False) ; Wake up entity (BugWare)
EntityVelocity(\EntityBody,Trans\x,Trans\y,Trans\z)
;MoveEntity(\EntityBody, Trans\x, Trans\y, Trans\z)
If \hidelamp=0
If game\flashlight Or flash_on
;MoveLight(Light2, PosLamp\x+lamp_x, PosLamp\y+lamp_y, PosLamp\z+lamp_z, #PB_Absolute)
; CreateLine3D(#PB_Any, PosLamp\x, PosLamp\y+40, PosLamp\z, $FFFF, PosLamp\x, PosLamp\y+41, PosLamp\z, $FFFF)
If #cam_type = 2
LightAttenuation(light2, 8050, 1)
SpotLightRange(light2, 0, lamp_o, 1)
;
; LightAttenuation(light2, 1550, 1)
; SpotLightRange(light2, 1, 360, 1)
LightDirection(Light2, CameraDirectionX(0), CameraDirectionY(0), CameraDirectionZ(0))
EndIf
Else
\hidelamp=1
HideLight(Light2, \hidelamp)
EndIf
EndIf
If KeyboardReleased(#PB_Key_Back)
If \hidemenu=0
\hidemenu=1
Else
\hidemenu=0
EndIf
EndIf
If KeyboardReleased(#PB_Key_L)
If \hidelamp=0
\hidelamp=1
Else
\hidelamp=0
EndIf
HideLight(Light2, \hidelamp)
EndIf
EndIf
If #cam_type = 2
CameraFOV(0, \Fov)
EndIf
RotateEntity(\EntityBody, 0, \Rot_y, 0, #PB_Absolute)
RotateNode(\CameraNode, \Rot_x, 0, 0, #PB_Absolute)
RotateNode(\HandNode, \Rot_x, 0, 0, #PB_Absolute)
SoundListenerLocate(EntityX(\EntityBody), EntityY(\EntityBody) - \BodyOffsetY, EntityZ(\EntityBody))
MoveNode(\MainNode, EntityX(\EntityBody), EntityY(\EntityBody) - \BodyOffsetY, EntityZ(\EntityBody), #PB_Absolute)
RotateNode(\MainNode, 0, EntityYaw(\EntityBody), 0)
If game\flashlight Or flash_on
MoveLight(Light2, PosLamp\x+0, PosLamp\y+0, PosLamp\z+0, #PB_Absolute)
EndIf
If \HideMenu
EndIf
; NodeFixedYawAxis(\MainNode, #True, 0.2, 0, 0.2)
; Debug EntityYaw(\EntityBody)
; Debug EntityPitch(\EntityBody)
; Debug CameraYaw(\CameraNode)
EndWith
EndProcedure