Added pin being thrown at a position. Needs refinement

master
David Raison 2014-08-31 03:39:02 +02:00
parent feea1079e9
commit b42b89db10
2 changed files with 96 additions and 8 deletions

31
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 import avocado, crystal, pingenerator
from pygame.locals import * from pygame.locals import *
from support.colors import * from support.colors import *
from interface import hud from interface import hud
@ -118,7 +118,12 @@ class TheGame:
levelChange = 0 levelChange = 0
score = 0 score = 0
targetScore = 400 targetScore = 400
# We could use this list for redrawing only this part
# of the screen install of all of it
pinnedAvocados = [] pinnedAvocados = []
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)
@ -128,11 +133,7 @@ class TheGame:
color = self.chooseRandomColor() color = self.chooseRandomColor()
crystalBall.setColor(color) crystalBall.setColor(color)
# We could use this list for redrawing only this part
# of the screen install of all of it
movingAvocados = []
running = True running = True
while running: while running:
time_passed = clock.tick(desired_fps) time_passed = clock.tick(desired_fps)
fps = clock.get_fps() fps = clock.get_fps()
@ -151,6 +152,8 @@ class TheGame:
print('DEBUG :: Level ' + str(level)) print('DEBUG :: Level ' + str(level))
self.playLevel(level) self.playLevel(level)
pinnedAvocados = [] pinnedAvocados = []
movingAvocados = []
thrownPins = []
if levelChange > 0: if levelChange > 0:
levelText = self.bigFont.render('Level ' + str(level), 0, WHITE) levelText = self.bigFont.render('Level ' + str(level), 0, WHITE)
@ -180,10 +183,12 @@ class TheGame:
a = avocado.Avocado(self.screen, avocolor, avosize, color, level) a = avocado.Avocado(self.screen, avocolor, avosize, color, level)
movingAvocados.append(a) movingAvocados.append(a)
pinnedAvocados += [avo for avo in movingAvocados if avo.isPinned() ]
# Remove avocados from the list of moving avocados if they no longer move # 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
pinnedAvocados += [avo for avo in movingAvocados if avo.isPinned() ]
movingAvocados[:] = [ avo for avo in movingAvocados if avo.isFalling() ] movingAvocados[:] = [ avo for avo in movingAvocados if avo.isFalling() ]
# Now redraw our avocados
for a in movingAvocados: for a in movingAvocados:
a.setTargetColor(color) a.setTargetColor(color)
a.move() a.move()
@ -192,14 +197,24 @@ class TheGame:
for a in pinnedAvocados: for a in pinnedAvocados:
a.blitme() a.blitme()
# And finally check if we need to redraw any pins
for activePin in 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():
# Collision detection # Collision detection
if event.type == MOUSEBUTTONDOWN: if event.type == MOUSEBUTTONDOWN:
mousepos = pygame.mouse.get_pos() mousepos = pygame.mouse.get_pos()
# Throw a pin here # Throw a pin here
# pin.throwAt(mousepos) newPin = pingenerator.Generate(self.screen)
# Yep, above here newPin.throwAt(mousepos)
thrownPins.append(newPin)
# Check if any avocados have been hit
for avo in movingAvocados: for avo in movingAvocados:
hit = avo.isHit(mousepos) hit = avo.isHit(mousepos)
if hit: if hit:

73
pingenerator.py Normal file
View File

@ -0,0 +1,73 @@
#!/usr/bin/env python3
import os, pygame
class Generate:
def __init__(self, screen):
self.inFlight = False
self.vx = 20
self.vy = 20
self.screen = screen
screen_width, screen_height = screen.get_size()
self.pos = (screen_width / 2, screen_height)
self.image = pygame.image.load(os.path.join('img','pin.png')).convert_alpha()
def throwAt(self, target):
self.inFlight = True
self.target = target
def isStuck(self):
if self.pos == self.target:
print('Pin stuck!')
return True
def blitme(self):
self.screen.blit(self.image, self.pos)
def moveTowardsTarget(self):
# OK, this works, but honestly,
# it would probably be much more effective
# to just be more lenient on isStuck
# e.g. accept approximate positions.
x, y = self.pos
tx, ty = self.target
xToCover = tx - x;
yToCover = ty - y;
# Please someone turn this into python ;)
if abs(xToCover) < self.vx:
self.vx = self.vx/2
if abs(yToCover) < self.vy:
self.vy = self.vy/2
if xToCover < 0:
xstep = -1 * self.vx
elif xToCover == 0:
xstep = 0
else:
xstep = 1* self.vx
newx = x + xstep
if yToCover < 0:
ystep = -1 * self.vy # = d * v (direction * speed)
elif yToCover == 0:
ystep = 0
else:
ystep = 1 * self.vy
newy = y + ystep
print('DEBUG :: pin target: ' + str(tx) + ',' + str(ty))
print('DEBUG :: pin position: ' + str(newx) + ',' + str(newy))
print('DEBUG :: pin distance: ' + str(xToCover) + ',' + str(yToCover))
print('DEBUG :: pin speed: ' + str(self.vx) + ',' + str(self.vy))
print('')
self.pos = (newx, newy)