Merge branch 'master' of github.com:lvl2/avocados

master
Steve Clement 2014-08-31 10:44:51 +02:00
commit a16d25b766
4 changed files with 162 additions and 98 deletions

View File

@ -62,10 +62,10 @@ class Avocado:
self.has_been_pinned = True self.has_been_pinned = True
self.is_still_falling = False self.is_still_falling = False
self.click.play() self.click.play()
return True return True, self.rect.center
else: else:
self.clickFail.play() self.clickFail.play()
return False return False, (0, 0)
# BUG - isHit is called 4 times upon click which makes it return the # BUG - isHit is called 4 times upon click which makes it return the
# first time but fail the consecutive times # first time but fail the consecutive times
#else: #else:
@ -80,10 +80,14 @@ class Avocado:
return self.has_been_pinned return self.has_been_pinned
def checkBoundaries(self):
if self.rect.right > self.screen_width or self.rect.left < 0:
self.vx = -self.vx
def move(self): def move(self):
if not self.has_been_pinned: if not self.has_been_pinned:
if self.rect.right > self.screen_width or self.rect.left < 0: self.checkBoundaries()
self.vx = -self.vy
if self.hasLanded(): if self.hasLanded():
self.destroy() self.destroy()

202
game.py
View File

@ -5,7 +5,7 @@ Avocados and stuff
import os, random, sys import os, random, sys
import pygame import pygame
import avocado, crystal, pingenerator import avocado, crystal, pingenerator, itext
from pygame.locals import * from pygame.locals import *
from support.colors import * from support.colors import *
from interface import hud from interface import hud
@ -17,18 +17,14 @@ class TheGame:
""" Initialize the game """ """ Initialize the game """
pygame.init() pygame.init()
pygame.display.set_caption('Pin Avo, the Cado!') pygame.display.set_caption('Pin Avo, the Cado!')
self.clock = pygame.time.Clock()
displayInfo = pygame.display.Info() self.initializeScreen()
self.resize = 1.3
self.WIDTH = int(displayInfo.current_w / self.resize)
self.HEIGHT = int(displayInfo.current_h / self.resize)
self.WIDTH, self.HEIGHT = 800, 600
# initialize the game canvas # initialize the game canvas
self.size = (self.WIDTH, self.HEIGHT) self.timeout = 30
self.screen = pygame.display.set_mode(self.size) self.level = 1
self.targetScore = 400
self.screen = pygame.display.set_mode((self.WIDTH, self.HEIGHT))
self.colors = [BLUE, GREEN, RED, YELLOW] self.colors = [BLUE, GREEN, RED, YELLOW]
self.bg = pygame.image.load(os.path.join('img', 'lawyerCrystalBall.png')) self.bg = pygame.image.load(os.path.join('img', 'lawyerCrystalBall.png'))
self.bg.set_colorkey((255,255,255)) self.bg.set_colorkey((255,255,255))
@ -39,7 +35,13 @@ class TheGame:
# Set splashscreen # Set splashscreen
splashScreen = pygame.image.load("img/splashScreen.png") splashScreen = pygame.image.load("img/splashScreen.png")
self.screen.blit(pygame.transform.scale(splashScreen, self.size), (0, 0)) self.screen.blit(
pygame.transform.scale(
splashScreen, (self.WIDTH, self.HEIGHT)
),
(0, 0)
)
pygame.display.flip() pygame.display.flip()
pygame.time.wait(3000) pygame.time.wait(3000)
@ -52,6 +54,17 @@ class TheGame:
sound = False sound = False
def initializeScreen(self):
# displayInfo = pygame.display.Info()
# self.resize = 1.3
# self.WIDTH = int(displayInfo.current_w / self.resize)
# self.HEIGHT = int(displayInfo.current_h / self.resize)
# Look at the cleverness ;)
self.WIDTH, self.HEIGHT = 800, 600
def mute(self,mute=False, sound=True): def mute(self,mute=False, sound=True):
if not sound: if not sound:
return return
@ -84,11 +97,12 @@ class TheGame:
def gameOver(self): def gameOver(self):
screen_width, screen_height = self.size screen_width, screen_height = self.screen.get_size()
gameOverImage = pygame.image.load("img/gameOver.png") gameOverImage = pygame.image.load("img/gameOver.png")
gameOverText = self.bigFont.render('GAME OVER', 0, YELLOW) gameOverText = self.bigFont.render('GAME OVER', 0, YELLOW)
gameOverImage.blit(gameOverText, (screen_width/8, screen_height/7)) gameOverImage.blit(gameOverText, (screen_width/8, screen_height/7))
self.screen.blit(pygame.transform.scale(gameOverImage, self.size), (0, 0)) self.screen.blit(pygame.transform.scale(gameOverImage,
self.screen.get_size()), (0, 0))
pygame.display.flip() pygame.display.flip()
self.fadeSound() self.fadeSound()
pygame.time.wait(3000) pygame.time.wait(3000)
@ -104,28 +118,35 @@ class TheGame:
if type(self.bg) is tuple: if type(self.bg) is tuple:
self.screen.fill(self.bg) self.screen.fill(self.bg)
else: else:
self.screen.blit(pygame.transform.scale(self.bg, self.size), (0, 0)) self.screen.blit(
pygame.transform.scale(
self.bg, self.screen.get_size()
),
(0, 0)
)
def resetLevel(self):
self.pinnedAvocados = []
self.movingAvocados = []
self.thrownPins = []
self.timeleft = self.timeout
def main(self): def main(self):
clock = pygame.time.Clock()
desired_fps = 60 desired_fps = 60
##############################
# Never set below 4, else we have a high # Never set below 4, else we have a high
# probability of losing the game due to a missing color # probability of losing the game due to a missing color
# Alternatively, you could edit chooseRandomColor() # Alternatively, you could edit chooseRandomColor()
# to only work on the first multiplier colors # to only work on the first multiplier colors
multiplier = 4 multiplier = 4
time = timeleft = 30
level = 1
levelChange = 0
score = 0 score = 0
targetScore = 400
# We could use this list for redrawing only this part # We could use this list for redrawing only this part
# of the screen install of all of it # of the screen install of all of it
pinnedAvocados = [] self.resetLevel()
movingAvocados = []
thrownPins = []
# initialize the HUD class and the lawyer # initialize the HUD class and the lawyer
the_hud = hud.Hud(self.screen) the_hud = hud.Hud(self.screen)
@ -135,85 +156,95 @@ class TheGame:
color = self.chooseRandomColor() color = self.chooseRandomColor()
crystalBall.setColor(color) crystalBall.setColor(color)
texts = []
container = {'font': self.bigFont, 'screen': self.screen, 'clock': self.clock}
# onetext = itext.Text(container, 'Huhu', 2000)
# texts.append(onetext)
running = True running = True
while running: while running:
time_passed = clock.tick(desired_fps) time_passed = self.clock.tick(desired_fps)
fps = clock.get_fps() fps = self.clock.get_fps()
screen_width, screen_height = self.size screen_width, screen_height = self.screen.get_size()
# Redraw the background and put our lawyer back on top # Redraw the background and put our lawyer back on top
self.drawBackground() self.drawBackground()
crystalBall.blitme() crystalBall.blitme()
# Next level? # Next level?
if score >= (targetScore * level): if score >= (self.targetScore * self.level):
level += 1 self.level += 1
levelChange = 70 levelText = itext.Text(
timeleft = time container,
print('DEBUG :: Score: ' + str(score)) 'Level ' + str(self.level),
print('DEBUG :: Level ' + str(level)) (screen_width / 3, screen_height /2),
self.playLevel(level) 2000
pinnedAvocados = [] )
movingAvocados = [] texts.append(levelText)
thrownPins = [] # self.screen.blit(levelText, (screen_width / 3, screen_height / 2))
self.playLevel(self.level)
self.resetLevel()
if levelChange > 0:
levelText = self.bigFont.render('Level ' + str(level), 0, WHITE)
self.screen.blit(levelText, (screen_width / 3, screen_height / 2))
levelChange -= 1
timeleft -= time_passed / 1000 self.timeleft -= time_passed / 1000
timeleft = round(timeleft, 2) self.timeleft = round(self.timeleft, 2)
if timeleft <= 0: if self.timeleft <= 0:
self.gameOver() self.gameOver()
else: else:
displaytime = timeleft displaytime = self.timeleft
# Check if there's any text that wants to get displayed
for text in texts:
text.blitme()
texts[:] = [text for text in texts if not text.hasExpired() ]
# Redraw the HUD # Redraw the HUD
the_hud.draw_hud(score, displaytime, round(fps, 2)) the_hud.draw_hud(score, displaytime, round(fps, 2))
# If we're not currently in between levels… # Initialize a number of avocados, depending on the level
if levelChange == 0: avocadosInGame = len(self.movingAvocados)
# Initialize a number of avocados, depending on the level avocadosWanted = self.level * multiplier
avocadosInGame = len(movingAvocados)
avocadosWanted = level * multiplier
if avocadosInGame < avocadosWanted:
probability = int(1.0/(avocadosWanted - avocadosInGame) * 100)
if random.randint(0, probability) < 3:
avocolor = self.chooseRandomColor()
avosize = (50, 50) # should we randomize this?
a = avocado.Avocado(self.screen, avocolor, avosize, color, level)
movingAvocados.append(a)
# Remove avocados from the list of moving avocados if they no longer move if avocadosInGame < avocadosWanted:
# Or add them to the list of pinned avocados if they're been hit probability = int(1.0/(avocadosWanted - avocadosInGame) * 100)
pinnedAvocados += [avo for avo in movingAvocados if avo.isPinned() ] if random.randint(0, probability) < 3:
movingAvocados[:] = [ avo for avo in movingAvocados if avo.isFalling() ] avocolor = self.chooseRandomColor()
avosize = (50, 50) # should we randomize this?
# Spawn a new avocado
a = avocado.Avocado(self.screen, avocolor, avosize, color, self.level)
self.movingAvocados.append(a)
############################## # Remove avocados from the list of moving avocados if they no longer move
# # Or add them to the list of pinned avocados if they're been hit
# Late-Night-Comments: self.pinnedAvocados += [avo for avo in self.movingAvocados if avo.isPinned() ]
# self.movingAvocados[:] = [ avo for avo in self.movingAvocados if avo.isFalling() ]
# Can we maybe handle the pinned avocados the same way I handle "stuck"
# pins? It seems to be easier.. well, the pins don't fall out of the screen
# though…
#
##############################
# Now redraw our avocados ##############################
for a in movingAvocados: #
a.setTargetColor(color) # Late-Night-Comments:
a.move() #
a.blitme() # Can we maybe handle the pinned avocados the same way I handle "stuck"
# pins? It seems to be easier.. well, the pins don't fall out of the screen
# though…
#
##############################
for a in pinnedAvocados: # Now redraw our avocados
a.blitme() for a in self.movingAvocados:
a.setTargetColor(color)
a.move()
a.blitme()
# And finally check if we need to redraw any pins for a in self.pinnedAvocados:
for activePin in thrownPins: a.blitme()
activePin.blitme()
if not activePin.isStuck(): # And finally check if we need to redraw any pins
activePin.moveTowardsTarget() for activePin in self.thrownPins:
activePin.blitme()
if not activePin.isStuck():
activePin.moveTowardsTarget()
# Catch events # Catch events
for event in pygame.event.get(): for event in pygame.event.get():
@ -221,16 +252,17 @@ class TheGame:
if event.type == MOUSEBUTTONDOWN: if event.type == MOUSEBUTTONDOWN:
mousepos = pygame.mouse.get_pos() mousepos = pygame.mouse.get_pos()
# Throw a pin here # Throwing a new pin
newPin = pingenerator.Generate(self.screen) newPin = pingenerator.Generate(self.screen)
newPin.throwAt(mousepos) newPin.throwAt(mousepos)
thrownPins.append(newPin) self.thrownPins.append(newPin)
# Check if any avocados have been hit # Check if any avocados have been hit
for avo in movingAvocados: for avo in self.movingAvocados:
hit = avo.isHit(mousepos) hit, center = avo.isHit(mousepos)
if hit: if hit:
score += 100 score += 100
newPin.throwAt(center)
color = self.chooseRandomColor() color = self.chooseRandomColor()
crystalBall.setColor(color) crystalBall.setColor(color)
elif hit == False: elif hit == False:

28
itext.py Normal file
View File

@ -0,0 +1,28 @@
#!/usr/bin/env python3
import pygame
from support.colors import *
class Text:
def __init__(self, container, text, pos, duration):
""" Foo """
self.clock = container['clock']
self.duration = duration
self.totalTime = 0
self.text = container['font'].render(text, 0 , WHITE)
self.screen = container['screen']
self.pos = pos
def blitme(self):
""" sd """
self.screen.blit(self.text, self.pos)
def hasExpired(self):
self.totalTime += self.clock.get_time()
if self.totalTime > self.duration:
del(self)
return True
return False

View File

@ -13,23 +13,23 @@ class Generate:
screen_width, screen_height = screen.get_size() screen_width, screen_height = screen.get_size()
self.pos = (screen_width / 2, screen_height) self.pos = (screen_width / 2, screen_height)
self.image = pygame.image.load(os.path.join('img','pin.png')).convert_alpha() self.image = pygame.image.load(os.path.join('img','pin.png')).convert_alpha()
self.size = self.image.get_size()
def throwAt(self, target): def throwAt(self, target):
self.inFlight = True self.inFlight = True
self.target = target x, y = target
self.target = (x, y - self.size[1])
def isStuck(self): def isStuck(self):
if self.pos == self.target: if self.pos == self.target:
print('Pin stuck!') # print('Pin stuck!')
return True return True
def blitme(self): def blitme(self):
self.screen.blit(self.image, self.pos) self.screen.blit(self.image, self.pos)
def moveTowardsTarget(self): def moveTowardsTarget(self):
############################## ##############################
# #
@ -70,9 +70,9 @@ class Generate:
newy = y + ystep newy = y + ystep
print('DEBUG :: pin target: ' + str(tx) + ',' + str(ty)) # print('DEBUG :: pin target: ' + str(tx) + ',' + str(ty))
print('DEBUG :: pin position: ' + str(newx) + ',' + str(newy)) # print('DEBUG :: pin position: ' + str(newx) + ',' + str(newy))
print('DEBUG :: pin distance: ' + str(xToCover) + ',' + str(yToCover)) # print('DEBUG :: pin distance: ' + str(xToCover) + ',' + str(yToCover))
print('DEBUG :: pin speed: ' + str(self.vx) + ',' + str(self.vy)) # print('DEBUG :: pin speed: ' + str(self.vx) + ',' + str(self.vy))
print('') # print('')
self.pos = (newx, newy) self.pos = (newx, newy)