Cyberdemonk escribió:¿Como hago cuando son varios sprites ? como los bloques del Breakout.
Podria usar 2 listas, una para los rect de los bloques y otra para los rect de los bloque que no deberian aparecer.
Usando las listas con un bucle for que "pinta" los bloque ahi se solucionaria no?
Chico, te estas complicando mucho la existencia

hay algo llamado "grupos" y hacen todo lo que quieres de forma simple
http://www.losersjuegos.com.ar/traducciones/pygame/sprite/groupMira, modificando un poco tu código, como ejemplo:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#la linea anterior nos permite utilizar acentos en los comentarios...
import pygame
from pygame import *
SCREEN_ANCHO = 300
SCREEN_ALTO = 300
class bola (pygame.sprite.Sprite): # heredamos la clase sprite
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("bola.png")
#sprite tiene un atributo llamado "rect"
#ese atributo es lo que permite muchas utildades
#asi que hay que respetar su nombre
self.rect = self.image.get_rect()
self.rect.centerx = SCREEN_ANCHO / 2
self.rect.centery = 50
self.speed = [3 , 3]
def update(self):
if self.rect.left < 0 or self.rect.right > SCREEN_ANCHO:
self.speed[0] = -self.speed[0]
if self.rect.top < 0 or self.rect.bottom > SCREEN_ALTO:
self.speed[1] = -self.speed[1]
self.rect.move_ip((self.speed[0], self.speed[1]))
class bola2(pygame.sprite.Sprite): # heredamos la clase sprite
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("bola.png")
# Aquí habías colocado self.rect_pelota2, recuerda
# lo que te dije antes, no te preocupes por el nombre
# al ser objetos diferentes sus atributos les son diferentes
# ejemplo:
# tu tienes un atributo "nombre"
# yo tengo un atributo "nombre"
# pero mi nombre es diferente al tuyo 
# a demás
# mi nombre es MIO
# tu nombre es TUYO
self.rect = self.image.get_rect()
self.rect.centerx = 20
self.rect.centery = 70
self.speed2 = [2 , 2]
def update(self):
if self.rect.left < 0 or self.rect.right > SCREEN_ANCHO:
self.speed2[0] = -self.speed2[0]
if self.rect.top < 0 or self.rect.bottom > SCREEN_ALTO:
self.speed2[1] = -self.speed2[1]
self.rect.move_ip((self.speed2[0], self.speed2[1]))
def main ():
pygame.init()
pygame.display.set_caption("Prueba")
screen = pygame.display.set_mode((SCREEN_ANCHO ,SCREEN_ALTO ))
fondo = pygame.image.load("fondo.jpg")
clock = pygame.time.Clock()
run = True
#aqui estamos bien, creamos una pelota...
pelota1 = bola()
pelota2 = bola2()
#creamos grupos de sprites
#los grupos nos permiten manejar muchos sprites
#de forma simple
grupo_pelota1 = pygame.sprite.Group(pelota1)
grupo_pelota2 = pygame.sprite.Group(pelota2)
rebotes = False
while run:
clock.tick(60)
#esto es para una salida más "limpia"
for event in pygame.event.get():
if event.type == QUIT:
run = False
pelota1.update()
pelota2.update()
#Las lineas que siguen las puedes remplazar por colisiones "entre grupos"
"""
if pelota1.rect.colliderect(pelota2.rect):
pelota1.speed[1] = -pelota1.speed[1]
pelota1.speed[0] = -pelota1.speed[0]
rebotes = True
"""
#como aquí muestro:
#no explicare como funciona exactamente esta función, te lo dejo de tarea 
if pygame.sprite.groupcollide(grupo_pelota1, grupo_pelota2, False, True):
pelota1.speed[1] = -pelota1.speed[1]
pelota1.speed[0] = -pelota1.speed[0]
screen.blit(fondo , (0 , 0))
#screen.blit(pelota1.image, pelota2.rect_pelota2)
#esta linea de arriba es innecesaria utilizando bien a sprite...
#el método draw dibuja TODOS los sprites contenidos en el grupo
grupo_pelota1.draw(screen)
grupo_pelota2.draw(screen)
pygame.display.flip()
#como decia, una salida mas limpia...
pygame.quit()
main()
Ahora imagina un grupo de sprites llamado "bloques" y un grupo para "pelota".
Si tienes dudas, pregunta
