Exemplo n.º 1
0
  def __init__(self, settings, items, endCB, theme=themes.DefaultTheme,
               infos=dict(), *args, **kwargs):
      """
      Creates a new object. 
      @param parent: the parent gameElement to append to.
      """
      avg.DivNode.__init__(self, *args, **kwargs)
      
      if __debug__:
          self.space = DebugCrystalGameSpace()
      else:
          self.space = CrystalGameSpace()
      self.__touchNodeMapping = {}
      self.__shieldNodeMapping = {}
      self._playerCannons = []
      self._endCB = endCB
      self._theme = theme   
      self._generator = CrystalManager(items, settings.get("crystals", 3))#CrystalManager(items)
      self.timers = []
      self.playerColors = ["999900", "990000", "009900", "000099"]
      self._highscore = "0"
      self._touchPointRadius = min(self.size)/40
      self._structureStartRotationSpeed = settings.get("rotation_speed", 0)*0.01
      
      if settings.get("growing_speed", 23) != 0:
          self._structureFramesToGrowth = 60*60/settings.get("growing_speed", 23) 
          self._growIncrementPerPlayer = self._structureFramesToGrowth/2
      else:
          self._structureFramesToGrowth = float("inf")
          self._growIncrementPerPlayer = 0
      self._structureStartSize = 15 #
      self._stuctureShootFrequency = 10000/settings.get("shooting_speed", 1) if settings.get("shooting_speed", 1) != 0 else float("inf")
      self._helpSystem = HelpSystem(infos)   
 
      player = avg.Player.get()
      tickTimer = player.setOnFrameHandler(lambda:self.space.step(1 / 150.0))
      self.timers.append(tickTimer)
      
      player.getTestHelper().fakeKeyEvent(avg.KEYDOWN, 17, 116, "t", 116, 0)
      
      self._setBackground()
      self._interactionDiv = avg.DivNode(parent=self, size=self.size)
      self._interactionDiv.setEventHandler(avg.CURSORDOWN, avg.TOUCH, self.__touchDown)
      self.setEventHandler(avg.CURSORUP, avg.TOUCH, self.__touchUp)
    
      self._initBorders()
      self._players = self._initPlayers(self)
      self.structures = []
      self._initGameElements(self._interactionDiv)
Exemplo n.º 2
0
class ComeAndPlayGameNode(avg.DivNode):

    def __init__(self, settings, items, endCB, theme=themes.DefaultTheme,
                 infos=dict(), *args, **kwargs):
        """
        Creates a new object. 
        @param parent: the parent gameElement to append to.
        """
        avg.DivNode.__init__(self, *args, **kwargs)
        
        if __debug__:
            self.space = DebugCrystalGameSpace()
        else:
            self.space = CrystalGameSpace()
        self.__touchNodeMapping = {}
        self.__shieldNodeMapping = {}
        self._playerCannons = []
        self._endCB = endCB
        self._theme = theme   
        self._generator = CrystalManager(items, settings.get("crystals", 3))#CrystalManager(items)
        self.timers = []
        self.playerColors = ["999900", "990000", "009900", "000099"]
        self._highscore = "0"
        self._touchPointRadius = min(self.size)/40
        self._structureStartRotationSpeed = settings.get("rotation_speed", 0)*0.01
        
        if settings.get("growing_speed", 23) != 0:
            self._structureFramesToGrowth = 60*60/settings.get("growing_speed", 23) 
            self._growIncrementPerPlayer = self._structureFramesToGrowth/2
        else:
            self._structureFramesToGrowth = float("inf")
            self._growIncrementPerPlayer = 0
        self._structureStartSize = 15 #
        self._stuctureShootFrequency = 10000/settings.get("shooting_speed", 1) if settings.get("shooting_speed", 1) != 0 else float("inf")
        self._helpSystem = HelpSystem(infos)   
   
        player = avg.Player.get()
        tickTimer = player.setOnFrameHandler(lambda:self.space.step(1 / 150.0))
        self.timers.append(tickTimer)
        
        player.getTestHelper().fakeKeyEvent(avg.KEYDOWN, 17, 116, "t", 116, 0)
        
        self._setBackground()
        self._interactionDiv = avg.DivNode(parent=self, size=self.size)
        self._interactionDiv.setEventHandler(avg.CURSORDOWN, avg.TOUCH, self.__touchDown)
        self.setEventHandler(avg.CURSORUP, avg.TOUCH, self.__touchUp)
      
        self._initBorders()
        self._players = self._initPlayers(self)
        self.structures = []
        self._initGameElements(self._interactionDiv)
      
    def _setBackground(self):
        self._theme.GameBackGround(size=util.WINDOW_SIZE, parent=self)
        
    def _initBorders(self):
        corners = [(0, 0),
                   (0, util.WINDOW_SIZE[1]),
                   util.WINDOW_SIZE,
                   (util.WINDOW_SIZE[0], 0)]
        borders = [] 
        
        for a, b in zip(corners, itertools.chain(corners[1:], corners[:1])):
                a, b = a, b
                borderBody = pymunk.Body()
                shape = pymunk.Segment(borderBody, a, b, 10)
                shape.elasticity = 1
                shape.collision_type = BorderCollisionType
                self.space.add(shape)
                borders.append(borderBody)

    def _winCB(self, gameWon = False, showKeyboards=True):
        
        shadowNode = avg.DivNode(size = util.WINDOW_SIZE, parent = self.getParent())
        imageLeft = self._theme.getNode("LeftDoor")(size = util.WINDOW_SIZE,
                                                    pos=(-util.WINDOW_SIZE[0]/2, 0),
                                                    parent=shadowNode)
        imageRight = self._theme.getNode("RightDoor")(size = util.WINDOW_SIZE,
                                                      pos=(util.WINDOW_SIZE[0]/2, 0),
                                                      parent=shadowNode)
        
        def slideOutDoors():
            avg.LinearAnim(imageLeft, "pos", 1000, imageLeft.pos,
                           (-util.WINDOW_SIZE[0]/2, 0)).start()
            avg.LinearAnim(imageRight, "pos", 1000, imageRight.pos,
                           (util.WINDOW_SIZE[0]/2, 0), False, None,
                           lambda : shadowNode.unlink(True)).start()

        def doorsClosedCB():
            if not gameWon or not showKeyboards:
                avg.Player.get().setTimeout(750, slideOutDoors)
                if self._endCB is not None:
                    self._endCB(False, shadowNode)
                    self._endCB = None
            else:

                def finishedEntryCB(name):
                    self._namesToEnter -= 1
                    if self._namesToEnter == 0 and self._endCB is not None:  
                        self._endCB(False, shadowNode)
                        self._endCB = None
                        avg.Player.get().setTimeout(500, slideOutDoors)
                        
                self._makeKeyboards(finishedEntryCB, shadowNode)
 
        avg.LinearAnim(imageLeft, "pos", 1000, imageLeft.pos, (0,0)).start()
        avg.LinearAnim(imageRight, "pos", 1000, imageRight.pos, (0,0), False, None, doorsClosedCB).start()

    def _makeKeyboards(self, finishedCB, parent):
        self._namesToEnter = len(self._players)
        playerScores = []
        for player in self._players:
            playerScores.append(player.score)
        
        for player in self._players:
                
            hsen = HighscoreEntryNode(self._highscore, player.score, playerScores, finishedCB, parent=parent, size=(util.WINDOW_SIZE[0]//3,util.WINDOW_SIZE[0]//9))
            if player.angle < util.degToRad(45) or player.angle > util.degToRad(225):
                playerPos = player.pos[0], player.pos[1]- 165
            else:
                playerPos = player.pos[0], player.pos[1] + 15
            if player.angle < util.degToRad(135):
                playerPos = playerPos[0]-125, playerPos[1]
            else:
                playerPos = playerPos[0]-325, playerPos[1]
            hsen.angle = player.angle + math.pi/4
            hsen.pos=playerPos[0], playerPos[1]
    
    def _initGameElements(self, parent):  
        gameElement = CenterNodeStructure(radius=50,
                                          space=self.space,
                                          rotationSpeed=self._structureStartRotationSpeed,
                                          framesToGrowth= self._structureFramesToGrowth,
                                          startCrystals=self._structureStartSize,
                                          position=util.vectorMult(util.WINDOW_SIZE, 0.5),
                                          parent=parent,
                                          helpSystem=self._helpSystem,
                                          crystalManager=self._generator,
                                          )
       
        gameElement.depletedCallback = lambda: self._winCB(showKeyboards=False)
        gameElement.gameOverCallback = lambda: self._winCB(showKeyboards=False)
        self.structures.append(gameElement)
      
    def _initPlayers(self, parent):  
        players = []
        for x in (1,-1):
            for y in (1,-1):
                
                angle = ((x+1)/2)*math.pi + (abs(y+x)/2)*math.pi/2 
                xPos = util.WINDOW_SIZE[0]/2 + x*(util.WINDOW_SIZE[0]/2- util.WINDOW_SIZE[1]/8 )  
                yPos = util.WINDOW_SIZE[1]/2 + y*(util.WINDOW_SIZE[1]/2 - util.WINDOW_SIZE[1]/8)
                
                player = StaticQuadrantPlayer((xPos, yPos), angle, (x,y),color=self.playerColors.pop(), hasScore=False)
                infoManager = InfoManager(self._helpSystem, self._theme, owner=player)
                base = playerBases.DiagonalPlayerBase2Room( self._generator,
                                                       space=self.space, 
                                                       angle=player.angle,
                                                       parent=parent,
                                                       size=self._getCannonSize(),
                                                       position=player.pos,
                                                       owner=player,
                                                       helpSystem=self._helpSystem,
                                                       infoManager = infoManager    
          
                                                       )
                self._setBaseTimeoutForRejoin(base, util.CAP_INACTIVITY_TIMEOUT)
                base.destructionCallback = lambda: self._winCB(showKeyboards=False)
    
                players.append(player)
                player.base = base
        return players
          
    def _setBaseTimeoutForRejoin(self, base, duration): 
        
        def restoreBase():
            base.show()
            for structure in self.structures:
                structure.framesToGrowth -= self._growIncrementPerPlayer
              
        def baseTimeout():
            base.hide()
            circle = self._theme.JoinButton(parent=self)
            util.centerNodeOnPosition(circle, base.position)
            circle.angle = base.angle + math.pi/4
            circle.setEventHandler(avg.CURSORDOWN, avg.TOUCH, lambda event : restoreBase())
            for structure in self.structures:
                structure.framesToGrowth += self._growIncrementPerPlayer
              
        base.timeoutDuration = duration   
        base.timeOutCB = baseTimeout

    def _getCannonSize(self):
        sizeX = min(self.size.x, self.size.y) / 4
        return sizeX, sizeX 
            
    def toggleRotations(self):
        for structure in self.structures:
            structure.rotationEnabled = not structure.rotationEnabled
               
    def _getPlayerForEvent(self, event):
        for player in self._players:
            if player.isForPlayer(event):
                return player
        return None
            
    def __touchDown(self, event):
            
        for cannon in self._playerCannons:
            used = cannon.isTouchInCannonArea(event.pos)
            if used:
                return
        
        player = self._getPlayerForEvent(event)
        node = TouchPointNode(self.space, r=self._touchPointRadius, pos=event.pos, fillopacity=1, owner=player)
        node.eventId = event.cursorid
        
        for node2 in self.__touchNodeMapping.values():
            if (util.getDistance(node.pos, node2.pos) < util.MAX_SHIELD_DISTANCE):
                del self.__touchNodeMapping[node2.eventId]
                self.space.delayRemoveComplete(node2._body)
                self.space.delayRemoveComplete(node._body)
           
                mapping = (node2.eventId, node.eventId)
                if node.eventId < node2.eventId:
                    mapping = (node.eventId, node2.eventId)
                    shield = ShieldNode(self.space,
                                        pos1=node.pos,
                                        pos2=node2.pos,
                                        strokewidth=20,
                                        color="FF0000")
                else:
                    shield = ShieldNode(self.space,
                                        pos1=node2.pos,
                                        pos2=node.pos,
                                        strokewidth=20,
                                        color="FF0000")

    
                self.__shieldNodeMapping[mapping] = shield
                self.appendChild(shield)
                return
 
        self.__touchNodeMapping[event.cursorid] = node
        self.appendChild(node)
       
    def __touchUp(self, event):
        
        player = self._getPlayerForEvent(event)
          
        if event.cursorid in self.__touchNodeMapping:
            node = self.__touchNodeMapping[event.cursorid]
            del self.__touchNodeMapping[event.cursorid]
            self.space.delayRemoveComplete(node._body)
        else:
            for key in self.__shieldNodeMapping.keys():
                id1, id2 = key
                if id1 == event.cursorid or id2 == event.cursorid:
                    mapping = (id2, id1)
                    firstId = id2
                    secondId = id1
                    if id1 < id2:
                        mapping = (id1, id2)
                        firstId = id1
                        secondId = id2
                    
                    shield = self.__shieldNodeMapping[mapping]
            
                    self.space.delayRemove(shield._body.shape, shield._body)
                    shield.unlink(True)
                    del self.__shieldNodeMapping[mapping]
                    
                    if firstId == event.cursorid:                        
                        node = TouchPointNode(self.space,
                                              r=self._touchPointRadius,
                                              pos=shield.pos2,
                                              parent=self,
                                              fillopacity=1,
                                              owner=player)
                        node.eventId = secondId
                        self.__touchNodeMapping[secondId] = node
                    else:
                        node = TouchPointNode(self.space,
                                              r=self._touchPointRadius,
                                              pos=shield.pos1,
                                              parent=self,
                                              fillopacity=1,
                                              owner=player)
                        node.eventId = firstId
                        self.__touchNodeMapping[firstId] = node
                    return
  
    def delete(self):
        self.unlink(True)
        self._interactionDiv.unlink(True)
        self._interactionDiv = None
        self.space.delete()
        player = avg.Player.get()
        for timer in self.timers:
            player.clearInterval(timer)
            
        for player in self._players:
            player.base.delete()
            player.base= None
         
        self._players = []
        
        for structure in self.structures:
            structure.delete()
        self.structures = []