-
Notifications
You must be signed in to change notification settings - Fork 0
/
virus_v2.0.py
185 lines (157 loc) · 5.9 KB
/
virus_v2.0.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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
import pygame,sys,random
# Función que dibuja el piso en la pantalla
def draw_floor():
screen.blit(floor_surface,(floor_x_pos,450))
screen.blit(floor_surface,(floor_x_pos + 288,450))
# Función que crea los obstáculos
def create_soap():
random_soap_pos = random.choice(soap_height)
bottom_soap = soap_surface.get_rect(midtop = (450,random_soap_pos))
top_soap = soap_surface.get_rect(midbottom = (450,random_soap_pos-150))
return bottom_soap,top_soap
# Función que mueve los obstáculos hacia la izquierda
def move_soaps(soaps):
for soap in soaps:
soap.centerx -= 5
return soaps
# Función que dibuja los obstáculos en la pantalla
def draw_soaps(soaps):
for soap in soaps:
screen.blit(soap_surface,soap)
# Función que chequea por colisiones
def check_collision(soaps):
for soap in soaps:
if virus_rect.colliderect(soap):
#print("choque")
death_sound.play()
return False
if virus_rect.top <= -30 or virus_rect.bottom >= 450:
#print("choque")
# Al retornar falso, se muestra la pantalla de puntajes (“game over”)
return False
# Al retornar verdadero, se sigue el juego, ya que no ha chocado con nada
return True
# Función que dibuja los puntajes en la pantalla
def score_display(game_state):
# Pantalla juego
if game_state == "main_game":
score_surface= game_font.render(str(int(score)),True,(0,0,0))
score_rect = score_surface.get_rect(center=(144,50))
screen.blit(score_surface,score_rect)
# Pantalla game over
if game_state == "game_over":
score_surface= game_font.render((f'Puntaje ({int(score)})'),True,(0,0,0))
score_rect = score_surface.get_rect(center=(144,50))
screen.blit(score_surface,score_rect)
high_score_surface= game_font.render((f'Récord ({int(high_score)})'),True,(0,0,0))
high_score_rect = high_score_surface.get_rect(center=(144,425))
screen.blit(high_score_surface,high_score_rect)
# Función que actualiza el puntaje record
def update_score(score, high_score):
if score > high_score:
high_score = score
return high_score
# Inicia todos los módulos de pygame
pygame.init()
# Tamaño de pantalla: 288x512
screen= pygame.display.set_mode((288,512))
# Define tiempo
clock = pygame.time.Clock()
game_font = pygame.font.Font("joystix monospace.ttf",20)
# Variables
gravity = 0.40
virus_movement = 0
game_active = True
score = 0
high_score = 0
####################
# Fondo de pantalla
bg_surface = pygame.image.load("assets/bg_virus.png").convert()
bg_surface = pygame.transform.scale(bg_surface,(294,512))
# Piso
floor_surface = pygame.image.load("assets/base.png").convert()
floor_surface = pygame.transform.scale(floor_surface,(288,200))
floor_x_pos = 0
# Virus
virus_surface = pygame.image.load("assets/coronavirus.png")
virus_surface = pygame.transform.scale(virus_surface,(20,20))
virus_rect = virus_surface.get_rect(center = (100,256))
# Obstáculos
soap_surface = pygame.image.load("assets/soap.png").convert_alpha()
soap_surface = pygame.transform.scale(soap_surface,(90,90))
# Lista de obstáculos
soap_list = []
# Evento: Nuevo obstáculo
SPAWNSOAP = pygame.USEREVENT
# Obstáculo aparece cada 1200 milisegundos
pygame.time.set_timer(SPAWNSOAP,1200)
# Alturas al que aparecerán los obstaculos
soap_height = [180,200,300]
# Imagen de game over
game_over_surface = pygame.image.load("assets/message.png").convert_alpha()
game_over_rect = game_over_surface.get_rect(center = (144,256))
#sonido
whoosh_sound = pygame.mixer.Sound("sound/sfx_swooshing.wav")
death_sound = pygame.mixer.Sound("sound/sfx_hit.wav")
score_sound = pygame.mixer.Sound("sound/sfx_point.wav")
score_sound_countdown = 100
while True:
for event in pygame.event.get():
# Al cerrar la pantalla
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# Al apretar la tecla space
if event.type == pygame.KEYDOWN:
# Al apretar tecla space y estar en la pantalla de juego
if event.key == pygame.K_SPACE and game_active:
#print("volar")
virus_movement = 0
virus_movement -= 5
whoosh_sound.play()
# Al apretar tecla space y estar en la pantalla de game over
if event.key == pygame.K_SPACE and game_active == False:
game_active = True
soap_list.clear()
virus_rect.center = (100,256)
virus_movement = 0
score = 0
# Al momento que aparece un nuevo obstáculo
if event.type == SPAWNSOAP:
#print("jabon")
soap_list.extend(create_soap())
#print(soap_list)
# Mostrar fondo en pantalla de juego y game over
screen.blit(bg_surface,(0,0))
# Al estar en pantalla de juego
if game_active:
#virus
virus_movement += gravity
virus_rect.centery += virus_movement
screen.blit(virus_surface,virus_rect)
game_active = check_collision(soap_list)
#jabon
soap_list = move_soaps(soap_list)
draw_soaps(soap_list)
#piso
floor_x_pos -= 1
draw_floor()
if floor_x_pos <= -288:
floor_x_pos = 0
score += 0.01
score_display("main_game")
score_sound_countdown -= 1
if score_sound_countdown <= 0:
score_sound.play()
score_sound_countdown = 100
# Al estar en game over
else:
screen.blit(game_over_surface,game_over_rect)
high_score = update_score(score,high_score)
score_display("game_over")
# Actualizar pantalla
pygame.display.update()
# El programa nunca va a correr a más de 120 frames por segundo
clock.tick(100)
pygame.quit()
sys.exit()