A tank that follows the terran
Blitz3D Forums/Blitz3D Beginners Area/A tank that follows the terran
| ||
Hey, i have this tank game i'm messing with as my first real 3d project. First of all i'm new to blitz3d, i'v been using the demo for about 5 days before Christmas, then got the real thing on Christmas, so just over a week of experiance. Anyways my tank can be controled by the player to go around the terrain. i'm using the following code to keep him above the terrain: ex#=EntityX(player):ez#=EntityZ(player) PositionEntity player,ex,TerrainY( land,ex,0,ez )+1.5,ez now then it looks very strange, what i'm looking for is a code that allows the tank or any car, to rotate to the terrain around him in realtime. heres my complete code: ;Sets the graphics mode and the backbuffer Graphics3D 1680,1050,16,1 SetBuffer BackBuffer() ;Global stuff Global RIGHT_ARR=205, LEFT_ARR=203, UP_ARR=200, DOWN_ARR=208, SPAC_BAR=57, R_CTR=157, N_0=82 Global cam1, player, land, skybox, playerhead Global velocity#=0 Global x#=0, y#=0, z#=-10 ;Makes the camera cam1=CreateCamera() CameraViewport cam1,0,0,1680,1050 PositionEntity cam1,0,7+40,-35 ;RotateEntity cam1,0,180,0 ;Makes a light light1=CreateLight ;Calls some functions that dont loop in realtime maketerrain() Loadplayer("Models&Textures\warrior\warriorbody.3ds") makeskybox() ;Bullet type Type bullet Field sprite, timeout End Type ;!@#@$@#!$@!#$#@%#$%$%^%^&^%*&^(*&()*)*()%^$^%#@ ;!@#$!@#$@#%@#$ MAIN GAME LOOP !#$@#$@%#@$^$%@#$ ;#@$!@#$@!#$@#%#$%@#$%@$##@!%#$@%#$%@#$%#@$@%@%$ While Not KeyHit(1) ;Calls some loop functions playermove() chasecam() ;Makes it so the skybody is always in the same spot as the player PositionEntity skybox,EntityX(player),EntityY(player),EntityZ(player) ;this little code translates the raw velocity code into a fake MPH, that will be displayed in the center of the screen MPH%=velocity#*30 MPH%=MPH%-MPH-MPH ;Updates and renders the world UpdateWorld RenderWorld ;2D stuff ;Text, with some maths to show xyz, and the velocity Color 255,0,0 Text GraphicsWidth()/2,GraphicsHeight()/2,"MPH"+MPH Text 50,70,"X: "+EntityX(player)+" Y: "+EntityY(player)+" Z: "+EntityZ(player) Color 255,255,255 ;flip the backbuffer stuff onto the front buffer, and end when the ESC key is pressed Flip Wend ;!@#@$@#!$@!#$#@%#$%$%^%^&^%*&^(*&()*)*()%^ ;!@#$!@#$@#%@#$ FUNCTIONS !#$@#$@%#@$^$%@#$ ;#@$!@#$@!#$@#%#$%@#$%@$##@!%#$@%#$%@#$%#@$ ;Loads the player tank both parts, and resizes 'em Function Loadplayer(file$) ;Tanks body player=LoadMesh(file$) ptex=LoadTexture("Models&Textures\warrior\warrior.jpg") EntityTexture player,ptex ScaleEntity player,5,5,5 RotateEntity player,0,180,0 EntityType player,t_player PositionEntity player,x,y,z ;Tanks head playerhead=LoadMesh("Models&Textures\warrior\warriorhead.3ds") EntityTexture playerhead,ptex PositionEntity playerhead,0,41.99,-13 ScaleEntity playerhead,5,5,5 RotateEntity playerhead,0,180,0 End Function ;All the movement and control factors go here Function playermove() ;Accelerate and if the key isnt down then decelerate If KeyDown(UP_ARR) And velocity#>-1.001 Then velocity#=velocity#-0.001 Else If velocity#<0.0 Then velocity#=velocity#+0.001 ;If the speed is 0 then reverse, and if reverse isnt happening decelerate If KeyDown(DOWN_ARR) And velocity#>-0.00001 And velocity#<1.0 Then velocity#=velocity#+0.001 Else If velocity#>0.0 Then velocity#=velocity#-0.001 ;Turn left If KeyDown(LEFT_ARR) Then TurnEntity player,0,0.5,0 End If ;Turn right If KeyDown(RIGHT_ARR) Then TurnEntity player,0,-0.5,0 End If ;Turns the tanks head left If KeyDown(R_CTR) Then TurnEntity playerhead,0,2,0 End If ;Turns the tanks head right If KeyDown(N_0) Then TurnEntity playerhead,0,-2,0 End If ;Instantly stops the tank, NOTE: fix this If KeyHit(SPAC_BAR) Then velocity#=0 ;Puts the velocity code in motion MoveEntity player,0,0,velocity# ;Make sure the tank stays ontop of the terrain ex#=EntityX(player):ez#=EntityZ(player) PositionEntity player,ex,TerrainY( land,ex,0,ez )+1.5,ez ;"Glues the tanks top onto the tanks body but not viseversa, so the tank head can move without moving the body EntityParent playerhead,player End Function ;Makes the terrain Function maketerrain() land_tex=LoadTexture( "Terrian stuff\terrain_tex.jpg" ) ScaleTexture land_tex,10,10 land=LoadTerrain( "Terrian stuff\terrain_hmap.jpg" ) ScaleEntity land,8,100,8 PositionEntity land,-2048,0,-2048 EntityTexture land,land_tex TerrainDetail land,1000,True EntityType land,t_land End Function ;makes the camera Function chasecam() EntityParent cam1,player End Function ;Creates the skybox Function makeskybox() skybox=CreateMesh() ;front face b=LoadBrush( "Terrian stuff\front.jpg",49 ) s=CreateSurface( skybox,b ) AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0 AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;left face b=LoadBrush( "Terrian stuff\left.jpg",49 ) s=CreateSurface( skybox,b ) AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0 AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;back face b=LoadBrush( "Terrian stuff\back.jpg",49 ) s=CreateSurface( skybox,b ) AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0 AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;right face b=LoadBrush( "Terrian stuff\right.jpg",49 ) s=CreateSurface( skybox,b ) AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0 AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;top face b=LoadBrush( "Terrian stuff\up.jpg",49 ) s=CreateSurface( skybox,b ) AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0 AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;bottom face b=LoadBrush( "Terrian stuff\down.jpg",49 ) s=CreateSurface( skybox,b ) AddVertex s,-1,-1,-1,1,0:AddVertex s,+1,-1,-1,1,1 AddVertex s,+1,-1,+1,0,1:AddVertex s,-1,-1,+1,0,0 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ScaleMesh skybox,100,100,100 FlipMesh skybox EntityFX skybox,1 EntityOrder skybox,10 End Function Anyone? also i tried using that one guys code in the CA, somthing about making it happen without using child or pivots, i tried incorperating it into my code, didnt work, if any of you know how to incorporate it into my code that'd be great otherwise do you know any other methods mabey ones that use "Pivots and child entitys" Thanks, Yahfree |
| ||
After loading the terrain, use EntityPickMode land, 2. Then, instead of using TerrainY, first call LinePick ex, 2000, ez, 0, -4000, 0 And use PickedY() + 1.5 as the y-coordinate of the tank. To align the tank to the terrain, use AlignToVector player, PickedNX(), PickedNY(), PickedNZ(), 2, 0.1 after the linepick. "0.1" means that the Align should be gradually applied. It should be a value between 0.0 and 1.0 |
| ||
THANKS!!!! seriosely i was brainstorming all day for a simple 3 lines of code!! wow thanks!! |
| ||
There's a demo by the Blitz developer in the Blitd3D samples directory that may be of use to you. It should be at: C:\Program Files\Blitz3D\Samples\Blitz 3D Samples\mak\driver |
| ||
Cool, i'll study that, but for now i'll use B32's code, anyways heres a new question, how do i get the top part of a tank (a NPC) to follow the player, heres the code i'm using:;Sets the graphics mode and the backbuffer Graphics3D 1680,1050,16,1 SetBuffer BackBuffer() ;Global stuff Global RIGHT_ARR=205, LEFT_ARR=203, UP_ARR=200, DOWN_ARR=208, SPAC_BAR=57, R_CTR=157, N_0=82 Global cam1, player, land, skybox, playerhead, bullet_sprite, boom, enemyhead, enemy Global velocity#=0 Global x#=0, y#=0, z#=-10 Global t_enemy=1, t_enemyhead=2, t_player=3, t_playerhead=4, t_bullet=5 Global timer=MilliSecs() Collisions t_player,t_enemy,2,1 Collisions t_bullet,t_enemy,2,1 ;Makes the cameras cam1=CreateCamera() CameraViewport cam1,0,0,1680,1050 PositionEntity cam1,0,7+40,-35 ;Makes a light light1=CreateLight ;Bullet type Type bullet Field sprite, time_out End Type boom=LoadSound("Music&SFX\gun fire.wav") ;Calls some functions that dont loop in realtime maketerrain() Loadplayer("Models&Textures\warrior\warriorbody.3ds") makeskybox() Loadbullet() Loadenemy() ;!@#@$@#!$@!#$#@%#$%$%^%^&^%*&^(*&()*)*()%^$^%#@ ;!@#$!@#$@#%@#$ MAIN GAME LOOP !#$@#$@%#@$^$%@#$ ;#@$!@#$@!#$@#%#$%@#$%@$##@!%#$@%#$%@#$%#@$@%@%$ While Not KeyHit(1) ;Calls some loop functions playermove() enemymove() chasecam() updatebullet() collision() ;Makes it so the skybody is always in the same spot as the player PositionEntity skybox,EntityX(player),EntityY(player),EntityZ(player) ;this little code translates the raw velocity code into a fake MPH, that will be displayed in the center of the screen MPH%=velocity#*30 MPH%=MPH%-MPH-MPH ;Updates and renders the world UpdateWorld RenderWorld ;2D stuff ;Text, with some maths to show xyz, and the velocity Color 255,0,0 Text GraphicsWidth()/2,GraphicsHeight()/2,"MPH: "+MPH Text 50,65,"TANK X: "+EntityX(player)+" Y: "+EntityY(player)+" Z: "+EntityZ(player) Text 50,50,"MOUSE X: "+MouseX()+" Y: "+MouseY() Rect MouseX(),MouseY(),5,5 Color 255,255,255 ;flip the backbuffer stuff onto the front buffer, and end when the ESC key is pressed Flip Wend End ;!@#@$@#!$@!#$#@%#$%$%^%^&^%*&^(*&()*)*()%^ ;!@#$!@#$@#%@#$ FUNCTIONS !#$@#$@%#@$^$%@#$ ;#@$!@#$@!#$@#%#$%@#$%@$##@!%#$@%#$%@#$%#@$ ;Loads the player tank both parts, and resizes 'em Function Loadplayer(file$) ;Tanks body player=LoadMesh(file$) ptex=LoadTexture("Models&Textures\warrior\warrior.jpg") EntityTexture player,ptex ScaleEntity player,5,5,5 RotateEntity player,0,180,0 EntityType player,t_player PositionEntity player,x,y,z EntityType player,t_player EntityRadius player,6 ;Tanks head playerhead=LoadMesh("Models&Textures\warrior\warriorhead.3ds") EntityTexture playerhead,ptex PositionEntity playerhead,0,40.5,-13 ScaleEntity playerhead,5,5,5 RotateEntity playerhead,0,180,0 EntityType playerhead,t_playerhead End Function ;All the movement and control factors go here Function playermove() ;Accelerate and if the key isnt down then decelerate If KeyDown(UP_ARR) And velocity#>-1.001 Then velocity#=velocity#-0.001 Else If velocity#<0.0 Then velocity#=velocity#+0.001 ;If the speed is 0 then reverse, and if reverse isnt happening decelerate If KeyDown(DOWN_ARR) And velocity#>-0.00001 And velocity#<1.0 Then velocity#=velocity#+0.001 Else If velocity#>0.0 Then velocity#=velocity#-0.001 ;Turn left If KeyDown(LEFT_ARR) Then TurnEntity player,0,0.5,0 End If ;Turn right If KeyDown(RIGHT_ARR) Then TurnEntity player,0,-0.5,0 End If ;Turns the tanks head left If KeyDown(R_CTR) Then TurnEntity playerhead,0,2,0 End If ;Turns the tanks head right If KeyDown(N_0) Then TurnEntity playerhead,0,-2,0 End If ;Instantly stops the tank, NOTE: fix this If KeyHit(SPAC_BAR) Then shootbullet(playerhead) If KeyHit(19) Then ShowEntity enemy ShowEntity enemyhead End If ;Puts the velocity code in motion MoveEntity player,0,0,velocity# ;Make sure the tank stays ontop of the terrain and rotates to the terrain around it ex#=EntityX(player):ez#=EntityZ(player) LinePick ex, 2000, ez, 0, -4000, 0 PositionEntity player,ex,PickedY(),ez AlignToVector player, PickedNX(), PickedNY(), PickedNZ(), 2, 0.1 ;"Glues the tanks top onto the tanks body but not viseversa, so the tank head can move without moving the body EntityParent playerhead,player End Function ;Makes the terrain Function maketerrain() land_tex=LoadTexture( "Terrian stuff\terrain_tex.jpg" ) ScaleTexture land_tex,10,10 land=LoadTerrain( "Terrian stuff\terrain_hmap.jpg" ) EntityPickMode land, 2 ScaleEntity land,8,100,8 PositionEntity land,-2048,0,-2048 EntityTexture land,land_tex TerrainDetail land,1000,True EntityType land,t_land End Function ;makes the camera Function chasecam() EntityParent cam1,player End Function ;Creates the skybox Function makeskybox() skybox=CreateMesh() ;front face b=LoadBrush( "Terrian stuff\front.jpg",49 ) s=CreateSurface( skybox,b ) AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0 AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;left face b=LoadBrush( "Terrian stuff\left.jpg",49 ) s=CreateSurface( skybox,b ) AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0 AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;back face b=LoadBrush( "Terrian stuff\back.jpg",49 ) s=CreateSurface( skybox,b ) AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0 AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;right face b=LoadBrush( "Terrian stuff\right.jpg",49 ) s=CreateSurface( skybox,b ) AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0 AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;top face b=LoadBrush( "Terrian stuff\up.jpg",49 ) s=CreateSurface( skybox,b ) AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0 AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;bottom face b=LoadBrush( "Terrian stuff\down.jpg",49 ) s=CreateSurface( skybox,b ) AddVertex s,-1,-1,-1,1,0:AddVertex s,+1,-1,-1,1,1 AddVertex s,+1,-1,+1,0,1:AddVertex s,-1,-1,+1,0,0 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ScaleMesh skybox,100,100,100 FlipMesh skybox EntityFX skybox,1 EntityOrder skybox,10 End Function ;Loads the bullet sprite and hides it until needed Function Loadbullet() bullet_sprite=LoadSprite("Sprites\bluspark.bmp") ScaleSprite bullet_sprite,3,3 HideEntity bullet_sprite EntityRadius bullet_sprite,1.5 EntityType bullet_sprite,t_bullet End Function ;The bullets realtime stuff after its fired Function updatebullet() For b.bullet=Each bullet b\time_out=b\time_out-1 If b\time_out=0 FreeEntity b\sprite Delete b Return EndIf MoveEntity b\sprite,0,0,-2 Next End Function ;Shoots the bullet when called (called when spacebar is pressed) Function shootbullet(playerhead) b.bullet=New bullet b\time_out=150 b\sprite=CopyEntity( bullet_sprite, playerhead ) PositionEntity b\sprite,0,0,-1 EntityParent b\sprite,0 PlaySound boom Return p End Function ;Loads the enemy (a copy of the players tank) Function Loadenemy() enemy=CopyEntity(player) EntityType enemy,t_enemy PositionEntity enemy,0,0,25 EntityRadius enemy,6 enemyhead=CopyEntity(playerhead) EntityType enemyhead,t_enemyhead PositionEntity enemyhead,0,40.5,22 End Function ;Enemy movement and realtime stuff Function enemymove() ;MoveEntity enemy,0,0,0.5 TurnEntity enemyhead,0,EntityZ(player),0 ;Make sure the tank stays ontop of the terrain and rotates to the terrain around it ex#=EntityX(enemy):ez#=EntityZ(enemy) LinePick ex, 2000, ez, 0, -4000, 0 PositionEntity enemy,ex,PickedY(),ez AlignToVector enemy, PickedNX(), PickedNY(), PickedNZ(), 2, 0.1 EntityParent enemyhead,enemy End Function ;Collisions Function collision() ;Deletes the bullet and hides the tank when the bullet and the tank collide For b.bullet=Each bullet If EntityCollided( b\sprite,t_enemy ) HideEntity enemy HideEntity enemyhead FreeEntity b\sprite Delete b Return End If Next End Function as you can see this is my sad atempt of doign this effect: TurnEntity enemyhead,0,EntityZ(player),0 |
| ||
Also, i'm still learning types, i tried to match the bullet effect from Mak's Castle demo, so far so good. |