-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathgame_functions.py
More file actions
243 lines (194 loc) · 8.84 KB
/
game_functions.py
File metadata and controls
243 lines (194 loc) · 8.84 KB
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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
import sys
from time import sleep
import pygame
from bullet import Bullet
from faustao import Alien
def check_keydown_events(event, fi_settings, screen, ship, bullets):
'''Responde ao pressionar tecla'''
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.key == pygame.K_SPACE:
fire_bullet(fi_settings,screen,ship,bullets)
elif event.key == pygame.K_q:
sys.exit()
def fire_bullet(fi_settings, screen, ship, bullets):
'''Dispara um projetil se o limite ainda nao foi alcançado'''
# Cria um novo projétil e o adiciona ao grupo de projeteis
if len(bullets) < fi_settings.bullets_allowed:
new_bullet = Bullet(fi_settings, screen, ship)
bullets.add(new_bullet)
def check_keyup_events(event,ship):
'''Responde ao soltar tecla'''
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
def check_events(fi_settings, screen, stats, sb, play_button, ship, aliens, bullets):
'''Responde aos eventos de pressionamento de teclas e de mouse'''
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#Captura click do mouse no Play
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_x, mouse_y = pygame.mouse.get_pos()
check_play_button(fi_settings, screen, stats, sb, play_button, ship, aliens, bullets, mouse_x, mouse_y)
#Movimentando nave quando KEYDOWN, ou seja, pressionado.
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, fi_settings, screen, ship, bullets)
elif event.type == pygame.K_LEFT:
check_keyup_events(event, ship)
#Parando nave quando a tecla não estiver mais pressionada.
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
def check_play_button(fi_settings, screen, stats, sb, play_button, ship, aliens, bullets, mouse_x, mouse_y):
'''Inicia um novo jogo quando o jogador clicar em Play'''
button_clicked = play_button.rect.collidepoint(mouse_x,mouse_y)
if button_clicked and not stats.game_active:
#Reinicia as configurações do jogo
fi_settings.initialize_dynamic_settings()
#Oculta o cursos do mouse
pygame.mouse.set_visible(False)
# Reinicia os dados estatisticos do jogo
stats.reset_stats()
stats.game_active = True
#Reinicia as imagens do painel de pontuação
sb.prep_score()
sb.prep_high_score()
sb.prep_level()
sb.prep_ships()
# Esvazia a lista de Faustoes e projeteis
aliens.empty()
bullets.empty()
# Cria uma nova frota e centraliza a espaçonave
create_fleet(fi_settings, screen, ship, aliens)
ship.center_ship()
def update_screen(fi_settings, screen, stats, sb, ship, aliens, bullets, play_button):
'''Atualiza as imagens na tela e alterna para a nova tela'''
# Redesenha a tela a cada passagem pelo laço
screen.fill(fi_settings.bg_color)
#Redesenha todos os projeteis atrás da espaçonave e dos alienigenas
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
#alien.blitme()
aliens.draw(screen)
#Desenha a informação sobre a pontuação
sb.show_score()
# Desenha o botão Play se o jogo estiver inativo
if not stats.game_active:
play_button.draw_button()
# Deixa a tela mais recente visível
pygame.display.flip()
def update_bullets(fi_settings, screen, stats, sb, ship, aliens, bullets):
'''Atualiza a posição dos projeteis e se livra dos projeteis antigos'''
# Atualiza as posições dos projeteis
bullets.update()
#Livra-se dos projéteis que desapareceram
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
check_bullet_alien_collisions(fi_settings, screen, stats, sb, ship, aliens, bullets)
def check_bullet_alien_collisions(fi_settings, screen, stats, sb, ship, aliens, bullets):
'''Remove qualquer projetil e Faustao que tenham colidido'''
# Verifica se algum projetil atingiu um Faustao
# Em caso de afirmativo, livra-se do projetil e do alienigena
collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
if collisions:
for aliens in collisions.values():
stats.score += fi_settings.alien_points * len(aliens)
sb.prep_score()
check_high_score(stats, sb)
if len(aliens) == 0:
#Se a frota toda for destruida, inicia um novo nível
bullets.empty()
fi_settings.increase_speed()
#Aumenta o nível
stats.level += 1
sb.prep_level()
create_fleet(fi_settings, screen, ship, aliens)
def get_number_aliens_x(fi_settings, alien_width):
'''Determina o número de alienigenas que cabem em uma linha'''
available_space_x = fi_settings.screen_width - 2 * alien_width
number_aliens_x = int(available_space_x / (2 * alien_width))
return number_aliens_x
def get_number_rows(fi_settings, ship_height, alien_height):
'''Determina o número de linhas de Faustoes alienigenas que cabem na tela'''
available_space_y = (fi_settings.screen_height - (3 * alien_height) - ship_height)
number_rows = int(available_space_y / (2 * alien_height))
return number_rows
def create_alien(fi_settings, screen, aliens, alien_number, row_number):
#Cria um alienigena e o posiciona na linha
alien = Alien(fi_settings, screen)
alien_width = alien.rect.width
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
aliens.add(alien)
def create_fleet(fi_settings, screen, ship, aliens):
'''Cria uma frota completa de alienigenas'''
# Cria um alienigena e calcula o numero de alienigenas em uma linha.
alien = Alien(fi_settings, screen)
number_aliens_x = get_number_aliens_x(fi_settings, alien.rect.width)
number_rows = get_number_rows(fi_settings, ship.rect.height, alien.rect.height)
#Cria frota de alienigenas
for row_number in range(number_rows):
for alien_number in range(number_aliens_x):
create_alien(fi_settings, screen, aliens, alien_number, row_number)
def check_fleet_edges(fi_settings, aliens):
'''Responde apropriadamente se algum Faustao atingiu uma borda.'''
for alien in aliens.sprites():
if alien.check_edges():
change_fleet_direction(fi_settings, aliens)
break
def change_fleet_direction(fi_settings, aliens):
'''Faz toda a frota de Faustoes descer e mudar sua direção'''
for alien in aliens.sprites():
alien.rect.y += fi_settings.fleet_drop_speed
fi_settings.fleet_direction *= -1
def check_aliens_bottom(fi_settings, screen, stats, sb, ship, aliens, bullets):
'''Verifica se algum Faustao alcançou a parte inferior da tela'''
screen_rect = screen.get_rect()
for alien in aliens.sprites():
if alien.rect.bottom >= screen_rect.bottom:
#Trata esse caso do mesmo modo que é feito quando a espaçonave é atingida
ship_hit(fi_settings, screen, stats, sb, ship, aliens, bullets)
break
def update_aliens(fi_settings, screen, stats, sb, ship, aliens, bullets):
'''Verifica se a frota esta em uma das bordas e então atualiza as posições de todos os Faustões da
frota'''
check_fleet_edges(fi_settings,aliens)
aliens.update()
#Verifica se houveram colisões entre Faustao e a espaçonave
if pygame.sprite.spritecollideany(ship,aliens):
ship_hit(fi_settings, screen, stats, sb, ship, aliens, bullets)
#print("Oh loco meu!!!")
#Verifica se há algum alienigena que atingiu a parte inferior da tela
check_aliens_bottom(fi_settings, screen, stats, sb, ship, aliens, bullets)
def ship_hit(fi_settings, screen, stats, sb, ship, aliens, bullets):
'''Responde ao fato de a espaçonave ter sido atingida por um Faustao alienigena'''
if stats.ships_left > 0:
#Decrementa ships_left
stats.ships_left -= 1
#Atualiza o painel de pontuações
sb.prep_ships()
#Esvazia a lista de Faustoes e de projeteis
aliens.empty()
bullets.empty()
#Cria uma nova frota e centraliza a espaçonave
create_fleet(fi_settings, screen, ship, aliens)
ship.center_ship()
else:
#Faz uma pausa
sleep(0.5)
stats.game_active = False
pygame.mouse.set_visible(True)
def check_high_score(stats, sb):
'''Verifica se a=ha uma nova pontuação omaxima'''
if stats.score > stats.high_score:
stats.high_score = stats.score
sb.prep_high_score()