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. |