works for me...
;set up variables
Const c_player=1,c_level=2
Global player_radius# = 0.2
Global player_height# = 0.4
Global player_step# = 1
gravity#=0
vx#=0
vy#=0
vz#=0
;create display
HidePointer
Graphics3D 640,480,16,2
camera=CreateCamera()
CameraRange camera,0.1,1000
;load files
level=LoadAnimMesh("temp.b3d")
playerpivot=CreatePivot();Sphere():EntityColor playerpivot,255,0,0:EntityAlpha playerpivot,0.25:EntityFX playerpivot,1
;set up scene
light=CreateLight(1)
TurnEntity light,45,0,0
LightColor light,128,128,128
light=CreateLight(1)
TurnEntity light,-45,180,0
LightColor light,64,64,128
;position player
PositionEntity playerpivot,0,50,0
ScaleEntity playerpivot,player_radius,player_height,player_radius
;set up collisions
EntityType playerpivot,c_player
EntityRadius playerpivot,player_radius,player_height
EntityType level,c_level,1
EntityPickMode level,2
For i=1 To CountChildren(level)
EntityPickMode GetChild(level,i),2
Next
Collisions c_player,c_level,2,2
AmbientLight 80,80,80
;set up chase cam
PositionEntity camera,EntityX(playerpivot),EntityY(playerpivot),EntityZ(playerpivot)
PointEntity camera,playerpivot
MoveEntity camera,0,player_height,0
EntityParent camera,playerpivot
While Not KeyHit(1)
UpdateWorld
RenderWorld
Gosub physics
MoveMouse 320,240
Flip
Wend
End
.physics:
;physics
vxspd# = 0.025
vyspd# = 0.05
vzspd# = 0.025
inertia# = 0.8
gravity# = -1
mousedampx#=0.15
mousedampy#=0.12
;input
impulseforward = KeyDown(17)
impulseback = KeyDown(31)
impulseleft = KeyDown(30)
impulseright = KeyDown(32)
mxspd#=-MouseXSpeed()*mousedampx
myspd#=MouseYSpeed()*mousedampy
TurnEntity camera,myspd,0,0
;impulse
If impulseforward vz#=vz+vzspd
If impulseback vz=vz-vzspd
If impulseleft vx#=vx-vxspd
If impulseright vx=vx+vxspd
;inertia and gravity
vx=vx*inertia
vy=vy/2
vz=vz*inertia
TurnEntity playerpivot,0,mxspd,0
MoveEntity playerpivot,vx,vy,vz
;stairclimbing
oldx#=x#
oldy#=y#
oldz#=z#
x#=EntityX(playerpivot)
y#=EntityY(playerpivot)
z#=EntityZ(playerpivot)
pick=LinePick(x,y,z,0,-player_step,0,1)
If pick
slope# = 1.0-Abs(PickedNY()) *.025
If EntityY(playerpivot)<PickedY()+player_step
vy=vy+vyspd
EndIf
Else
vy=vy-vyspd
EndIf
TranslateEntity playerpivot,0,vy,0
Return
|