Collisions not working

Blitz3D Forums/Blitz3D Programming/Collisions not working

I have got sprites for bullets, yet colisions are not being registered for them.

nfortnately, my code is all broken up as included subroutines, and it's all very type-based so it's not easy to post.

In short, I have set EntityPickMode to 1 for all the objects including my bullets. I have increased the EntityRadius too.

Any ideas? I am happy to provide whatever info may be required.

Check your EntityType and Collision declarations.

EntityPickMode is irrelevant for collisions, only for picking (eg. CameraPick, LinePick.) To setup collisions you need to assign EntityType.

EntityType is set correctly (I am sure)

bullets=Type 3
planets,stars and asteroids =Type 7,8,9
here is some code that I have taken from my program:


; Fire Bullet
.Bullet_Fire

;limit fire-rate
If (MilliSecs()-fire_rate)<bullet_recharge Then Return

PlaySound primarysound
fire_rate=MilliSecs()

NewBullet.Ship_Bullet = New Ship_Bullet
Newbullet\x#=EntityX#(ship)
Newbullet\y#=EntityY#(ship)
Newbullet\z#=EntityZ#(ship)
Newbullet\range=gun_range
Newbullet\bullet_sprite=CopyEntity (bullet)

EntityType newbullet\bullet_sprite,3

EntityRadius Newbullet\bullet_sprite,0.4,0.4
EntityPickMode Newbullet\bullet_sprite,3,0 
PositionEntity newbullet\bullet_sprite,newbullet\x#,newbullet\y#,newbullet\z# 
EntityType Newbullet\bullet_sprite,3 

shipp#=EntityPitch#(ship)
shipy#=EntityYaw#(ship)
shipr#=EntityRoll#(ship)
RotateEntity newbullet\bullet_sprite,shipp,shipy,shipr

EntityRadius newbullet\bullet_sprite,10,10
EntityPickMode newbullet\bullet_sprite,1

Return

;Bullet Collisions and movement

.Bullet_Coll

For ThisBullet.Ship_Bullet = Each Ship_Bullet

If thisbullet\range<1 Then FreeEntity thisbullet\bullet_sprite:Delete thisbullet:Exit

MoveEntity thisbullet\bullet_sprite,0,0,bullet_speed
Thisbullet\range=thisbullet\range-(bullet_speed) 

If CountCollisions(thisbullet\bullet_sprite)>0
Gosub Bullet_Collide
Exit
EndIf
Next

Return


.Bullet_collide

;Check collision with Stars

If EntityCollided (thisbullet\bullet_sprite,8)>0
Gosub create_new_impact
Return
EndIf

;Check collision with Planets

If EntityCollided (thisbullet\bullet_sprite,9)>0
Gosub create_new_impact
Return
EndIf


;Check collision with Roids

If EntityCollided (thisbullet\bullet_sprite,7)>0
Gosub create_new_impact
Return
EndIf

; (Create new impact)







.create_new_impact

NewImpact.Impact_explosion = New impact_explosion
Newimpact\sprite=CreateSprite()
ScaleSprite newimpact\Sprite,10,10
PaintEntity newimpact\sprite,impact_brush
newimpact\PosX=EntityX(thisbullet\bullet_sprite)
newimpact\PosY=EntityY(thisbullet\bullet_sprite)
newimpact\PosZ=EntityZ(thisbullet\bullet_sprite)
newimpact\AnimFrame=0
FreeEntity thisbullet\bullet_sprite
Delete thisbullet
Return



.impact_Anims

For Impacts.impact_explosion=Each Impact_Explosion
impacts\AnimFrame=(impacts\AnimFrame)+1
If impacts\AnimFrame>6 
FreeEntity impacts\Sprite 
Delete impacts 
Exit
EndIf
BrushTexture impact_brush,impact_texture,impacts\Animframe
PaintEntity impacts\Sprite,impact_brush
Next
Return


Global sunlight=CreateLight(2)
LightRange sunlight,10000
LightConeAngles sunlight,0,359

sectorfile=OpenFile("Libraries\Sectors"+sector$+"\Objects.DAT")
ambient_red=ReadLine (SectorFile)
ambient_green=ReadLine (SectorFile)
ambient_blue=ReadLine (SectorFile)

LightColor sunlight,ambient_red+15,ambient_green+10,ambient_blue+5

AmbientLight ambient_red,ambient_green,ambient_blue

Faction$=ReadLine(sectorFile)

max_stars=ReadLine (SectorFile)

For sf = 1 To max_stars 

setup_star.sector_star = New sector_star 
setup_star\name$=ReadLine (SectorFile)
setup_star\class$=ReadLine (SectorFile)
setup_star\PosX=ReadLine (SectorFile)
setup_star\PosY=ReadLine (SectorFile)
setup_star\PosZ=ReadLine (SectorFile)
setup_star\ScaleX=ReadLine (SectorFile)
setup_star\ScaleZ=ReadLine (SectorFile)
setup_star\Sprite=LoadSprite("Visual\Sectors"+sector$+"\S"+sf+".bmp")
SpriteViewMode setup_star\sprite,1
ScaleSprite setup_star\sprite,setup_star\ScaleX,setup_star\ScaleZ
PositionEntity setup_star\sprite,setup_star\posX,setup_star\PosY,setup_star\PosZ
PositionEntity sunlight,setup_star\posX,setup_star\PosY,setup_star\PosZ

NameEntity setup_star\Sprite,"Star"

EntityType setup_star\sprite,8

EntityRadius setup_star\Sprite,setup_star\ScaleX,setup_star\ScaleZ
EntityPickMode setup_star\sprite,1

 Next 



max_planets=ReadLine (SectorFile)

For pf = 1 To max_planets 

setup_planet.sector_planet = New sector_planet 
setup_planet\name$=ReadLine (SectorFile)
setup_planet\Class$=ReadLine (SectorFile)
setup_planet\PosX=ReadLine (SectorFile)
setup_planet\PosY=ReadLine (SectorFile)
setup_planet\PosZ=ReadLine (SectorFile)
setup_planet\ScaleX=ReadLine (SectorFile)
setup_planet\ScaleY=ReadLine (SectorFile)
setup_planet\ScaleZ=ReadLine (SectorFile)
ringed=ReadLine (sectorfile)

setup_planet\Texture=LoadTexture("Visual\Sectors"+sector$+"\P"+pf+"Text.jpg",9)

setup_planet\mesh=CreateSphere(50)

PositionEntity setup_planet\mesh,setup_planet\posX,setup_planet\posY,setup_planet\posZ
EntityTexture setup_planet\mesh,setup_planet\texture
EntityShininess setup_planet\mesh,0.4
ScaleMesh setup_planet\mesh,setup_planet\scaleX,setup_planet\scaleY,setup_planet\scaleZ

If ringed=1
setup_planet\ring_sprite=LoadSprite("Visual\Sectors"+sector$+"\P"+pf+"Ring.jpg")
SpriteViewMode setup_planet\ring_sprite,2
EntityFX setup_planet\ring_sprite,16
EntityAlpha setup_planet\ring_sprite,0.9
ScaleSprite setup_planet\ring_sprite,setup_planet\scaleX*2,setup_planet\ScaleZ*4
PositionEntity setup_planet\ring_sprite,setup_planet\posX,setup_planet\posY,setup_planet\posZ
TurnEntity setup_planet\ring_sprite,90,0,0
EntityParent setup_planet\ring_sprite,setup_planet\mesh
EndIf

atmosphere=ReadLine (SectorFile)

If atmosphere=1
setup_planet\atmos_sprite=LoadSprite("Visual\Images\Jet.jpg",11)
EntityAlpha setup_planet\atmos_sprite,0.8
EntityFX setup_planet\atmos_sprite,29
SpriteViewMode setup_planet\atmos_sprite,3
ScaleSprite setup_planet\atmos_sprite,setup_planet\scaleX*1.5,setup_planet\ScaleZ*1.5
PositionEntity setup_planet\atmos_sprite,setup_planet\posX,setup_planet\posY,setup_planet\posZ
EntityParent setup_planet\atmos_sprite,setup_planet\mesh
EndIf

NameEntity setup_planet\Mesh,"Planet"

EntityType setup_planet\mesh,9

EntityRadius setup_planet\mesh,setup_planet\ScaleX,setup_planet\ScaleZ
EntityPickMode setup_planet\mesh,1

Next


max_roids=ReadLine (SectorFile)

For rf = 1 To max_roids

setup_roid.sector_roid=New sector_roid

composition=50
setup_roid\ice=Rnd(0,70)
composition=composition-(setup_roid\ice)
setup_roid\construction_minerals=Rnd(0,composition)
composition=composition-(setup_roid\construction_minerals)
setup_roid\precious_metals=Rnd(0,composition)
composition=composition-(setup_roid\precious_metals)
setup_roid\hydrocarbons=Rnd(0,composition)
composition=composition-(setup_roid\hydrocarbons)
setup_roid\radioactives=Rnd(0,composition)
composition=composition-(setup_roid\radioactives)
setup_roid\debris=composition+30
roid_seg=Rand(3,9)
setup_roid\mesh=CreateSphere(roid_seg)
roidtxt$=Rand(1,4)
setup_roid\texture=LoadTexture("Visual\3D\roid"+roidtxt$+"txt.bmp")

setup_roid\PosX=Rnd(-50000,50000)
setup_roid\PosY=Rnd(-10000,10000)
setup_roid\PosZ=Rnd(-50000,50000)

PositionEntity setup_roid\mesh,setup_roid\posX,setup_roid\PosY,setup_roid\PosZ

scalerX#=Rnd(1,15)
scalerY#=Rnd(1,15)
scalerZ#=Rnd(1,15)
ScaleEntity setup_roid\mesh,scalerX#,scalerY#,scalerZ#

EntityType setup_roid\mesh,7

EntityRadius setup_roid\mesh,ScalerX,ScalerZ
EntityPickMode setup_roid\mesh,1

EntityTexture setup_roid\mesh,setup_roid\texture

setup_roid\name$="Asteroid "+rf+(setup_roid\ice+setup_roid\posX)

NameEntity setup_roid\mesh,"Asteroid"

Next



max_objects=ReadLine (SectorFile)

For bf=1 To max_objects

setup_object.sector_object=New sector_object

setup_object\name$=ReadLine (SectorFile)
setup_object\class$=ReadLine (SectorFile)
setup_object\scaleX=ReadLine (SectorFile)
setup_object\scaleY=ReadLine (SectorFile)
setup_object\ScaleZ=ReadLine (SectorFile)
setup_object\PosX=ReadLine (SectorFile)
setup_object\PosY=ReadLine (SectorFile)
setup_object\PosZ=ReadLine (SectorFile)
setup_object\mesh=LoadMesh("Visual\3d"+setup_object\class$+".b3d")
setup_object\texture=LoadTexture("Visual\3d"+setup_object\class$+"txt.bmp")
setup_object\RotX#=ReadLine (SectorFile)
setup_object\RotY#=ReadLine (SectorFile)
setup_object\RotZ#=ReadLine (SectorFile)
setup_object\Shield=ReadLine (SectorFile)
setup_object\Hull=ReadLine (SectorFile)
setup_object\Friend_or_foe=ReadLine (SectorFile)
setup_object\Dock_Here=ReadLine (SectorFile)
PositionEntity setup_object\mesh,setup_object\posX,setup_object\PosY,setup_object\PosZ
ScaleEntity setup_object\mesh,setup_object\scaleX,setup_object\scaleY,setup_object\scaleZ

NameEntity setup_object\mesh,"Construction"

EntityType setup_object\mesh,10

EntityTexture setup_object\mesh,setup_object\texture

EntityRadius setup_object\mesh,ScaleX,ScaleZ
EntityPickMode setup_object\mesh,1


 Next

CloseFile sectorfile

skyboxt=LoadTexture("Visual\Sectors"+sector$+"\box.bmp",11)
skybox1=CreateSphere(30)
FlipMesh skybox1
EntityTexture skybox1,skyboxt
ScaleEntity skybox1,15,15,15
EntityOrder skybox1,1
EntityAlpha skybox1,0.5


For collision_value=8 To 11

For check_roid_Collisions.sector_roid=Each sector_roid

If EntityCollided (check_roid_Collisions\mesh,11) >0
FreeEntity check_roid_Collisions\mesh
Delete check_roid_Collisions
EndIf

Next

Next














Have you used the Collisions command to establish collision relationships between types?

Do you have UpdateWorld in your main loop? Kind of a "duh!" thing but I've forgotten a few times myself.

Have you used the Collisions command to establish collision relationships between types?
------------------------------

In what way?
I have used EntityCollided and CountCollisions is that enough?






Do you have UpdateWorld in your main loop? Kind of a "duh!" thing but I've forgotten a few times myself.
-------------------------------------------

Yeah - Ive learnt that from previous mistakes :)

Collisions src_type,dest_type,method,response
Parameters
src_type - entity type to be checked for collisions.
dest_type - entity type to be collided with.

method - collision detection method.
1: ellipsoid-to-ellipsoid collisions
2: ellipsoid-to-polygon collisions
3: ellipsoid-to-box collisions

response - what the source entity does when a collision occurs.
1: stop
2: slide1 - full sliding collision
3: slide2 - prevent entities from sliding down slopes

Oh of course! I can't believeI haven't put that in!

Doing it now! Thanks :)

Does the source and destination matter?

for instance a ship can fly into a bullet the same as a bullet can be fired at and hit a ship.

The same collision will occr, but would I need to record it twice or would 2 collisions be registered then?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Okay, the collisions have made my ship stop when it hits an asteroid (which is good), but my bullet sprites still aren't registering...

The source will always be a ellipsoid, and the source will slide/stop on the target..

Okay, well all my collisions will have a response of STOP so that's no problem.

I still don't know why my sprites don't collide though...

Little *bump...*

Sorry, but has anyone got any ideas? the collisions just aren't recorded for sprites :(

You seem to be applying an EntityRadius for your bullet sprites which is good but are you sure you have setup the appropriate collisions of bullet-whatever?

I think so: here's all the collision code relevant to my bullets:

[code]

For coll_dest=1 To 15

Collisions,3,coll_dest,1,1

Next

NewBullet.Ship_Bullet = New Ship_Bullet
Newbullet\x#=EntityX#(ship)
Newbullet\y#=EntityY#(ship)
Newbullet\z#=EntityZ#(ship)
Newbullet\range=gun_range
Newbullet\bullet_sprite=CopyEntity (bullet)

PositionEntity newbullet\bullet_sprite,newbullet\x#,newbullet\y#,newbullet\z#
EntityType Newbullet\bullet_sprite,3

shipp#=EntityPitch#(ship)
shipy#=EntityYaw#(ship)
shipr#=EntityRoll#(ship)
RotateEntity newbullet\bullet_sprite,shipp,shipy,shipr

EntityRadius newbullet\bullet_sprite,10,10
EntityPickMode newbullet\bullet_sprite,1

Return

;Bullet Collisions and movement

.Bullet_Coll

For ThisBullet.Ship_Bullet = Each Ship_Bullet

If thisbullet\range<1 Then FreeEntity thisbullet\bullet_sprite:Delete thisbullet:Exit

MoveEntity thisbullet\bullet_sprite,0,0,bullet_speed
Thisbullet\range=thisbullet\range-(bullet_speed)

If CountCollisions(thisbullet\bullet_sprite)>0
Gosub Bullet_Collide
Exit
EndIf
Next

Return


.Bullet_collide

;Check collision with Stars

If EntityCollided (thisbullet\bullet_sprite,8)>0
Gosub create_new_impact
Return
EndIf

;Check collision with Planets

If EntityCollided (thisbullet\bullet_sprite,9)>0
Gosub create_new_impact
Return
EndIf


;Check collision with Roids

If EntityCollided (thisbullet\bullet_sprite,7)>0
Gosub create_new_impact
Return
EndIf

; (Create new impact)

.create_new_impact

NewImpact.Impact_explosion = New impact_explosion
Newimpact\sprite=CopyEntity(Impact_gen_Sprite)
ScaleSprite newimpact\Sprite,10,10
PaintEntity newimpact\sprite,impact_brush
newimpact\PosX=EntityX(thisbullet\bullet_sprite)
newimpact\PosY=EntityY(thisbullet\bullet_sprite)
newimpact\PosZ=EntityZ(thisbullet\bullet_sprite)
newimpact\AnimFrame=0
FreeEntity thisbullet\bullet_sprite
Delete thisbullet
Return

Does your .bullet_collide sub ever get called?

Check by putting STOP after .bullet_collide and running in debug mode.

Finally sussed it.

Sorry for wasting your time, peeps!

It was complicated, because Im fairly new to Types and Collisions and I am using both here.

What happened was that I wanted to make animated sprite explosions when the bullets hit anything. I had based the animated sprites on a CreateSprite with 0,0,0 colour. So even though I textured it, it was still utterly transparent.

This was reason 1 why my collisions didnt 'look' like they worked.

Also, for some reason, I had two sets of entity radius command for my ship bullets. Although I wouldnt expect it to matter so long as the latest one was correct, but somehow it DID affect it.

Plus I needed to change the entityorder for my explosions.

The other reason why I didnt notice collisions is because they are only noticed each UpdateWorld, and reset. If you aren't checking EVERY UpdateWorld for collisions, they can be missed.