-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathmultiple_screens.py
136 lines (104 loc) · 4.57 KB
/
multiple_screens.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
# Importa e inicia pacotes
import pygame
def desenha_texto_no_centro(window, fonte, texto, cor, delta_y=0):
img_texto = fonte.render(texto, True, cor)
# Queremos centralizar o texto e sabemos as dimensões da janela e do texto
texto_x = int(window.get_width() / 2 - img_texto.get_width() / 2)
texto_y = int(window.get_height() / 2 - img_texto.get_height() / 2) + delta_y
window.blit(img_texto, (texto_x, texto_y))
# Classes das telas
# Esta tela mostra um texto em movimento e aguarda o usuário apertar qualquer tecla
class TelaInicial:
def __init__(self):
default_font_name = pygame.font.get_default_font()
self.font = pygame.font.Font(default_font_name, 24)
# Poderíamos ter um self.state com um dicionário
# Mas vamos utilizar somente uma variável
self.texto_dy = 0
self.texto_vy = 20 # pixels/segundo
# Agora a função atualiza devolve uma string com o nome da próxima tela.
# Se não for mudar de tela, devolve o nome da própria tela.
def atualiza(self, dt):
for event in pygame.event.get():
if event.type == pygame.QUIT:
return None # Devolve None para sair
elif event.type == pygame.KEYDOWN:
return Tela1()
self.texto_dy += self.texto_vy * dt
if abs(self.texto_dy) > 20:
self.texto_vy *= -1
# Truque para garantir que nunca vai sair do intervalo [-20, 20]
sinal = self.texto_dy / abs(self.texto_dy)
self.texto_dy = sinal * 20
# Devolve a própria tela para continuar nela
return self
def desenha(self, window):
window.fill((0, 0, 0))
desenha_texto_no_centro(window, self.font, 'Aperte qualquer tecla...', (255, 255, 255), self.texto_dy)
# Note que não chamamos o pygame.display.update aqui. Deixamos ele para ser chamado fora da função.
class Tela1:
def __init__(self):
default_font_name = pygame.font.get_default_font()
self.font = pygame.font.Font(default_font_name, 24)
self.cor = (255, 0, 0)
# Coloque aqui outras inicializações da tela
def atualiza(self, dt):
for event in pygame.event.get():
if event.type == pygame.QUIT:
return None # Devolve None para sair
elif event.type == pygame.MOUSEBUTTONDOWN:
return Tela2()
return self
def desenha(self, window):
window.fill(self.cor)
desenha_texto_no_centro(window, self.font, 'Clique para mudar de tela...', (255, 255, 255))
# Coloque aqui o desenho da tela, sem o pygame.display.update()
# Neste caso a Tela1 e Tela2 são bastante parecidas, mas elas poderiam ter coisas bastante diferentes
class Tela2:
def __init__(self):
default_font_name = pygame.font.get_default_font()
self.font = pygame.font.Font(default_font_name, 24)
self.cor = (0, 0, 255)
# Coloque aqui outras inicializações da tela
def atualiza(self, dt):
for event in pygame.event.get():
if event.type == pygame.QUIT:
return None # Devolve None para sair
elif event.type == pygame.MOUSEBUTTONDOWN:
return Tela1()
return self
def desenha(self, window):
window.fill(self.cor)
desenha_texto_no_centro(window, self.font, 'Clique para mudar de tela...', (255, 255, 255))
# Coloque aqui o desenho da tela, sem o pygame.display.update()
# Classe do jogo
class Jogo:
def __init__(self):
pygame.init()
self.window = pygame.display.set_mode((500, 400))
pygame.display.set_caption('Telas com classes')
self.tela_atual = TelaInicial()
self.last_updated = pygame.time.get_ticks()
# Devolve True se é para continuar rodando o jogo, False caso contrário
def atualiza(self):
# Atualiza tempo e calcula delta_t
now = pygame.time.get_ticks()
delta_t = (now - self.last_updated) / 1000
self.last_updated = now
# O método atualiza de todas as telas precisam receber um argumento delta_t
self.tela_atual = self.tela_atual.atualiza(delta_t)
# Atualiza tela atual
if self.tela_atual is None:
return False
return True
def game_loop(self):
# Note que aqui não precisamos saber qual é a tela_atual
while self.atualiza():
self.tela_atual.desenha(self.window)
pygame.display.update()
def finaliza(self):
pygame.quit()
if __name__ == '__main__':
jogo = Jogo()
jogo.game_loop()
jogo.finaliza()