コード例 #1
0
class PowerupManager:
    #Max number of each powerup
    MAX_COUNT = 2
    POWERUP_RESET_TIME = 10

    def __init__(self, main, actor):
        self.actor = actor
        self.powerupViews = {}
        self.takenPowers = []
        self.activePowers = []
        self.main = main
        self.cManager = main.cManager
        self.Audio = Audio(self)

        powerupTypes = PowerupTypes()
        self.powerupPositions = PowerupPositions().positions

        pwrKey = 1
        instanceCount = 0
        for posKey in self.powerupPositions.keys():
            if instanceCount >= PowerupManager.MAX_COUNT:
                instanceCount = 0
                pwrKey += 1
            posValue = self.powerupPositions[posKey]
            pwrVal = powerupTypes.list[pwrKey]
            posValue["item"] = pwrVal
            self.powerupPositions[posKey] = posValue
            powerUpView = PowerupIcon(self.main, posValue)
            self.powerupViews[posKey] = powerUpView
            if posKey not in self.activePowers:
                self.activePowers.append(posKey)
            instanceCount += 1
            #print "posValue", posValue

    def createPowerup(self, powerupInfo):
        if (powerupInfo['item']['name'] == "SHIELD"):
            return ShieldPowerup(self, powerupInfo)
        elif(powerupInfo['item']['name'] == "BOOST"):
            return BoostPowerup(self, powerupInfo)
        elif(powerupInfo['item']['name'] == "INVINCIBLE"):
            return InvinciblePowerup(self, powerupInfo)
        elif(powerupInfo['item']['name'] == "HEALTH"):
            return HealthPowerup(self, powerupInfo)
    
    def setActors(self, actors):
        self.actors = actors

    def checkPowerPickup(self, task):
        powerObtain = self.powerPickup(self.main.vehicleContainer, self.main.vehicleContainer.chassisNP.getPos(), 1)#actor.actorRadius)
        
        # if powerObtain != 0:
        #     self.handlePowerups(powerObtain)
        return task.cont

    def obtainPowerups(self, powerObtain):
        #print self.powerupPositions[powerObtain]['item']['name']
        if self.powerupPositions[powerObtain]['item']['name'] == "SHIELD":
            self.actor.props.armor += self.powerupPositions[powerObtain]['item']['rating']
            #print "New Armor: ", self.actor.props.armor
            if self.actor.props.armor > self.actor.props.constants.MAX_ARMOR[self.actor.props.type]:
                self.actor.props.armor = self.actor.props.constants.MAX_ARMOR[self.actor.props.type]
            self.main.cManager.sendRequest(Constants.CMSG_HEALTH, self.actor.props.getHitPoint())

        if self.powerupPositions[powerObtain]['item']['name'] == "HEALTH":
            self.actor.props.health += self.powerupPositions[powerObtain]['item']['rating']
            #print "New Health: ", self.actor.props.health
            if self.actor.props.health > self.actor.props.constants.MAX_HEALTH[self.actor.props.type]:
                self.actor.props.health = self.actor.props.constants.MAX_HEALTH[self.actor.props.type]
            self.main.cManager.sendRequest(Constants.CMSG_HEALTH, self.actor.props.getHitPoint())

        if self.powerupPositions[powerObtain]['item']['name'] == "BOOST":
            if self.actor.boostCount < 3:
                self.actor.boostCount += 1

        if self.powerupPositions[powerObtain]['item']['name'] == "INVINCIBLE":
            #print "INVINCIBLE"
            self.actor.props.isInvincible = True
            killInvinsibility = threading.Thread(target=self.resetInvinsibility, args=(powerObtain,))
            killInvinsibility.start()

    def powerPickup(self, actor, actorPos, actorRadius):
        powerObtained = 0
        for posKey in self.powerupPositions.keys():
            powerUp = self.powerupPositions[posKey]
            if (math.pow((actorPos.x - powerUp['x']), 2) + math.pow((actorPos.y - powerUp['y']), 2) + math.pow((actorPos.z - powerUp['z']), 2)
                    <= math.pow(actorRadius, 2)):
                powerObtained = powerUp['id']
                if powerObtained in self.activePowers:
                    self.activePowers.remove(powerObtained)
                    if powerObtained not in self.takenPowers:
                        self.takenPowers.append(powerObtained)
                    self.cManager.sendRequest(Constants.CMSG_POWER_UP, powerUp['id'])
                    self.Audio.play_powerup()
                    # print "powerObtained: ", powerObtained
                    self.resetPowerupsTask(powerObtained)
                break

        return powerObtained

    def resetPowerupsTask(self, powerupId, pickup=False):
        processThread = threading.Thread(target=self.resetPowerup, args=(powerupId,))
        #Remove powerup from available list and add to taken list
        if powerupId in self.activePowers:
            self.activePowers.remove(powerupId)
        if powerupId not in self.takenPowers:
            self.takenPowers.append(powerupId)
        powerView = self.powerupViews[powerupId]
        powerView.removeFromField()
        processThread.start()
        if pickup:
            self.obtainPowerups(powerupId)

    def resetPowerup(self, powerupId):
        time.sleep(PowerupManager.POWERUP_RESET_TIME)
        #print self.takenPowers.get(powerupId)
        if powerupId not in self.activePowers:
            self.activePowers.append(powerupId)
        if powerupId in self.takenPowers:
            self.takenPowers.remove(powerupId)
        powerView = self.powerupViews[powerupId]
        powerView.returnToField()
        #print self.activePowers
        #print self.takenPowers

    def resetInvinsibility(self, powerupId):
        time.sleep(self.powerupPositions[powerupId]['item']['time'])
        self.actor.props.isInvincible = False