<-- Back to list of examples

pick_up_blocks.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
"""
Use sprites to pick up bloques
Sample Python/Pygame Programs
Simpson College Computer Science
Explanation video: http://youtu.be/iwLj7iJCFQM
"""
import pygame
import random
# Definimos algunos colores
NEGRO = (0, 0, 0)
BLANCO = (255, 255, 255)
ROJO = (255, 0, 0)
class Bloque(pygame.sprite.Sprite):
"""
Esta clase representa al bloque que será recogido.
Se deriva de la clase "Sprite" en Pygame.
"""
def __init__(self, color, largo, alto):
""" Constructor. Pasa el color del bloque, así como
su posición x,y. """
# Llama al constructor de la clase padre (Sprite)
super().__init__()
# Crea una imagen del bloque, y lo rellena con color.
# También podríamos usar una imagen cargada desde el disco duro.
self.image = pygame.Surface([largo, alto])
self.image.fill(color)
# Extrae el objeto rectángulo que tiene las dimensiones de la imagen.
# Actualiza la posición de este objeto, estableciendo los valores de
# rect.x y rect.y
self.rect = self.image.get_rect()
class Protagonista(Bloque):
""" Esta clase representa al protagonista. Deriva de bloque y por eso tiene el mismo
método ___init___ que definimos arriba. """
# Lista de todos los bloques que nos llevamos
lista_de_bloques_acarreados = []
def update(self):
""" Método llamado al actualizar un sprite. """
# Obtiene la posición actual del ratón. La devuelve como
# una lista de dos números.
pos = pygame.mouse.get_pos()
# Ahora veamos cómo la ubicación del ratón difiere de la posición actual del
# protagonista. (¿Cuán lejos nos hemos desplazado?)
diff_x = self.rect.x - pos[0]
diff_y = self.rect.y - pos[1]
# Iteramos a través de cada bloque que llevamos y ajustamos
# la cantidad de desplazamiento.
for bloque in self.lista_de_bloques_acarreados:
bloque.rect.x -= diff_x
bloque.rect.y -= diff_y
# Establecemos la posición del protagonista en la del ratón
self.rect.x = pos[0]
self.rect.y = pos[1]
# Inicializamos Pygame
pygame.init()
# Establecemos el alto y largo de la pantalla
largo_pantalla = 700
alto_pantalla = 400
pantalla = pygame.display.set_mode([largo_pantalla, alto_pantalla])
# Lista de los 'sprites.' Cada bloque en el programa se
# añade a la lista. La lista es gestionada por la clase 'Group.'
lista_de_bloques = pygame.sprite.Group()
# Lista de cada sprite.
# También de todos los bloques y del protagonista.
listade_todoslos_bloques = pygame.sprite.Group()
for i in range(50):
# Esto representa un bloque
bloque = Bloque(NEGRO, 20, 15)
# Establecemos una ubicación aleatoria para el bloque
bloque.rect.x = random.randrange(largo_pantalla)
bloque.rect.y = random.randrange(alto_pantalla)
# Añadimos el bloque a la lista de objetos.
lista_de_bloques.add(bloque)
listade_todoslos_bloques.add(bloque)
# Creamos un bloque protagonista ROJO.
protagonista = Protagonista(ROJO, 20, 15)
listade_todoslos_bloques.add(protagonista)
# Iteramos hasta que el usuario pulsa el botón de salida.
hecho = False
# Controla las veces que se refresca la pantalla.
reloj = pygame.time.Clock()
# Ocultamos el cursor del ratón.
pygame.mouse.set_visible(False)
# -------- Bucle Principal del Programa -----------
while not hecho:
for evento in pygame.event.get():
if evento.type == pygame.QUIT:
hecho = True
elif evento.type == pygame.MOUSEBUTTONDOWN:
# Cuando presionamos el ratón, observamos si estamos en contacto con otros sprites
lista_impactos_bloques = pygame.sprite.spritecollide(protagonista, lista_de_bloques, False)
# Establecemos que lista con los bloques con los que estamos en contacto, sea la lista de lo que llevamos recogido.
protagonista.lista_de_bloques_acarreados = lista_impactos_bloques
elif evento.type == pygame.MOUSEBUTTONUP:
# Cuando dejamos de pulsar el ratón, hacemos que la lista de los bloques recogidos se vacíe.
protagonista.lista_de_bloques_acarreados = []
listade_todoslos_bloques.update()
# Limpiamos la pantalla
pantalla.fill(BLANCO)
# Dibujamos todos los sprites
listade_todoslos_bloques.draw(pantalla)
# Limitamos a 60 fps
reloj.tick(60)
# Avanzamos y actualizamos la pantalla con todo aquello que hemos dibujado.
pygame.display.flip()
pygame.quit()