def manageGame(self, eventManager): """ Debug mode """ for p in self.players: # Paddle move if eventManager.leftHeld: p.paddle.move(DIRECTION['X']['LEFT'], 0, eventManager.isBoostingLeft, eventManager.isBoostingRight) if eventManager.rightHeld: p.paddle.move(DIRECTION['X']['RIGHT'], 0, eventManager.isBoostingLeft, eventManager.isBoostingRight) if eventManager.upHeld: p.paddle.move(0, DIRECTION['Y']['UP']) if eventManager.downHeld: p.paddle.move(0, DIRECTION['Y']['DOWN']) elif not (eventManager.leftHeld or eventManager.rightHeld or eventManager.upHeld or eventManager.downHeld): p.paddle.idle() """ Release # Paddle move if eventManager.leftHeld: self.players[0].paddle.move(dirX=DIRECTION['X']['LEFT'], dirY=0) if eventManager.rightHeld: self.players[0].paddle.move(dirX=DIRECTION['X']['RIGHT'], dirY= 0) if eventManager.upHeld: self.players[0].paddle.move(dirX=0, dirY=DIRECTION['Y']['UP']) if eventManager.downHeld: self.players[0].paddle.move(dirX=0, dirY=DIRECTION['Y']['DOWN']) """ # Update objects for o in self.objects: o.update() # Update visual effects VisualEffectManager.getInstance().update()
def draw(self): # When level in progress or beginning if self.state == STATE['IN_PROGRESS'] or self.state == STATE['NEW_LIFE']: # Draw backgrounds self.screen.drawAllBG(self.grid.bgColor) # Draw state board self.screen.drawStateBoard(self.grid, self.players, self.lvlTime, self.localRecord, self.worldRecord) # Draw game objects self.screen.drawObjects(self.objects) # Draw visual effects self.screen.drawVisualEffects(VisualEffectManager.getInstance().getList()) # When level beginning or paused or life lost => print press space if self.state == STATE['NEW_LIFE'] or self.state == STATE['PAUSED']: self.screen.drawPressToContinue() # When game over or end if self.state == STATE['GAME_OVER'] or self.state == STATE['GAME_END']: # Create game over surface self.screen.createGameOver() self.screen.drawGameOver() else : # Remove game over self.screen.removeGameOver()
def applyEffect(self, effectType): # PAD_SPEEDUP: Increase paddle speed if effectType == USABLE_TYPE['PAD_SPEEDUP']: self.dXMax = self.dXMax+1 if self.dXMax+1 <= PADDLE_H_SPEED['MAX'] else PADDLE_H_SPEED['MAX'] self.dYMax = self.dYMax+1 if self.dYMax+1 <= PADDLE_V_SPEED['MAX'] else PADDLE_V_SPEED['MAX'] # Visual effect VisualEffectManager.getInstance().add(PadNotifVEF(value=VEF_PAD_SPDUP_LBL, refPad=self)) # PAD_GROW: Increase paddle width elif effectType == USABLE_TYPE['PAD_GROW']: if self.width+PAD_GROWTH <= PADDLE_WIDTH['MAX']: self.width = self.width+PAD_GROWTH self.posX -= PAD_GROWTH/2 # Visual effect VisualEffectManager.getInstance().add(PadGrowVEF(refPad=self)) else: self.width = PADDLE_WIDTH['MAX'] # PAD_SHRINK: Decrease paddle width elif effectType == USABLE_TYPE['PAD_SHRINK']: if self.width-PAD_GROWTH >= PADDLE_WIDTH['MIN']: self.width = self.width-PAD_GROWTH self.posX += PAD_GROWTH/2 # Visual effect VisualEffectManager.getInstance().add(PadShrinkVEF(refPad=self)) else: self.width = PADDLE_WIDTH['MIN'] # PAD_BOOST: Increase paddle max and current boost elif effectType == USABLE_TYPE['PAD_BOOST']: self.boostMax = self.boostMax+PAD_BOOST_GAIN if self.boostMax+PAD_BOOST_GAIN <= PAD_BOOST['MAX'] else PAD_BOOST['MAX'] self.boost = self.boost+PAD_BOOST_GAIN if self.boost+PAD_BOOST_GAIN <= self.boostMax else self.boostMax # Visual effect VisualEffectManager.getInstance().add(PadNotifVEF(value=VEF_PAD_BOOST_LBL, refPad=self)) # PLA_LIFEUP: Life+1 notification elif effectType == USABLE_TYPE['PLA_LIFEUP']: # Visual effect VisualEffectManager.getInstance().add(PadNotifVEF(value=VEF_PAD_LIFEUP_LBL, refPad=self))
def update(self, eventManager): """ Returns True,True if game over,retry """ super(GameStateSingleAdventure, self).update() # When level in progress if self.state == STATE['IN_PROGRESS']: # Unpause counters self.lvlTime.unpause() VisualEffectManager.getInstance().unpauseCounter() self.manageGame(eventManager) # Pause when player press SPACE if eventManager.spacePressed: self.state = STATE['PAUSED'] # When game paused elif self.state == STATE['PAUSED']: # Pause counters self.lvlTime.pause() VisualEffectManager.getInstance().pauseCounter() # Unpause when player release SPACE if eventManager.spacePressed: self.state = STATE['IN_PROGRESS'] # When beginning or life lost elif self.state == STATE['NEW_LIFE']: # Pause counters self.lvlTime.pause() VisualEffectManager.getInstance().pauseCounter() # Waiting player press SPACE if eventManager.spacePressed: self.state = STATE['IN_PROGRESS'] # When counting score elif self.state == STATE['SCORE_COUNTING']: # Pause counters self.lvlTime.pause() VisualEffectManager.getInstance().pauseCounter() # Increasing total score if self.scoreToIncrease < self.players[0].totalScore: self.sound.play("scoreCounting.wav") self.scoreToIncrease += 1 # Score to increase reached total score, or negative score else: self.scoreToIncrease = self.players[0].totalScore # Waiting player presses SPACE or score counting finished => force total score if eventManager.spacePressed or self.scoreToIncrease == self.players[0].totalScore: self.scoreToIncrease = self.players[0].totalScore self.state = STATE['SCORE_END'] # New record sound if self.isNewRecord: self.sound.play("new_record.ogg") # When score counting ends elif self.state == STATE['SCORE_END']: # Waiting player presses SPACE => level end or game over if eventManager.spacePressed: self.state = self.stateAfterScore # When level finished => start counting score elif self.state == STATE['LEVEL_END']: self.currentLvl += 1 for p in self.players: if p.lives < NB_LIVES['MAX']: p.lives += 1 # Load next level if exists if self.currentLvl < len(self.levels): self.initLevel(self.currentLvl, self.directory) # Game finished otherwise else: self.state = STATE['GAME_END'] # When game end => ask player for restart elif self.state == STATE['GAME_OVER'] or self.state == STATE['GAME_END'] : # Pause counters self.lvlTime.pause() VisualEffectManager.getInstance().pauseCounter() # Y => reset game state if eventManager.yPressed: Player.initId() return True, True # N => quit game if eventManager.nPressed: # for reentrance Player.OBJECT_INDEX = 0 return True, False return False, False
def manageGame(self, eventManager): super(GameStateSingleAdventure, self).manageGame(eventManager) # Debug if DEBUG: key = pygame.key.get_pressed() if key[K_n]: self.state = STATE['LEVEL_END'] if key[K_l]: self.players[0].lives += 1 if self.players[0].lives > NB_LIVES['MAX']: self.players[0].lives = NB_LIVES['MAX'] # Collisions paddles = [p.paddle for p in self.players] self.ch.loadState(self.grid, self.balls, paddles) brickHit, ballTouchesGround, uEffectsPad, hitPad, ballWall = self.ch.checkAllCollisions() self.ch.saveState(self.grid, self.balls, paddles) if ballWall: self.sound.play("ballWall.wav") # Reset chain bonus when pad hit if hitPad: self.chainBonus = 0 self.sound.play("ballPad.ogg") # if all non negative bricks are removed # change negative bricks to normal bricks convertNeg = True for b in self.grid.bricks: if b.bType < 4 or b.bType > 6: convertNeg = False if convertNeg: for b in self.grid.bricks: if b.bType == BRICK_TYPE["DEVIL"] or b.bType == BRICK_TYPE["SATAN"]: b.bType = 1 b.score = NEG_BRICK_POS_SCORE # Remove hit bricks for brk in brickHit: if brk is not None: # Satanic effect: all balls suddenly curve if self.grid.getType(brk) == BRICK_TYPE["SATAN"]: for b in self.balls: b.isCurving = 'X' randomSign = random.randrange(2) if randomSign == 0: randomSign = -1 else: randomSign = 1 b.curve = randomSign * BALL_CURVE_FACTOR/2 # Devil effect: random direction if self.grid.getType(brk) == BRICK_TYPE["DEVIL"]: for b in self.balls: randomSign = random.randrange(2) if randomSign == 0: randomSign = -1 else: randomSign = 1 b.dX = randomSign * random.uniform(sqrt(BALL_SPEED_MAX)/2, sqrt(BALL_SPEED_MAX)) b.dY = randomSign * random.uniform(sqrt(BALL_SPEED_MAX)/2, sqrt(BALL_SPEED_MAX)) # Nitro effect: boom if self.grid.getType(brk) == BRICK_TYPE["NITRO"]: retList = self.grid.explode(brk) # returns list of exploded bricks and spaces #print "EXPLODE "+str(retList) # special count and indicator to avoid explosion mess # Update level and total scores self.players[0].scores[0].value += len(retList) * 2 self.players[0].totalScore += len(retList) * 2 VisualEffectManager.getInstance().add(ScoreVEF(value='+'+str(len(retList) * 2), posX=(1+2*brk[0])*BRICK_WIDTH/2, posY=(1+2*brk[1])*BRICK_HEIGHT/2)) # Massive effect: explode in a line if self.grid.getType(brk) == BRICK_TYPE["MASSIVE"]: defaultBall = self.balls[0] # TODO multiplayer version d = self.grid.getDirection(defaultBall.posX, defaultBall.posY, defaultBall.radius*2, defaultBall.radius*2, brk[0]*BRICK_WIDTH+BRICK_WIDTH/2, brk[1]*BRICK_HEIGHT+BRICK_HEIGHT/2) retList = self.grid.explode(brk, direction=d) # returns list of exploded bricks and spaces #print "MASSIVE "+str(retList) # special count and indicator to avoid explosion mess # Update level and total scores self.players[0].scores[0].value += len(retList) * 2 self.players[0].totalScore += len(retList) * 2 VisualEffectManager.getInstance().add(ScoreVEF(value='+'+str(len(retList) * 2), posX=(1+2*brk[0])*BRICK_WIDTH/2, posY=(1+2*brk[1])*BRICK_HEIGHT/2)) # Sound effect t = self.grid.getType(brk) if t == BRICK_TYPE["NORMAL"]: self.sound.play("brickHit.ogg") elif t == BRICK_TYPE["STEEL"]: self.sound.play("indestructibleHit.ogg") else: self.sound.play("metalBounce.ogg") self.brkScore, self.chainBonus, remainBrick = self.grid.hitBrick(brk, self.chainBonus) # Update level and total scores self.players[0].scores[0].value += self.brkScore self.players[0].totalScore += self.brkScore # Add chain bonus self.players[0].scores[0].value += SCORE_CHAIN_BONUS[self.chainBonus] self.players[0].totalScore += SCORE_CHAIN_BONUS[self.chainBonus] # Add game indicator if self.brkScore+SCORE_CHAIN_BONUS[self.chainBonus] > 0: VisualEffectManager.getInstance().add(ScoreVEF(value='+'+str(self.brkScore+SCORE_CHAIN_BONUS[self.chainBonus]), posX=(1+2*brk[0])*BRICK_WIDTH/2, posY=(1+2*brk[1])*BRICK_HEIGHT/2)) if self.brkScore < 0: VisualEffectManager.getInstance().add(ScoreVEF(value=str(self.brkScore), posX=(1+2*brk[0])*BRICK_WIDTH/2, posY=(1+2*brk[1])*BRICK_HEIGHT/2, color=VEF_NEG_TXT_COLOR)) # Level finished check if remainBrick == 0: self.state = STATE['SCORE_COUNTING'] self.stateAfterScore = STATE['LEVEL_END'] # Add bonus to score self.addBonusScore() # Store player time for the current lvl self.storeLvlTime() # Get best player trophy for current lvl self.lvlTrophy = self.getLvlBestTrophy() else: STATE['IN_PROGRESS'] # Apply effect of usable if uEffectsPad[0]['uIndex'] is not None: self.sound.play("objectHit.ogg") obj, effectType = self.grid.getUsableEffect(uEffectsPad[0]['uIndex']) # Apply effect to pad if obj == 'PADDLE': self.players[0].paddle.applyEffect(effectType) # Apply effect to ball elif obj == 'BALL': self.balls[0].applyEffect(effectType) # Apply effect to player elif obj == 'PLAYER': self.players[0].applyEffect(effectType) # Life lost check if ballTouchesGround: self.sound.play("lifeLost.ogg") self.players[0].lives -= 1 # Reset ball position and speed self.balls[0].reset(posX=self.balls[0].posX0, posY=self.balls[0].posY0) # Reset paddle position self.players[0].paddle.reset(posX=self.players[0].paddleX0, posY=self.players[0].paddleY0) # Check for 0 life game over if self.players[0].lives <= 0: self.state = STATE['SCORE_COUNTING'] self.stateAfterScore = STATE['GAME_OVER'] else: self.state = STATE['NEW_LIFE'] # No perfect bonus self.isPerfect = False