Tank Controls

Blitz3D Forums/Blitz3D Beginners Area/Tank Controls

Chad(Posted 2007) [#1]
Hey guys, playing around with some commands for a little tank application and ran into a stopping point. I've got 2 meshes, the hull (bottom part) and the turret (the top part) of the tank, and what I'm trying to do is be able to move the hull around with the turret child to the hull, but on a different pivot so I can move my mouse and move the turret around with the mouse.

However, while I'm moving my mouse around and stuff, it does not effect the hull, it keeps going the same direction as it was though I'm looking a different way.

I would also like the steering controls so instead of a strafing action with A and D or the left and right arrows, the hull rotates depending on what direction you want it too.

So if you could take a look and tell me what I'm missing or doing incorrectly please?

Thanks,
Chad
Include "BlitzGrass.bb"

Type Timer
	Field start
	Field timeOut
	Field vel_start#;=90
	Field vel_down#;=-2
End Type

Type Tank
	Field mesh, turret
	Field Yturn#, speed#
	Field ammo, damage#
	Field AI
	Field firetime
	Field team
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 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

;hull pivot
hullpivot=CreatePivot()
EntityType hullpivot,C_PLAYER
EntityRadius hullpivot,1.8,3
PositionEntity hullpivot,0,2,0

;-- Add grass

;First init must be called. Normally you would supply a terrain to this function, but
;in this demo no terrain is used.
BG_Init()

;This adjusts the viewing range of the grass and the density factor. This can be changed
;based on your system's speed
BG_SetLOD(50, 1)

;Load the grass layer
grassLayer = BG_LoadGrass("grass.png")
BG_SetDensity(grassLayer, 300)
BG_SetScale(grassLayer, 4, 2)

;And set the regions of grass density through a greyscale grassmap
;BG_SetGrassMap(grassLayer, "grassmap.jpg")

	;tankhull=LoadMesh("panzer\hull.b3d",plpivot)
	;MoveEntity tankhull,0,-2.257,0
	;EntityType tankhull,C_PLAYER
	;EntityRadius tankhull,.8
	;ScaleEntity tankhull,.065,.065,.065
	
	;tankturret=LoadMesh("panzer\turret.b3d",plpivot)
	;MoveEntity tankturret,0,-2.257,0
	;EntityType tankturret,C_PLAYER
	;EntityRadius tankturret,.8
	;ScaleEntity tankturret,.065,.065,.065

tankhull=CreateCube(plpivot)
MoveEntity tankhull,0,0,0
EntityColor tankhull,0,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,20

bottompivot=CreatePivot(hullpivot)
PositionEntity bottompivot,0,0,20

;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)
BG_Update(camera)
; --------------------------
	; 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, hullpivot)
              UpdatePosition(plpivot)
			  UpdatePosition(hullpivot)
              UpdateWorld

      Next
     
  RenderWorld FrameTween
  ; Crosshair :)
  Text screen_halfwidth%, screen_halfheight%, "+"
	t = MilliSecs()
	dt = t - lastt
	lastt = t
	Text 10, 10, (1000.0 / dt) + "FPS"
  Flip 0

Wend

End


Function updatecamera(ent,mxs#, mys#, pivot1, pivothatso, camera, hullpivot)
;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

  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 CreateWorld()
;Light
light=CreateLight(1)
PositionEntity light ,0,50,0

;Plan
plan=CreatePlane()
planetex=LoadTexture("grass.jpg")
EntityTexture plan,planetex
;EntityColor plan,255,0,0
EntityType plan, C_LEVEL

;prop=LoadMesh("panzer\panzer.b3d")
;PositionEntity prop,25,0,20
;ScaleEntity prop,.065,.065,.065
End Function



xtremegamr(Posted 2007) [#2]
Hmm....well, you could start the game by pointing the turret to the mouse. Then, you can update the turret by using MouseXSpeed() and MouseYSpeed(). For example:

----------------------------------------------
TurnEntity turret,MouseYSpeed()/5,MouseXSpeed()/5,0
----------------------------------------------

...or something like that. Make sure you include the MouseXSpeed()/5 and MouseYSpeed()/5. You can change the number if you want the turret to spin at a different speed, but if you leave it out, the turret will spin like crazy when you move the mouse!

With the hull, you could put in a variable that keeps track of the current rotation of the hull\non-turret part and use RotateEntity. For example:

---------------------------------------------
If KeyHit(30) Then rx=rx-2
If KeyHit(32) Then rx=rx+2

RotateEntity hull,0,rx,0
---------------------------------------------


Chad(Posted 2007) [#3]
Doesn't work correctly but I know what you're saying, and I've tried that... Any other suggestions?


xtremegamr(Posted 2007) [#4]
...nope. Sorry, that's all the ideas I have right now. If I think of something I'll post it.


b32(Posted 2007) [#5]
Maybe you could avoid parenting the turret at the hull, and use PositionEntity turret, EntityX(hull), EntityY(hull), EntityZ(hull) instead ? Or use something like this ?



Bankie(Posted 2007) [#6]
I'm not sure I'm following what you're trying to achieve and can't try out your code because of dependencies, but I'll put my tuppence in, in case it's of help as I've recently done a tanks game along these lines (http://www.bankie.com/games/tanks/tanksonline.php).

What I wanted to do was make the turret turn towards the mouse pointer (which appears as a crosshair on the ground), and the tank move using cursors keys (or whatever). Left and right keys to rotate the tank, and up/down to move forwards/backwards. To achieve this, I didn't use pivots, but made the turret a child of the hull. Left/right keys caused a TurnEntity hull command. Up/down keys caused a MoveEntity hull command. The position of the mouse cursor and some simple trigonometry was used to calculate the rotational angle of the turret (RotateEntity).

Hope that's of some help.