[bb] Object Movement Relative to Camera by xmlspy [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:43

Previous topic - Next topic

BlitzBot

Title : Object Movement Relative to Camera
Author : xmlspy
Posted : 1+ years ago

Description : The code shows movement of an object relative to the camera's position using RotateEntity.

Forward is forward as you look at it.


Code :
Code: blitzbasic
;April 22, 2006
Gosub setup

;Main Loop
Repeat
	Gosub GetMKeys
	Gosub MoveCube
	
	TurnEntity cam_pivot, 0, .1, 0
	
	If KeyHit(57) Then
		If relative = 1 Then relative = 0 Else relative = 1
	EndIf
	
	RenderWorld()
	Text 0, 0, "AWSD, Right Mouse, Spacebar"
	Text 0, 20, "Relative: " + relative
	Flip
	Gosub FlushMKeys
Until KeyHit(1)
End

.setup
	Graphics3D 640, 480, 0, 2
	AppTitle "Object Movement Relative to Camera"
	cam_pivot = CreatePivot()
	cam = CreateCamera(cam_pivot)
	MoveEntity cam, 0, 20, -20
	
	cube = CreateCube()
	MoveEntity cube, 0, 0, 0
	
	p = CreatePlane()
	Gosub maketexture
	MoveEntity p, 0, -1, 0
	
	center = CreatePivot()
	PointEntity cam,cube
	
	nc = CreateCube()
	EntityColor nc, 0, 0, 255
	MoveEntity nc, 0, 0, 20
	sc = CreateCube()
	EntityColor sc, 0, 255, 0
	MoveEntity sc, 0, 0, -20
	relative = 1
Return

.maketexture
	Tex=CreateTexture( 256,256 )  : SetBuffer TextureBuffer( Tex ) 
	Color 255, 0, 0 : Rect 0, 0, 256, 256
	Color 0, 255, 0 : Rect 0, 0, 256, 256, 0
	ScaleTexture Tex, 128,128 : EntityTexture p,Tex
	SetBuffer BackBuffer() : Color 255, 255, 255
Return

.GetMKeys
	MOVELEFT = KeyDown(203) Or KeyDown(30)
	MOVERIGHT = KeyDown(205) Or KeyDown(32)
	MOVEUP = KeyDown(200) Or KeyDown(17)
	MOVEDOWN = KeyDown(208) Or KeyDown(31)
Return

.FlushMKeys
	MOVELEFT = 0 : MOVERIGHT = 0
	MOVEUP = 0 : MOVEDOWN = 0
	If EntityDistance(cube,center) > 40 PositionEntity cube, 0, 0, 0
Return 

.MoveCube
	If MOVELEFT a=90
	If MOVERIGHT a=-90
	If MOVEUP a=0
	If MOVEDOWN a=180
	
	If MOVELEFT And MOVEUP Then
		a=45
	ElseIf MOVELEFT And MOVEDOWN
		a=135
	EndIf
	
	If MOVERIGHT And MOVEUP Then
		a=-45
	ElseIf MOVERIGHT And MOVEDOWN
		a=-135
	EndIf
	
	;Here is the trick of the whole movement of object relative to camera
	;it is actually not with camera, but it's pivot
	If relative
		RotateEntity cube, 0, a + EntityYaw(cam_pivot), 0
	Else
		RotateEntity cube, 0, a, 0
	EndIf
	If MOVELEFT Or MOVERIGHT Or MOVEUP Or MOVEDOWN Then
		MoveEntity cube, 0, 0, 1
	EndIf
Return


Comments : none...