Dude, try it this way:
All it's doing is giving the player an orientation modifier, which is an order to rotate by so many degrees. Then what happens is that the orientation modifer is chipped away each frame/loop as the entity is rotated, until it gets back to zero and is ready to take another order. You shouldn't have too much trouble integrating it into your own code.
EDIT: Oh, here's a slightly extended version with movement in. You know how it is when you get tapping away :)
Const DIR_RIGHT% = 1 Const DIR_LEFT% = -1 Type TPlayer Field orientationModifier% Field geom% End Type Function TPlayer_Make.TPlayer(x_arg%, y_arg%, z_arg%) newTPlayer.TPlayer = New TPlayer newTPlayer\orientationModifier = 0 newTPlayer\geom = CreateCamera() PositionEntity newTPlayer\geom,x_arg, y_arg, z_arg Return newTPlayer End Function Function TPlayer_IsTurning%(player_arg.TPlayer) If player_arg\orientationModifier <> 0 Return True Return False End Function Function TPlayer_SetTurn(player_arg.TPlayer, direction_arg%) player_arg\orientationModifier = 90*direction_arg End Function Graphics3D 800,600,0,2 SetBuffer BackBuffer() light = CreateLight(): PositionEntity light,100,100,-100 currentPlayer.TPlayer = TPlayer_Make(0,0,0) For i% = 1 To 100 newScenePiece.TScenePiece = New TScenePiece newScenePiece\geom = CreateCube() While EntityDistance(currentPlayer\geom, newScenePiece\geom) < 6 PositionEntity newScenePiece\geom,Rand(-50,50),0,Rand(-50,50) Wend Next While Not KeyHit(1) If TPlayer_IsTurning(currentPlayer) = False If KeyHit(203) TPlayer_SetTurn(currentPlayer, DIR_LEFT) ElseIf KeyHit(205) TPlayer_SetTurn(currentPlayer, DIR_RIGHT) EndIf Else If currentPlayer\orientationModifier>0 RotateEntity currentPlayer\geom,0,Int(EntityYaw(currentPlayer\geom))+(DIR_LEFT*5),0 currentPlayer\orientationModifier = currentPlayer\orientationModifier-5 Else RotateEntity currentPlayer\geom,0,Int(EntityYaw(currentPlayer\geom))+(DIR_RIGHT*5),0 currentPlayer\orientationModifier = currentPlayer\orientationModifier+5 EndIf EndIf RenderWorld Text 10,10,EntityYaw(currentPlayer\geom) Flip Wend Type TScenePiece Field geom% End Type
All it's doing is giving the player an orientation modifier, which is an order to rotate by so many degrees. Then what happens is that the orientation modifer is chipped away each frame/loop as the entity is rotated, until it gets back to zero and is ready to take another order. You shouldn't have too much trouble integrating it into your own code.
EDIT: Oh, here's a slightly extended version with movement in. You know how it is when you get tapping away :)
Const DIR_RIGHT% = 1 Const DIR_LEFT% = -1 Const DIR_FORWARDS% = 1 Const DIR_BACKWARDS% = -1 Type TPlayer Field orientationModifier% Field movementModifier% Field geom% End Type Function TPlayer_Make.TPlayer(x_arg%, y_arg%, z_arg%) newTPlayer.TPlayer = New TPlayer newTPlayer\orientationModifier = 0 newTPlayer\movementModifier = 0 newTPlayer\geom = CreateCamera() CameraRange newTPlayer\geom,.1,100 CameraFogMode newTPlayer\geom,1 CameraFogRange newTPlayer\geom,1,50 PositionEntity newTPlayer\geom,x_arg, y_arg, z_arg EntityRadius newTPlayer\geom,0.99 EntityType newTPlayer\geom,1 Return newTPlayer End Function Function TPlayer_GetMutuallyExclusiveCommand(player_arg.TPlayer) If KeyDown(203) player_arg\orientationModifier = DIR_LEFT*90 Return ElseIf KeyDown(205) player_arg\orientationModifier = DIR_RIGHT*90 Return ElseIf KeyDown(200) player_arg\movementModifier = DIR_FORWARDS*10 Return ElseIf KeyDown(208) player_arg\movementModifier = DIR_BACKWARDS*10 EndIf End Function Function TPlayer_IsTurning%(player_arg.TPlayer) If player_arg\orientationModifier <> 0 Return True Return False End Function Function TPlayer_IsMoving%(player_arg.TPlayer) If player_arg\movementModifier <> 0 Return True Return False End Function Graphics3D 800,600,0,2 SetBuffer BackBuffer() light = CreateLight(): PositionEntity light,100,100,-100 currentPlayer.TPlayer = TPlayer_Make(0,0,0) For i% = 1 To 100 newScenePiece.TScenePiece = New TScenePiece newScenePiece\geom = CreateCube() EntityType newScenePiece\geom,2 While EntityDistance(currentPlayer\geom, newScenePiece\geom) < 6 PositionEntity newScenePiece\geom,Rand(-25,25)*2,0,Rand(-25,25)*2 Wend Next Collisions 1,2,2,1 While Not KeyHit(1) If TPlayer_IsTurning(currentPlayer) = False If TPlayer_IsMoving(currentPlayer) = False PositionEntity currentPlayer\geom,Int(EntityX(currentPlayer\geom)),0,Int(EntityZ(currentPlayer\geom)) TPlayer_GetMutuallyExclusiveCommand(currentPlayer) Else If currentPlayer\movementModifier>0 MoveEntity currentPlayer\geom,0,0,Float(DIR_FORWARDS)*.2 currentPlayer\movementModifier = currentPlayer\movementModifier-1 Else MoveEntity currentPlayer\geom,0,0,Float(DIR_BACKWARDS)*.2 currentPlayer\movementModifier = currentPlayer\movementModifier+1 EndIf EndIf Else If currentPlayer\orientationModifier>0 RotateEntity currentPlayer\geom,0,Int(EntityYaw(currentPlayer\geom))+(DIR_LEFT*5),0 currentPlayer\orientationModifier = currentPlayer\orientationModifier-5 Else RotateEntity currentPlayer\geom,0,Int(EntityYaw(currentPlayer\geom))+(DIR_RIGHT*5),0 currentPlayer\orientationModifier = currentPlayer\orientationModifier+5 EndIf EndIf UpdateWorld RenderWorld Color 90,90,220 Text 10,10,"Yaw: "+EntityYaw(currentPlayer\geom) Text 10,30," X: "+EntityX(currentPlayer\geom) Text 10,42," Y: "+EntityY(currentPlayer\geom) Text 10,54," Z: "+EntityZ(currentPlayer\geom) Color 255,255,255 Flip Wend Type TScenePiece Field geom% End Type