예제 #1
0
파일: gameState.py 프로젝트: prgreen/grym
	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()
예제 #2
0
파일: gameState.py 프로젝트: prgreen/grym
	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()
예제 #3
0
파일: paddle.py 프로젝트: prgreen/grym
	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))
예제 #4
0
	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
예제 #5
0
	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