TPS camera with mouse and collision control

Blitz3D Forums/Blitz3D Beginners Area/TPS camera with mouse and collision control

Mike0101(Posted 2006) [#1]
Here is my code, I hope somebody modify for better



;*************
;by Mike0101
;I'm sure somebody makes better this weak code
;but this code works right
;*************
;System
Global screen_width% = 1024
Global screen_height% = 768
Global screen_halfwidth% = screen_width/2
Global screen_halfheight% = screen_height/2
Global camHeight#=4 ; default height of the camera behind the player
Global camDist#=-7 ; default distance of the camera behind the player
Global dest_xang#
Global dest_yang#

;CONST
Const C_PLAYER=1, C_LEVEL=2

AppTitle "TPS Camera"
HidePointer


;Screen
Graphics3D screen_width,screen_height,32,2
SetBuffer BackBuffer()

;Light
light=CreateLight()

;Plan
plan=CreatePlane()
EntityColor plan,255,0,0
EntityType plan, C_LEVEL

;OBJECT
cube1=CreateCube()
ScaleEntity cube1,10,10,10
PositionEntity cube1,13,0,13
EntityType cube1,C_LEVEL


;CAMERA
camera =CreateCamera()


;Player Pivot
plpivot=CreatePivot()
EntityType plpivot, C_PLAYER
EntityRadius plpivot,1.8,3
PositionEntity plpivot, 0, 1,0


;Player, now a cube but you can change for a nice model
Player=CreateCube(plpivot)
ScaleEntity player,1,3,1
EntityColor Player,255,0,255

;I'm using 2 pivots for camera controlling

;Pivot for the camera controlling
;One Front of the player,
FrontPivot=CreatePivot(plpivot)
PositionEntity Frontpivot,0,4,10

;One behind the player
;This pivot controlls the collisions and "finds" the right position of the camera behind player
Backpivot=CreatePivot(plpivot)
EntityRadius Backpivot,1
EntityType BackPivot, C_PLAYER


Collisions C_PLAYER, C_LEVEL ,2,2

While Not KeyHit(1)

UpdateCamera(plpivot,MouseXSpeed(),MouseYSpeed(), Frontpivot, Backpivot, Camera)

UpdateWorld
RenderWorld
; Crosshair :)
Text screen_halfwidth%, screen_halfheight%, "+"
Flip
Wend

End



Function updatecamera(ent,mxs#, mys#, pivot1, pivothatso, camera)
;ent : Player pivot
;mxs: MouseXmove
;mys: MouseYmove
;pivot1: pivot before player
;pivothatso: pivot front player
;Camera: ....What do you think:)
MoveMouse screen_halfwidth%, screen_halfheight%

; Limit of the "look up", "look down"
If dest_xang + mys > 120 Or dest_xang + mys < -45 Then ;
mys=0
EndIf

dest_xang# = dest_xang + mys

; When the player looks up, the front pivot moves UP, when looks down the back pivot moves down
TranslateEntity pivot1,0,-MYS#*.15,0

angle#= Sin(EntityPitch(camera))*10
tempkkammag#=(camheight + angle)
tempkkamtav#= camdist - Abs( angle)

dest_yang# = dest_yang - (mxs*.5)

RotateEntity ent, 0, dest_yang,0

;Velocity of camera movement and position according of collision
dx#=(EntityX(pivothatso,True)-EntityX(camera,True)) * .1
dy#=(EntityY(pivothatso,True)-EntityY(camera,True)) *.9
dz#=(EntityZ(pivothatso,True)-EntityZ(camera,True)) *.1

TranslateEntity camera,dx,dy,dz
PointEntity camera,pivot1
PositionEntity pivothatso,0,0,0
ResetEntity pivothatso
PositionEntity pivothatso,0,tempkkammag,tempkkamtav
End Function


Sir Gak(Posted 2006) [#2]
Code seems fine. When posting code, though, it is best to use the code brackets before and after your code, as follows (but without the spaces):
[ code ]
[ /code ]


Mike0101(Posted 2006) [#3]
More smooth with modified paramerets




;*************
;by Mike0101
;I'm sure somebody makes  better this weak code
;but this code works right
;*************
;System
Global screen_width% = 1024
Global screen_height% = 768
Global screen_halfwidth% = screen_width/2
Global screen_halfheight% = screen_height/2
Global camHeight#=4 ; default height of the camera behind the player
Global camDist#=-8 ; default distance of the camera behind the player
Global dest_xang# 
Global dest_yang# 

;CONST
Const C_PLAYER=1, C_LEVEL=2

AppTitle "TPS Camera"
HidePointer


;Screen
Graphics3D screen_width,screen_height,32,2
SetBuffer BackBuffer()

;Light
light=CreateLight()

;Plan
plan=CreatePlane()
EntityColor plan,255,0,0
EntityType plan, C_LEVEL

;OBJECT
cube1=CreateCube()
ScaleEntity cube1,10,10,10
PositionEntity cube1,13,0,13
EntityType cube1,C_LEVEL


;CAMERA
camera =CreateCamera()


;Player Pivot
plpivot=CreatePivot()
EntityType plpivot, C_PLAYER
EntityRadius plpivot,1.8,3
PositionEntity plpivot, 0, 1,0


;Player, now a cube but you can change for a nice model
Player=CreateCube(plpivot)
ScaleEntity player,1,3,.7
EntityColor Player,255,0,255

;I'm using 2 pivots for camera controlling

;Pivot for the camera controlling
;One Front of the player,
FrontPivot=CreatePivot(plpivot)
PositionEntity Frontpivot,0,4,10

;One behind the player
;This pivot controlls the collisions and "finds" the right position of the camera behind player
Backpivot=CreatePivot(plpivot)
EntityRadius Backpivot,1
EntityType BackPivot, C_PLAYER


Collisions C_PLAYER, C_LEVEL ,2,2

While Not KeyHit(1)
 
  UpdateCamera(plpivot,MouseXSpeed(),MouseYSpeed(), Frontpivot, Backpivot, Camera)

  UpdateWorld
  RenderWorld
  ; Crosshair :)
  Text screen_halfwidth%, screen_halfheight%, "+"
   Flip
Wend

End



Function updatecamera(ent,mxs#, mys#, pivot1, pivothatso, camera)
;ent : Player pivot
;mxs: MouseXmove
;mys: MouseYmove
;pivot1: pivot before player
;pivothatso: pivot front player
;Camera: ....What do you think:)
       MoveMouse screen_halfwidth%, screen_halfheight%
  
     ; Limit of the "look up", "look down"  
       If dest_xang + mys > 120 Or dest_xang + mys < -45 Then ;
        mys=0 
       EndIf

      dest_xang# = dest_xang + mys

      ; When the player looks up, the front pivot moves UP, when looks down the back pivot moves down
      TranslateEntity pivot1,0,-MYS#*.15,0
 
       angle#=  Sin(EntityPitch(camera))*6
      tempkkammag#=(camheight + angle)
      tempkkamtav#=   camdist + Abs( angle) 

      dest_yang# = dest_yang - (mxs*.5)
 
       RotateEntity ent, 0, dest_yang,0
     
       ;Velocity of camera movement and position according of collision
            dx#=(EntityX(pivothatso,True)-EntityX(camera,True)) * .1
	     dy#=(EntityY(pivothatso,True)-EntityY(camera,True)) *.9
            dz#=(EntityZ(pivothatso,True)-EntityZ(camera,True)) *.1
	
	      TranslateEntity camera,dx,dy,dz
        PointEntity camera,pivot1
	      PositionEntity pivothatso,0,0,0
            ResetEntity pivothatso
       	PositionEntity pivothatso,0,tempkkammag,tempkkamtav
End Function



Chad(Posted 2006) [#4]
Ok Mike, what do you need help with on collisions.. I'll do my best :-D


Chad(Posted 2006) [#5]
Mike, when you put in code to move the box, the camera doesn't move with the box..

For example, I put this code to test it and it didn't work.
While Not KeyHit(1)

If KeyHit(2) Then ;The 1 button on keyboard
MoveEntity Player,.2,.2,.2
End If

UpdateCamera(plpivot,MouseXSpeed(),MouseYSpeed(), Frontpivot, Backpivot, Camera)

  UpdateWorld
  RenderWorld
  ; Crosshair :)
  Text screen_halfwidth%, screen_halfheight%, "+"
   Flip
Wend

End


Do you have a solution to that??

It's overall a good little camera, and I quite like it and modelled my camera more like yours after playin around with this.. But just this little move entity is what gets me..

Thanks,
Chad


mindstorms(Posted 2006) [#6]
The way he has got it set up, the pivots are positioned "absolutly". For it to be able to move, the pivots have to be positioned according to the player's coordinates....Maybe make the player the parent of the pivots instead of the the pivots the parent to the player...


Mike0101(Posted 2006) [#7]
Chad

you must move the plpivot object instead of the player (cube).

Change this:

If KeyHit(2) Then ;The 1 button on keyboard
MoveEntity Player,.2,.2,.2
End If

for this

If KeyHit(2) Then ;The 1 button on keyboard
MoveEntity Plpivot,.2,.2,.2
End If


By the way I will send a new sample.


Mike0101(Posted 2006) [#8]
Move WSAD, jump SPACE or RMB



;*************
;3rd person camera control with move, jump, collison
;by Mike0101
;I'm sure somebody makes  better this weak code
;but this code works right
;*************
Type Timer
	Field start
	Field timeOut
	Field vel_start#;=90
	Field vel_down#;=-2
End Type

;System
Global AppFPS =45
Global screen_width% = 1024
Global screen_height% = 768
Global screen_halfwidth% = screen_width/2
Global screen_halfheight% = screen_height/2
Global camHeight#=4.5  ; default height of the camera behind player
Global camDist#=-7 ; default distance of the camera behind player
Global dest_xang# 
Global dest_yang# 
Global pl_gravity#=-.5
Global pl_jump=0
Global Jump_Move#=0
Global Move_For_Back#
Global Move_Left_Right#
Global Move_Slow#=.1
;CONST
Const C_PLAYER=1, C_LEVEL=2

AppTitle "TPS Camera movement"
HidePointer

;Screen
Graphics3D screen_width,screen_height,32,1
SetBuffer BackBuffer()

CreateWorld()

;CAMERA
camera =CreateCamera()

;Player Pivot
plpivot=CreatePivot()
EntityType plpivot, C_PLAYER
EntityRadius plpivot,1.8,3
PositionEntity plpivot, 0, 3,0

;Player, now a cube but you can change for a nice model
Player=CreateCube(plpivot)
ScaleEntity player,1,3,.7
MoveEntity player,0,1,0
EntityColor Player,255,0,255

;I'm using 2 pivots for camera controlling
;Pivot for the camera controlling
;One Front of the player,
FrontPivot=CreatePivot(plpivot)
PositionEntity Frontpivot,0,4,10

;One behind player
;This pivot controlls the collisions and "finds" the right position of the camera behind player
Backpivot=CreatePivot(plpivot)
EntityRadius Backpivot,1
EntityType BackPivot, C_PLAYER


Collisions C_PLAYER, C_LEVEL ,2,2


; -------------
; Main loop
; -------------
FramePeriod = 1000 / AppFPS
FrameTime = MilliSecs () - FramePeriod
While Not KeyHit(1)
 
; --------------------------
	; Frame rate limiting
	; --------------------------
	Repeat
		FrameElapsed = MilliSecs () - FrameTime
	Until FrameElapsed

	FrameTicks = FrameElapsed / FramePeriod
	FrameTween# = Float (FrameElapsed Mod FramePeriod) / Float (FramePeriod)

	; -----------------------
	; Update tweening
	; -----------------------
	For FrameLimit = 1 To FrameTicks
		If FrameLimit = FrameTicks Then
			CaptureWorld
		EndIf
		FrameTime = FrameTime + FramePeriod
		
              UpdateCamera(plpivot,MouseXSpeed(),MouseYSpeed(), Frontpivot, Backpivot, Camera)
              UpdatePosition(plpivot)
              UpdateWorld

      Next
     
  RenderWorld FrameTween
  ; Crosshair :)
  Text screen_halfwidth%, screen_halfheight%, "+"

  Flip 0

Wend

End


Function updatecamera(ent,mxs#, mys#, pivot1, pivothatso, camera)
;ent : Player pivot
;mxs: MouseXmove
;mys: MouseYmove
;pivot1: pivot before player
;pivothatso: pivot behind player
;Camera: 

    MoveMouse screen_halfwidth%, screen_halfheight%
  
    ; Limit of the "look up", "look down"  
    If dest_xang + mys > 120 Or dest_xang + mys < -45 Then ;
        mys=0 
    EndIf


      dest_xang# = dest_xang + mys

      ; When the player looks up, the front pivot moves UP, when looks down the back pivot moves down
      TranslateEntity pivot1,0,-MYS#*.15,0
 
     angle#=  Sin(EntityPitch(camera))*6
      tempkkammag#=camheight + (angle*.8)
      tempkkamtav#=   camdist  + Abs( angle) 

      dest_yang# = dest_yang - (mxs*.5)
 
       RotateEntity ent, 0, dest_yang,0
     
        dx#=(EntityX(pivothatso,True)-EntityX(camera,True)) *.1
	dy#=(EntityY(pivothatso,True)-EntityY(camera,True)) *.9
	dz#=(EntityZ(pivothatso,True)-EntityZ(camera,True)) *.1
	
	TranslateEntity camera,dx,dy,dz
        PointEntity camera,pivot1
	PositionEntity pivothatso,0,0,0
	ResetEntity pivothatso

       	PositionEntity pivothatso,0,tempkkammag,tempkkamtav
End Function


Function UpdatePosition(ent)
;MOVEMENT
If pl_jump=0
  If KeyDown(200) Or KeyDown(17) Then 
	Move_For_Back=.3
  End If
  If KeyDown (208) Or KeyDown(31) Then
	Move_For_Back=-.2
  End If
  If KeyDown(203) Or KeyDown(30) Then 
      Move_Left_Right=-.2
  End If
  If KeyDown (205) Or KeyDown(32) Then
       Move_Left_Right=.2
  End If
EndIf

If ( MouseHit(2)  Or KeyHit(57))  And pl_jump=0
     t.Timer = JumpTimer (1500)
    ;When jumps slides in the air doesn't stop quickly
     Move_Slow#=.999
     pl_jump=1
EndIf

If jump_timeout()=1
    pl_jump=0
   ;when goes stops quickly
    Move_Slow#=.1
EndIf

   MoveEntity ent, Move_Left_Right, Jump_Move, Move_For_Back
  TranslateEntity ent,0,pl_gravity,0

  ;Smooth movement
  move_left_right = move_left_right * move_slow
  move_for_back = move_for_back  * move_slow

End Function

Function JumpTimer.timer (timeOut)
	t.Timer = New Timer
	t\start   = MilliSecs ()
	t\timeOut = t\start + timeOut
        t\vel_start#=90
        t\vel_down#=-2
	Return t
End Function

; Check for timeout:
Function Jump_TimeOut ()
	For test.timer= Each timer
		If test\timeOut < MilliSecs ()
 		       Jump_move=0
			Delete test
			Return 1
	      Else
	           Jump_Move=Sin(test\vel_start#)
	            test\vel_start=test\vel_start#- test\vel_down#
        	   Return 0
       	EndIf
     Next		
End Function


Function CreateWorld()
;Light
light=CreateLight(1)
PositionEntity light ,0,50,0

;Plan
plan=CreatePlane()
EntityColor plan,255,0,0
EntityType plan, C_LEVEL

;OBJECT
cube1=CreateCube()
ScaleEntity cube1,10,10,10
PositionEntity cube1,13,0,13
EntityType cube1,C_LEVEL

cube2=CreateCube()
ScaleEntity cube2,20,20,20
PositionEntity cube2,33,0,33
EntityType cube2,C_LEVEL

;bridge right side
cube3=CreateCube()
ScaleEntity cube3,20,20,15
PositionEntity cube3,83,0,33
EntityType cube3,C_LEVEL

;bridge
cube4=CreateCube()
ScaleEntity cube4,5,2,20
PositionEntity cube4,83,18,63
EntityType cube4,C_LEVEL

cube5=CreateCube()
ScaleEntity cube5,30,15,35
PositionEntity cube5,153,0,33
EntityType cube5,C_LEVEL

;Bridge left side
cube6=CreateCube()
ScaleEntity cube6,20,20,15
PositionEntity cube6,83,0,93 
EntityType cube6,C_LEVEL
End Function



mindstorms(Posted 2006) [#9]
That's neat!

Sorry about my misleading advice, buggy :(