Juanxo escribió:Buenas a todos! soy un newbie en esto de pygame. estoy tratando de hacer un BlockBreaker(ese juego de una bola rompiendo ladrillos) y me ha surgido un problemilla.
uhh, si, me acuerdo de ese juego, yo lo concía bajo el
nombre "arkanoid".
Juanxo escribió:Mi intencion es la de hacer diferentes bloques con diferentes numero de vidas(uno se rompa con un golpe, otro con 2, etc)
Existe alguna manera de automatizar esto o tendria que ir comprobando bloque por bloque aver si hay choques y restar vidas??
Gracias de antemano
no, en realidad no es algo que se automatice, en todo
caso lo que puedes hacer es crear una clase de objeto
que tenga el comportamiento de un bloque y luego
replicarlo en todos los bloques que necesites.
Te dejo un ejemplo reducido de como imagino que se podría
hacer:
El objetivo del ejemplo es mostrar un pelota blanca que se
mueve de izquierda a derecha, los rectángulos de colores
son bloques que cambian de color cuando la pelota los
toca. Cada bloque se puede eliminar pegángole con la
pelota 3 veces.
Aquí está el código:
- Código: Seleccionar todo
import pygame
from pygame.sprite import Sprite
class Pelota(Sprite):
"""Representa una pelota que se mueve de izquierda a derecha."""
def __init__(self):
Sprite.__init__(self)
x = 160
y = 100
self.rect = pygame.Rect(x, y, 20, 20)
self.direction = 1
def draw(self, screen):
color = (255, 255, 255)
pygame.draw.circle(screen, color, self.rect.center, 10)
def update(self):
"""Simula un movimiento de izquierda a derecha.
El movimiento depende directamente de la variable `direction`
que se altera solamente llamando al metodo 'flip()'."""
self.rect.x += self.direction
# aplica limites a la pantalla
if self.rect.right > 320:
self.rect.right = 320
self.flip()
elif self.rect.left < 0:
self.rect.left = 0
self.flip()
def flip(self):
"invirte el sentido de movimiento de la pelota."
self.direction *= -1
class Bloque(Sprite):
"""Representa un bloque de color que puede ser golpeado por la pelota."""
def __init__(self, x, y):
Sprite.__init__(self)
self.life = 2
self.rect = pygame.Rect(x, y, 40, 20)
def draw(self, screen):
colores = [(200, 100, 100), (100, 255, 100), (255, 255, 100)]
color = colores[self.life]
pygame.draw.rect(screen, color, self.rect)
def reduce_life(self):
"Reduce la vida del bloque, y elimina el bloque si ya no tiene vida."
if self.life == 0:
print "se elimina el bloque"
self.kill()
else:
self.life -= 1
print "reduciendo la vida del bloque a:", self.life
def main():
pygame.init()
screen = pygame.display.set_mode((320, 240))
clock = pygame.time.Clock()
quit = False
# Genera los sprites de la escena.
pelota = Pelota()
bloques = pygame.sprite.Group()
bloques.add(Bloque(2, 100))
bloques.add(Bloque(50, 100))
bloques.add(Bloque(250, 100))
# bucle principal del juego
while not quit:
clock.tick(60)
for e in pygame.event.get():
if e.type == pygame.QUIT:
quit = True
# colisiones
sprite_collided = pygame.sprite.spritecollideany(pelota, bloques)
if sprite_collided:
sprite_collided.reduce_life()
pelota.flip() # invierte el sentido de movimiento.
# actualizacion logica
pelota.update()
bloques.update()
# actualizacion de pantalla
gris = (100, 100, 100)
screen.fill(gris)
pelota.draw(screen)
# pinta los bloques uno por uno.
for bloque in bloques.sprites():
bloque.draw(screen)
pygame.display.flip()
if __name__ == '__main__':
main()