bullet mode help
Blitz3D Forums/Blitz3D Programming/bullet mode help
| ||
i created a nice little function that makes either bullets or missles but when i check the mode value it always seams to crash but only if i'm near a collidable object such as a spaceship if i'm not near an object it just doesn't create a bullet. i call the function using fire(1,1) for a laser and fire(1,2) for a missle. i have read through it once and there doesn,t seem to be any big problems with the code but i might have missed something.
Function fire(src,mode=1)
If src=1 And mode=1
For p.player=Each player
LinePick EntityX(p\piv),EntityY(p\piv),EntityZ(p\piv),0,0,-1000
If PickedEntity>0
PositionEntity p\apiv,PickedX(),PickedY(),PickedZ()
Else
PositionEntity p\apiv,0,0,-100
MoveEntity p\apiv,0,0,-10000
End If
pnum=1-pnum
If pnum=1
q=p\fpiv1
Else q=p\fpiv2
End If
b.bullet=New bullet
b\ent=CreateCube(q);LoadSprite("media\laser1.bmp",4,q)
b\mode=1
b\x=0
b\y=0
b\z=0
PointEntity b\ent,p\apiv
EntityParent b\ent,0
EntityType b\ent,lazer
Next
ElseIf src=1 And mode=2
For p.player=Each player
If p\missle>0
p\missle=p\missle-1
b.bullet=New bullet
b\ent=CreateCube(p\ent)
b\mode=2
b\x=0
b\y=0
b\z=0
ScaleEntity b\ent,15,15,15
PointEntity b\ent,p\apiv
EntityParent b\ent,0
EntityType b\ent,lazer
End If
Next
Else If src=2
For e.enemy=Each enemy
If e\firing=1
b.bullet=New bullet
b\ent=LoadSprite("media\laser2.bmp",4,e\ent)
b\x=0
b\y=0
b\z=0
PointEntity b\ent,e\apiv
EntityParent b\ent,0
EntityType b\ent,lazer
End If
Next
End If
End Function
Function updatefire()
For b.bullet=Each bullet
For e.enemy=Each enemy
If b\mode=1
MoveEntity b\ent,0,0,-1
If EntityCollided (e\ent,lazer)
FreeEntity b\ent
Delete b
e\hp=e\hp-10
End If
ElseIf b\mode=2
MoveEntity b\ent,0,0,1
If EntityCollided (e\ent,lazer)
FreeEntity b\ent
Delete b
e\hp=e\hp-100
End If
End If
Next
Next
End Function
|
| ||
| i tested it a little more. it loads everything fine but for some reason does not create a whole new instance of the bullet. |
| ||
| i don't see why it shouldn't. your main problem is the parenting. unparent the bullet, you don't want it to turn when the player turns, do you ;-) |
| ||
i unparent the bullet with EntityParent b\ent,0so thats not the problem. i can't seem to make any of this work. it has to do with the bullets bieng unofficaly nulled. |
| ||
| When I've dealt with deleting types in the past and freeing entities and such, I've never had any luck unless i do it this way: 1) for whatever type you need to kill off, such as bullet, add a field called 'die'. 2) in your main loops, if an instance of that type is ready to be killed off, set it's 'die' field to true (b\die = true) 3) finally, at the very end of your main loop in a separate for / each loop, check to see if any of your instances "b\die = true" and if so, free their entities and delete them then... just be sure to free the entities first, then delete the type. here's some pseudo code:
Type bullet
field entity
field die
end type
while not keyhit(1)
;main update loop
for b.bullet = each bullet
;move it, shoot it, etc.
next
for b.bullet = each bullet
if b\die = true
freeentity(b\entity)
delete b
endif
next
wend
Anyway, give that a shot and see if it helps. Not sure why it never seems to work the other way, but that's usually how i end up having to use it. cheers, roland |
| ||
| i fixed it mostly. i rewrote it with the differing types of bullets as there own seperate type list. heres the fix. ignore the explosion function but anyway it seems to ignore the if m<> null check and gives me the error when the bullets collide with the saucers. <edit> i fixed all the problems and will most likly give it to the community as an example. |