Shooter

Blitz3D Forums/Blitz3D Programming/Shooter

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

I can't get my bullet-Enemy collision working. I'm trying to get it to delete the enemy and delete the bullet when they collide.
Graphics3D 1280,1024,32

AppTitle "Gun Shooter"

Collisions 1,2,2,2

SetBuffer BackBuffer()

Type BulletType
	Field mesh
End Type

Type EnemyType
	Field mesh
End Type

Global player = CreatePivot()
PositionEntity player,0,1,1
EntityRadius player,.6
EntityType player,1

camera = CreateCamera( player )
CameraRange camera,.1,200

light = CreateLight()
LightColor light,32,32,32
TurnEntity light,45,45,0

Sight = LoadImage("Sight.bmp")
Global GunFire = LoadSound("gunfire.wav")
Gun = LoadMesh("Weapons\SWATRifle.3ds",player)
Global EnemyMesh = CreateCube()
Global BulletMesh = LoadMesh("Weapons\Bullet.3ds")

EntityType BulletMesh,3

HideEntity BulletMesh

Levels = OpenFile("Levels.dat")

ReadLine(Levels)

leveloc$ = ReadLine$(Levels)

Levelfile = OpenFile("Levels" + leveloc)

LevelType$ = ReadLine$(Levelfile)

If LevelType$ = "Terrain" Then
	Pos = FilePos(Levelfile)
	Level = LoadTerrain("Levels" + ReadLine(Levelfile))
	SeekFile(Levelfile,pos)
	terrain = LoadImage("Levels" + ReadLine(Levelfile))
	tex = LoadTexture("Levels" + ReadLine(LevelFile))
	EntityTexture Level,tex
ElseIf LevelType$ = "Maplet" Then
	Level = LoadMesh("Levels" + ReadLine(LevelFile))
Else
	RuntimeError "Invalid Level Type Code: L295"
EndIf

For i = 1 To 10 
	EnemyType.EnemyType = New EnemyType
	EnemyType\mesh = CopyMesh(EnemyMesh)
	EntityType EnemyType\mesh,4
Next

;CameraFogMode camera,1

;CameraFogColor camera,255,255,255

;CameraFogRange camera,1,10

If Level = 0 RuntimeError "File: 'L1Field.jpg' not found"

If GunFire = 0 Then
	RuntimeError "File: '9mm.wav' not found"
EndIf

ScaleEntity Gun,0.9999,0.9999,0.9999

SoundVolume GunFire,1
MaskImage Sight,255,255,255
MidHandle Sight

For EnemyType.EnemyType = Each EnemyType
	If LevelType$ = "Terrain" Then
		PositionEntity EnemyType\mesh,Rand(0,ImageWidth(terrain)),0,Rand(0,ImageHeight(terrain))
	ElseIf LevelType$ = "Maplet
		PositionEntity EnemyType\mesh,Rand(0,MeshWidth(Level)),0,Rand(0,MeshHeight(Level))
	EndIf
Next

FreeImage terrain

LoadSkyBox("World")

MoveEntity Gun,.1,-.1,0

EntityFX Level,1
EntityType Level,2

sp# = .05
ey# = EntityY(player)

PositionEntity Gun,EntityX(player) + .3,EntityY(player) - 1,EntityZ(player) - 1

;WireFrame True

While Not KeyHit(1)

	yv# = EntityY(player) - ey
	ey = EntityY(player)
	
	If KeyHit(57) yv=.1
	
	If sp# = .05 And KeyHit(42) Or KeyHit(54) Then
		sp# = 1
	ElseIf sp# = 1 And KeyHit(42) Or KeyHit(54) Then
		sp# = .05
	EndIf
	
	MoveEntity player,0,yv-.005,0
	
	If KeyDown(30)
		TurnEntity camera,-2,0,0
		TurnEntity Gun,-2,0,0
	EndIf
	
	If KeyDown(44)
		TurnEntity camera,+2,0,0
		TurnEntity Gun,+2,0,0
	EndIf
	
	If KeyDown(203) TurnEntity player,0,2,0
	If KeyDown(205) TurnEntity player,0,-2,0
	
	If KeyDown(200) MoveEntity player,0,0,sp
	If KeyDown(208) MoveEntity player,0,0,-sp
	
	RotateEntity Gun,EntityPitch(player),0,0
	
	If KeyHit(156)
		PointEntity player,Gun
	EndIf
	
	If MouseDown(1)
		bulletType.BulletType = New BulletType
		bulletType\mesh = CopyMesh(bulletMesh)
		RotateEntity BulletType\mesh,EntityPitch(player,1),EntityYaw(player,1),EntityRoll(player,1)
		PlaySound GunFire
		PositionEntity BulletType\Mesh,EntityX(player) - .1,EntityY(player) - .134,EntityZ(player) - .8
		EntityType BulletType\Mesh,3
	EndIf
	
	TurnEntity player,0,-MouseXSpeed(),0
	;TurnEntity player,MouseYSpeed(),0,0
	
	UpdateWorld
	RenderWorld
	
	Locate 0,0
	;Print TrisRendered()
	
	DrawImage Sight,GraphicsWidth() / 2,GraphicsHeight() / 2
	
	For biter.BulletType = Each BulletType
		MoveEntity biter\mesh,0,0,1
		If Abs(EntityX(biter\mesh,1)) > 1000
			FreeEntity biter\mesh
			Delete biter
		ElseIf Abs(EntityY(biter\mesh,1)) > 1000
			FreeEntity biter\mesh
			Delete biter
		ElseIf Abs(EntityZ(biter\mesh,1)) > 1000
			FreeEntity biter\mesh
			Delete biter
		EndIf
	Next
	
	For EnemyType.EnemyType = Each EnemyType
		For biter.BulletType = Each BulletType
			If EntityCollided(biter\mesh,3) = EnemyType\mesh Then
				FreeEntity EnemyType\mesh
				FreeEntity Biter\mesh
				Delete EnemyType
				Delete biter
			EndIf
		Next
	Next
	
	Color 0,0,0
	Locate 0,0
	Print EntityDistance(player,Gun)
	
	Flip
Wend

FreeEntity Level
FreeEntity Gun
FreeEntity Camera
FreeEntity Bullet
FreeEntity player
FreeEntity light
FreeImage Sight
FreeSound GunFire
FreeTexture tex
CloseFile Levels
CloseFile Levelfile

For bulletType.BulletType = Each BulletType
	FreeEntity bulletType\mesh
	Delete bulletType
Next

For EnemyType.EnemyType = Each EnemyType
	FreeEntity EnemyType\mesh
	Delete EnemyType
Next

End

Function CreateTree(file$,width#,Height)

tree = CreateMesh()
surf1 = CreateSurface(tree)

v0 = AddVertex(surf1,-1.0,-1.0,0,0,0)
v1 = AddVertex(surf1,1.0,-1.0,0,1,0)
v2 = AddVertex(surf1,1.0,1.0,0,1,0)
v3 = AddVertex(surf1,-1.0,1.0,0,0,1)

tri0 = AddTriangle(surf1,v0,v1,v2)
tri1 = AddTriangle(surf1,v0,v2,v3)

v4 = AddVertex(surf1,-1.0,0,-1.0,0,0)
v5 = AddVertex(surf1,1.0,0,-1.0,1,0)
v6 = AddVertex(surf1,1.0,0,1.0,1,1)
v7 = AddVertex(surf1,-1.0,0,1.0,0,1)

tri2 = AddTriangle(surf1,v4,v5,v6)
tri3 = AddTriangle(surf1,v4,v6,v7)

UpdateNormals tree

tex = LoadBrush(file$,4) ; using masked flag (4)

PaintMesh tree,tex

EntityFX tree,16 ; make visible from both sides

Return tree

End Function 

Function LoadSkyBox( file$ )
	m=CreateMesh()
	;front face
	b=CreateBrush(0,0,0)
	s=CreateSurface( m,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=CreateBrush(0,0,0)
	s=CreateSurface( m,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=CreateBrush(0,0,0)
	s=CreateSurface( m,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=CreateBrush(0,0,0)
	s=CreateSurface( m,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=CreateBrush(0,0,0)
	s=CreateSurface( m,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=CreateBrush(0,0,0)
	s=CreateSurface( m,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 m,100,100,100
	FlipMesh m
	EntityFX m,1
	Return m
End Function

Function Mid3dHandle(mesh)
 ux#=-100000
 uy#=-100000
 uz#=-100000
 lx#=100000
 ly#=100000
 lz#=100000
 cs=CountSurfaces(mesh)
 For s=1 To cs
  surf=GetSurface(mesh,s)
  cv=CountVertices(surf)-1
  For v=0 To cv
   vx#=VertexX#(surf,v)
   vy#=VertexY#(surf,v)
   vz#=VertexZ#(surf,v)
   If vx#<lx# Then lx#=vx#
   If vx#>ux# Then ux#=vx#
   If vy#<ly# Then ly#=vy#
   If vy#>uy# Then uy#=vy#
   If vz#<lz# Then lz#=vz#
   If vz#>uz# Then uz#=vz#
  Next
 Next
 ax#=(ux#+lx#)/2
 ay#=(uy#+ly#)/2
 az#=(uz#+lz#)/2
 PositionMesh mesh,-ax#,-ay#,-az#
End Function