3d Mouse Control

Blitz3D Forums/Blitz3D Beginners Area/3d Mouse Control

Here is a idea I have bin thinking of for a while.
;This code by Matt Anthony aka. Riverratt 
;Graphics3D 640,480
Graphics3D 800,600

AutoMidHandle True
SetBuffer FrontBuffer()
grid_tex=CreateTexture( 32,32,8 )
ScaleTexture grid_tex,10,10
SetBuffer TextureBuffer( grid_tex )
Color 0,0,64:Rect 0,0,32,32
Color 0,0,255:Rect 0,0,32,32,False
SetBuffer BackBuffer()

plane=CreateTerrain(128)
EntityTexture plane,grid_tex
PositionEntity plane,-64,0,0  

light1=CreateLight()
PositionEntity light1,-15,15,-15
light2=CreateLight(3)
LightConeAngles light2,5,30
LightColor light2,255,100,100
PositionEntity light2,100,15,100
 

p_pivot=CreatePivot()
player=CreateCube(p_pivot)
EntityColor player,200,0,0
ScaleEntity player,1,.5,1
p_cam=CreateCamera(p_pivot)
PositionEntity player,0,.55,0
PositionEntity p_pivot,0,0,4
PositionEntity p_cam,0,4,-10
gun=CreateCylinder(16,1,player)
RotateEntity gun,90,0,0
PositionEntity gun,0,0,1
ScaleEntity gun,.5,1,.5

Type buttons
	Field x
	Field y
	Field length
	Field height
	Field image
	Field mesage$
	
End Type

Global rotate.buttons = New buttons
;use this code To relocate the rotation graph down Or change rotatex\rotatey anywhere you want
rotate\x = GraphicsWidth()/2
rotate\y = GraphicsHeight()/2+(GraphicsHeight()/3)
;rotate\x = GraphicsWidth()/2
;rotate\y = GraphicsHeight()/2
rotate\length = 130
rotate\height = 130 
rotate\image = CreateImage(rotate\length,rotate\height)
rotate\mesage$ = "Ship Rotation"
SetBuffer ImageBuffer(rotate\image)
	Color 100,100,255
	Oval 0,0,rotate\length,rotate\height,0
	;message$
	Text 0,0,rotate\mesage$ 
	

Global player_point=CreateImage(20,20)
SetBuffer ImageBuffer(player_point)
	
	Color 0,0,250
	Line 10,1,1,20
	
	Color 0,0,250
	Line 10,1,20,20
	
    Color 200,0,0
	Line 1,19,20,19

;pointrotation data____________________________________________________________________________________
Dim point(359); dimention the array to accomidate the rotations.
For loop=0 To 359
    point(loop)=CopyImage(player_point)
	MidHandle point(loop)
	RotateImage point(loop),loop
	DebugLog loop
Next


Global angle#

;make the imiges to be used for the mouse ,mouseimage is the triangle but just a dot for collision
mouseimage=CreateImage(20,20)
mousepoint=CreateImage(2,2)
makemouse(mouseimage,mousepoint)


speed#=0
mode=1
m=1

SetBuffer BackBuffer()

While Not KeyHit(1)
PointEntity light2,plane

p_angle#=-angle#

If KeyHit(2) mode=mode+1
If mode=4 Then 
	mode=1
	anglereset#=angle#-359
	RotateEntity p_pivot,0,angle#+anglereset#,0 
EndIf 
If mode=1 Then
	PositionEntity p_cam,0,4,-10
 	RotateEntity p_pivot,0,p_angle#,0
EndIf 

If mode=2 Then 
	RotateEntity player,0,p_angle#,0
	;RotateEntity p_pivot,0,p_angle#,0
EndIf

If mode=3 Then 
	PositionEntity p_cam,0,2,-.5
    ;RotateEntity player,0,p_angle#,0
	RotateEntity p_pivot,0,p_angle#,0
EndIf 

If MouseZSpeed()<>0 Then 
	speed#=(MouseZ()+MouseZSpeed())*.1
EndIf 

MoveEntity p_pivot,0,0,speed#

UpdateWorld()
RenderWorld()

drawhud(mouseimage,mousepoint)
If ImagesOverlap(mousepoint,MouseX(),MouseY(),rotate\image,rotate\x,rotate\y) Then 
	update_mouse()
EndIf

If KeyHit(57)=True  m=m+1
If m=2 Then m=0
If m=1 Then 
 	Color 255,0,110
	Text 10,10,"angle"+angle
	Text 10,30 ,speed#
	Text 10,50,mode
	Color 200,200,100
	Text 10,70,"Place the mouse inside the rotation image to rotate cam and player."
	Text 10,90,"Hit 1 to change rotation modes. "+"Use the mousewheel to move."
	Text 10,110,"Hit space to clear these mesages and gain fps."
EndIf 
Flip
Wend
End

Function drawhud(mouseimage,mousepoint)
	DrawImage rotate\image,rotate\x,rotate\y
	DrawImage mouseimage,MouseX(),MouseY()
	DrawImage mousepoint,MouseX(),MouseY()
	DrawImage point(angle),rotate\x,rotate\y
End Function

Function makemouse(mouseimage,mousepoint)
	SetBuffer ImageBuffer(mouseimage)
	Color 100,60,250
	Line 0,0,20,10
	Line 0,0,10,20
	Line 20,10,10,20
	
	SetBuffer ImageBuffer(mousepoint)
	Color 0,255,0
	Plot 0,0
	HandleImage mouseimage,0,0
	HandleImage mousepoint,0,0
End Function

Function update_mouse()
;This code is Thanks to Ross C 
;If MouseDown(2) Then
	angle=ATan2(rotate\y-MouseY(),rotate\x-MouseX()  ) ; the angle between 
	angle=angle-90 ; subtract 90 from the angle to compinsate for the blitz co-ord system
	If angle>359 Then ; check angle is within 0-359 range
		angle=angle-359 ; if not, wrap it round
	ElseIf angle<0 Then
		angle=angle+359
	End If
;EndIf

End Function