Heres the full sorce code:
; A simple walk about with Grimly the DWARF Type playerData Field pmeshname$ Field pmesh ; entity handle for this mesh Field Pname$ Field x# Field y# Field z# Field yaw# Field pitch# Field roll# Field speedx# Field speedy# Field speedz# Field HP# Field dam# Field inventory[10] End Type ; animation control codes Const walk = 1 Const run = 2 Const jump = 3 Const jumpat = 4 Const crouch = 5 Const battleidle = 6 Const battleidle1 = 7 Const attack = 8 Const jumpattack = 9 Const attack360 = 10 Const attack2swipe = 11 Const attackstab = 12 Const block = 13 Const fallforward = 14 Const fallbackward = 15 Const yes = 16 Const no = 17 Const idle = 18 Const idle1 = 19 ; default ;resolution Const ScreenWidth = 1024 Const ScreenHeight = 768 ;initialize player Global p.playerdata = New playerData Global camera,cam_pitch#,cam_yaw# ; load up starting data p\x# = 0.0 p\y# = 0.0 p\z# = 0.0 p\yaw# = 0.0 p\pitch# = 0.0 p\roll# = 0.0 p\HP = 100.0 p\dam# = 0.0 ; give the mesh name p\pmeshname$ = "models\dwarf1.b3d" ; init a 3d mode Graphics3D ScreenWidth, ScreenHeight, 32, 1 MoveMouse 400,200 ; position mouse near center ;make a pivot for the camera pivot = CreatePivot() PositionEntity pivot, p\x,p\y+1.5,p\z ;make camera camera = CreateCamera( pivot ) CameraClsColor camera,100,100,100 PositionEntity camera,p\x,p\y+70,p\z-100 ;setup lights AmbientLight 190,190,190 Light2=CreateLight() LightColor light2,120,120,220 RotateEntity light2, 0,90,0 PositionEntity light2, 40,20,0 light3=CreateLight() LightColor light3,120,120,130 RotateEntity light3,0,0,0 PositionEntity light3, -400,20,0 ; load terrain, mesh and animations ter = LoadTerrain("terrain/ter1.bmp") TerrainDetail ter,4000,True ScaleMesh ter,100,0,100 PositionEntity ter,-50,0,-50 p\pmesh = LoadAnimMesh(p\pmeshname$, pivot) ;make a ground plane = CreatePlane() PositionEntity plane, 0, 0.1, 0 EntityAlpha plane, .5 mirror=CreateMirror ; make a box for a referance point boxmesh = CreateMesh () boxmesh = CreateCube() ScaleMesh boxmesh, 10,50,50 PositionEntity boxmesh, 5, 0, 200 ;extract all sequances AnimControl() ;Main Loop starts here: Not no FPS control timer, yet. While Not KeyHit(1) ; ; If the current animation has stopped, loop the idle animation. ; If Not Animating( p\pmesh ) Then new_seq = idle1 seq = new_seq Animate p\pmesh, 1, 0.2, seq, 0.8 End If ; clear turn flag p\yaw# = 0 p\z# = 0 ; ; Test keys. ; moving=False If KeyDown( 203 ) Then p\yaw#=+1 If seq <> jump Then new_seq = idle End If moving=True EndIf If KeyDown( 205 ) Then p\yaw#=-1 If seq <> jump Then new_seq = idle End If moving=True EndIf If KeyDown( 208 ) Then p\z#=-0.4 If seq <> jump Then new_seq = walk End If moving=True EndIf If KeyDown( 200 ) Then p\z#=+0.4 If seq <> jump Then new_seq = walk End If moving=True EndIf If KeyDown( 57 ) Then If seq <> jump Then new_seq = jump End If moving=True EndIf ; ; If the player is not moving, switch back to ; the idle animation... ; If Not moving Then If seq <> jump Then new_seq=idle1 End If End If ; ; Start playing a new animation sequence? ; If seq <> new_seq Then seq = new_seq Animate p\pmesh, 3, 0.4, seq, 0.8 End If ;Animate p\pmesh,1,.2,seq ScaleEntity p\pmesh, .02, .02, .02 TurnEntity pivot, p\pitch#, p\yaw#, p\roll# PointEntity camera, p\pmesh MoveEntity pivot, p\x#,p\y#,p\z# PositionEntity boxmesh, 5, 50, 200 mouselook() UpdateWorld RenderWorld Flip Wend End ; uses constants list above to select animation by ; name, much easier to use than just numbers. Function AnimControl() ExtractAnimSeq p\pmesh, 2, 14 ;walk ExtractAnimSeq p\pmesh, 16, 26 ;run ExtractAnimSeq p\pmesh, 28, 40 ;jump 1 ExtractAnimSeq p\pmesh, 42, 54 ;jump 2 - for user controlled jumps ExtractAnimSeq p\pmesh, 56, 74 ;crouch - 56-59=down, 60-69=crouch, 70-74=get up ExtractAnimSeq p\pmesh, 75, 88 ;battle idle 1 ExtractAnimSeq p\pmesh, 90, 110 ;battle idle 1 ExtractAnimSeq p\pmesh, 112, 126 ;Attack 1 - swing ExtractAnimSeq p\pmesh, 128, 142 ;Attack 2 - Jump and overhead whack ExtractAnimSeq p\pmesh, 144, 160 ;Attack 3 - 360 backhand ExtractAnimSeq p\pmesh, 162, 180 ;Attack 4 - 2 Swipes ExtractAnimSeq p\pmesh, 182, 192 ;Attack 5 - Stab ExtractAnimSeq p\pmesh, 194, 210 ;Attack 6 - BLOCK ExtractAnimSeq p\pmesh, 212, 227 ;Die 1 - Forwards ExtractAnimSeq p\pmesh, 230, 251 ;Die 1 - Backwards ExtractAnimSeq p\pmesh, 253, 272 ;Nod YES ExtractAnimSeq p\pmesh, 274, 290 ;Shake head NO ExtractAnimSeq p\pmesh, 292, 325 ;Idle 1 ExtractAnimSeq p\pmesh, 327, 360 ;Idle 2 End Function Function MoveControl() End Function Function mouselook() ; Mouse look ; ---------- ; Mouse x and y speed mxs=MouseXSpeed() mys=MouseYSpeed() ; Mouse shake (total mouse movement) mouse_shake=Abs(((mxs+mys)/2)/1000.0) ; Destination camera angle x and y values dest_cam_yaw#=dest_cam_yaw#-mxs dest_cam_pitch#=dest_cam_pitch#+mys ; Current camera angle x and y values cam_yaw=cam_yaw+((dest_cam_yaw-cam_yaw)/5) cam_pitch=cam_pitch+((dest_cam_pitch-cam_pitch)/5) RotateEntity camera,cam_pitch#,cam_yaw#,0 ;RotateEntity camera,mxs,mys,0 ; Rest mouse position to centre of screen MoveMouse 400,300 ; Move camera using movement values MoveEntity camera,x#,y#,z# End Function