Falling through terrain

Blitz3D Forums/Blitz3D Beginners Area/Falling through terrain

Chad(Posted 2005) [#1]
Ok, I've been playing with WolRon's first person code, and I've run into a problem, whenever I load in my own .b3d for the level, I just fall right through the terrain and into a darkness that never stops. I looked at the collisions and it should work, however it doesn't.

raphics3D 1024,768, 0, 1					;3D graphics at a resolution of 800x600
SetBuffer BackBuffer()						;do all drawing to the back drawing buffer

Const PLAYER_COL= 1
Const LEVEL_COL = 2
Const ENEMY_COL = 3
Const BULLET_COL= 4

Type bullettype							;set up the bullet type
  Field entityhandle						;create a field to contain the handle of the bullets mesh
End Type

Type badguytype							;set up the badguy type
  Field entityhandle						;will contain the handle of the badguys mesh
  Field state							;will contain the state that the badguy is currently in
End Type

light = CreateLight()						;Create a light to see
RotateEntity light, 30, 30, 0					;angle the light
player = CreatePivot()						;A simple pivot is all we need to represent the player
camera = CreateCamera(player)					;create the camera and attach it to the player
CameraRange camera, .01, 250					;set the camera range to something reasonable
level = LoadMesh("beach1.b3d")					;load in the level mesh

;weapon1 = LoadMesh("pistol.b3d", camera)			;load in the weapon mesh and attach it to the camera
weapon1 = CreateCylinder(32, 1, camera):RotateMesh weapon1, 90, 0, 0:ScaleEntity weapon1, .05, .05, .2:EntityColor weapon1, 50, 50, 50
;bulletmesh = LoadMesh("bullet.b3d")				;load in a bullet mesh (this will be a template mesh)
bulletmesh = CreateCone():RotateMesh bulletmesh,90,0,0:ScaleEntity bulletmesh,.1,.1,.1
EntityType bulletmesh, BULLET_COL				;set up collision type for the bullet
EntityRadius bulletmesh, .01					;set up collision radius for the bullet
;badguymesh = LoadMesh("badguy.b3d")				;load in badguy mesh (this will also be a template mesh)
badguymesh = CreateCylinder():ScaleEntity badguymesh,.3,.95,.125;.6 wide, 1.9 tall, .25 thick
EntityType badguymesh, ENEMY_COL				;set up collision type for the badguy
EntityRadius badguymesh, .3, .95	 			;set up collision radius for the badguy (1.9 meters tall, .6 meters wide)
HideEntity bulletmesh						;hide the template meshes since they are not actual objects
HideEntity badguymesh						;this will also exclude them from collisions

For iter = 1 To 10						;create some badguys from the template badguy mesh
  badguy.badguytype = New badguytype				;create a new badguy
  badguy\entityhandle = CopyEntity(badguymesh)			;give him a mesh
  badguy\state = Rnd(1, 2) 					;1=Guard 2=Search 3=Evade 4=Attack 5=Dead
Next

MoveEntity camera, 0, .9, 0					;move camera up to height of players head (also moves weapon)
MoveEntity weapon1, .1, -.15, .1				;move weapon to bottom right of camera
MoveEntity player, 20, 1, -20					;move the player to the starting position

For badguy = Each badguytype					;iterate through all of the badguys
  PositionEntity badguy\entityhandle, Rnd(100)-50, .95, Rnd(100)-50	;move the badguy to a random starting position
Next

EntityType player, PLAYER_COL					;set up collision type for the player
EntityRadius player, .3, .95					;set up the players collision radius (1.9 meters tall, .6 meters wide)
EntityType level, LEVEL_COL					;set up collision type for the level
Collisions PLAYER_COL, LEVEL_COL, 2, 2				;player to level
Collisions PLAYER_COL, ENEMY_COL, 1, 2				;player to badguy
Collisions ENEMY_COL, LEVEL_COL, 2, 2				;badguy to level
Collisions BULLET_COL, LEVEL_COL, 2, 1				;bullet to level
Collisions BULLET_COL, ENEMY_COL, 2, 1				;bullet to badguy


While Not KeyHit(1) 						;ESC key

  wkey = KeyDown(17)						;collect user input
  skey = KeyDown(31)						;It's a good practice to collect these inputs only once
  akey = KeyDown(30)						;per loop.  This will prevent odd behaviors from happening,
  dkey = KeyDown(32)						;for instance if the state of a key changes between multiple
  mouse1 = MouseHit(1)						;checks of that key while still in the same loop.

  If wkey Then MoveEntity player, 0, 0, .1			;Forward - w key
  If skey Then MoveEntity player, 0, 0, -.1			;Back    - s key
  If akey Then MoveEntity player, -.1, 0, 0			;Left    - a key
  If dkey Then MoveEntity player, .1, 0, 0			;Right   - d key

  TurnEntity player, 0, -MouseXSpeed()/5.0, 0			;rotate player Pivot according to mouse X movement
  TurnEntity camera, MouseYSpeed()/5.0, 0, 0			;rotate camera up/down according to mouse Y movement
  If EntityPitch(camera) < -45					;don't allow camera to look below -45 degrees
    RotateEntity camera, -45, EntityYaw(camera), EntityRoll(camera)
  EndIf 
  If EntityPitch(camera) > 45					;don't allow camera to look above 45 degrees
    RotateEntity camera, 45, EntityYaw(camera), EntityRoll(camera)
  EndIf
  MoveMouse GraphicsWidth()/2, GraphicsHeight()/2		;reset mouse position to middle of screen

  TranslateEntity player, 0, -.1, 0				;simple gravity

  If mouse1							;check if left mouse button was pressed
    bullet.bullettype = New bullettype				;create a bullet
    bullet\entityhandle = CopyEntity(bulletmesh)		;create the bullet mesh
    PositionEntity bullet\entityhandle, EntityX(weapon1, 1), EntityY(weapon1, 1), EntityZ(weapon1, 1)	;place the bullet at the guns position
    RotateEntity bullet\entityhandle, EntityPitch(weapon1, 1), EntityYaw(weapon1, 1), EntityRoll(weapon1, 1);orientate the bullet with the gun
    ResetEntity bullet\entityhandle				;otherwise bullet could hit enemy while moving from 0,0,0 to current position
  EndIf

  For thisbullet.bullettype = Each bullettype			;iterate through all of the bullets
    MoveEntity thisbullet\entityhandle, 0, 0, 2			;move the bullet forward along the bullets Z axis
    If Abs(EntityX(thisbullet\entityhandle, 1)) > 10000		;check if the bullet is way out of bounds
      FreeEntity thisbullet\entityhandle			;delete the bullet mesh
      Delete thisbullet						;delete the bullet
    ElseIf Abs(EntityY(thisbullet\entityhandle, 1)) > 10000	;check if the bullet is way out of bounds
      FreeEntity thisbullet\entityhandle			;delete the bullet mesh
      Delete thisbullet						;delete the bullet
    ElseIf Abs(EntityZ(thisbullet\entityhandle, 1)) > 10000	;check if the bullet is way out of bounds
      FreeEntity thisbullet\entityhandle			;delete the bullet mesh
      Delete thisbullet						;delete the bullet
    EndIf
  Next

  UpdateWorld							;figures out collisions

  For thisbullet = Each bullettype				;iterate through all of the bullets
    If CountCollisions(thisbullet\entityhandle) > 0		;check if bullet collided with something
      enemyhit = EntityCollided(thisbullet\entityhandle, 3)	;note which enemy bullet collided with (if any)
      If enemyhit > 0						;enemyhit contains entity handle of enemy that was hit
        For thisbadguy.badguytype = Each badguytype		;iterate through all of the badguys
          If enemyhit = thisbadguy\entityhandle			;check if the enemy hit = this badguy
            If thisbadguy\state <> 5				;check if badguy is alive
              thisbadguy\state = 5 ;dead			;make him dead
              RotateEntity thisbadguy\entityhandle, 90, 0, 0	;make him horizontal
              EntityType thisbadguy\entityhandle, 0		;turn off collisions for this badguy
              TranslateEntity thisbadguy\entityhandle, 0, -.9, 0;set him on the ground
              Exit						;exits the badguy For-Next loop (no need to check rest of badguys)
            EndIf
          EndIf
        Next
      EndIf
      FreeEntity thisbullet\entityhandle			;delete the bullet mesh
      Delete thisbullet						;delete the bullet
    EndIf
  Next

  RenderWorld							;draws the 3d scene
  Flip								;displays the scene to the screen
Wend								;loop until the ESC key is pressed
End


As you see I haven't changed much yet, I want to get my terrain into the game, with gravity so every bump in the ground will cause the player to "bump" according to the terrain.


DJWoodgate(Posted 2005) [#2]
You will have to make sure you are above the terrain mesh to start with. You can do that just by making the player high enough and letting him fall onto the terrain. To reduce the height you have to drop him, use linepick to determine the height of the terrain beneath the player and drop him according to that, remembering to leave some leeway for his collision radius. You will have to similarly finesse the bad guys heights. As it stands you will have to be careful with them though, because by the looks of it, they do not fall until they are shot, so an initial drop with a stop collsion might be indicated. In fact I'm not sure the bad guys even need a terrain collision set up at all as it stands, but with it you could have some fun making them fall from heights and so on, so thats something for you to work on.


WolRon(Posted 2005) [#3]
Most likely, the very bottom of the collision sphere of your player is just below the surface of your level mesh.

Try moving the player up (or the level down) a substantial amount just to see if it makes a difference.

something like:
MoveEntity player, 0, 10, 0
or
MoveEntity level, 0, -10, 0

EDIT: Looks like DJW beat me to it.


wizzlefish(Posted 2005) [#4]
That's usually my common mistake :)


Rook Zimbabwe(Posted 2005) [#5]
After you figure out if it is the player start location you can refine it by trial and error so it really doesn't look like you are dropping in to the game like the old Quake 1... I do this every time too.

Also if you have things like ramps and stairs you will find some weird issues with player radius... Just FYI

RZ


_PJ_(Posted 2005) [#6]
I was thinking - where youhave the pivot to represent the player, couldn't this be modified to be 3 pivots? perhaps one for the middle, one for the 'feet' and one for the 'head'?


Strider Centaur(Posted 2005) [#7]
When you make your level, place a shperical object the same size as the players collision sphere, name it PlayerStart. When game starts, get that objects Entity Global position and place you player starting there. Oh and remove the PlayerStart sphere. This way you can see when developing a level in whatever editor your using exactly where your players and bad guys will start at. I find this a must on levels with ramps and walk ways, where I want Bad guys to start ontop of and under things like cat walks. Much easier than ole trial and error.

One other side note, be sure to store all spawn points in the game for later use, as you will probably just be destroying the start sphere( wont be needed after game starts ). This also requires that each enemy start sphere have a unique name for each type of enemy, but like enemies can have line names since it wont matter which spawn point they start at.


Ross C(Posted 2005) [#8]
Problems i had with things like this was, i gave the .b3d a collision type, then did findchild(), and i had to set collisions for every child i found also. Make sure that's not whats also getting you :o)