示例#1
0
class ProjectilePie(DirectObject):
    def __init__(self, collideEventName, parent, pie, endPos, gravityMult,
                 duration, local, turretClass):
        self.turret = turretClass
        self.collideEventName = collideEventName
        self.pieNp = NodePath('pieNP')
        self.pieNp.reparentTo(parent)
        self.pieNp.setScale(render, 1)
        self.pieNp.setPos(endPos)
        self.pieNp.setHpr(90, -90, 90)

        self.pie = pie
        if local:
            self.pieCollisions()
        self.pie.setScale(self.pie.getScale(render))
        self.pie.setPos(self.pie.getPos(render))
        self.pie.reparentTo(render)
        self.pie.setHpr(self.pieNp.getHpr(render))

        self.trajectory = ProjectileInterval(self.pie,
                                             startPos=self.pie.getPos(render),
                                             endPos=self.pieNp.getPos(render),
                                             gravityMult=gravityMult,
                                             duration=duration,
                                             name='projectilePieTraj' +
                                             str(id(self)))
        self.trajectory.setDoneEvent(self.trajectory.getName())
        self.acceptOnce(self.trajectory.getDoneEvent(), self.handleTrajDone)
        self.trajectory.start()
        sfx = base.localAvatar.audio3d.loadSfx(
            "phase_4/audio/sfx/MG_cannon_fire_alt.mp3")
        base.localAvatar.audio3d.attachSoundToObject(sfx, parent)
        base.playSfx(sfx)

        if local:
            self.acceptOnce('projectilePieSensor' + str(id(self)) + '-into',
                            self.handleCollision)

    def pieCollisions(self):
        pss = CollisionSphere(0, 0, 0, 1)
        psnode = CollisionNode('projectilePieSensor' + str(id(self)))
        psnode.add_solid(pss)
        self.psnp = self.pie.attach_new_node(psnode)
        self.psnp.set_collide_mask(BitMask32(0))
        self.psnp.node().set_from_collide_mask(CIGlobals.WallBitmask
                                               | CIGlobals.FloorBitmask)

        event = CollisionHandlerEvent()
        event.set_in_pattern("%fn-into")
        event.set_out_pattern("%fn-out")
        base.cTrav.add_collider(self.psnp, event)

    def handleCollision(self, entry):
        messenger.send(self.collideEventName, [entry, self])

    def handleTrajDone(self):
        self.cleanup()

    def cleanup(self):
        self.ignore(self.trajectory.getDoneEvent())
        self.trajectory.finish()
        del self.trajectory
        if self.turret.piesInFlight:
            self.turret.piesInFlight.remove(self)
        self.ignore('projectilePieSensor' + str(id(self)) + '-into')
        del self.collideEventName
        if hasattr(self, 'psnp'):
            self.psnp.removeNode()
            del self.psnp
        self.pie.removeNode()
        del self.pie
        del self.pieNp
        del self.turret