Weird issw with TurnEntity (Possibly Float issue)

Blitz3D Forums/Blitz3D Programming/Weird issw with TurnEntity (Possibly Float issue)

Dude, try it this way:
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