-
Notifications
You must be signed in to change notification settings - Fork 0
/
aula099.py
161 lines (114 loc) · 5 KB
/
aula099.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
from tkinter import *
from constantes import *
import random
#Canvas: itemconfig, id, delete, tag, move
#Tk: after
class Jogo(object):
"""
Classe que organiza os elementos do jogo
"""
def __init__(self):
#Criamos o conteiner principal do jogo
self.root = Tk()
self.root.geometry('%ix%i'%(LARGURA, ALTURA))
self.root.resizable(False, False)
self.root.title('Pong')
#E uma frame para conter o canvas
self.frame=Frame(bg="black")
self.frame.pack()
#Criamos a tela do jogo
self.canvas = Canvas(self.frame, bg="black",width=CANVAS_L,height=CANVAS_A, cursor = 'target')
self.canvas.pack()
#E colocamos um botã para começar o jogo
self.começar = Button(self.root, text = 'START', command = self.começa)
self.começar.pack()
#self.canvas.create_polygon((100, 200), (150, 250), (250, 250), (300, 200), (300, 100), (250, 50), (150, 50), (100, 100), fill = 'white')
self.novoJogo()
self.root.mainloop()
def novoJogo(self):
"""
Cria os elementos de um novo jogo
"""
self.player = self.canvas.create_rectangle((CANVAS_L//2, 350), (CANVAS_L//2 + 100, 370), fill = 'green', tag='player')
#criar arco dentro da bola
#self.canvas.create_arc(p[0], p[1], p[0] + raio, p[1] + raio, fill='orange', start=60, extent = 90, tag='bola')
#Lista dos retângulos
self.r = []
#E por fim as diversas fileiras de retângulos
l, c, e = 5, 8, 2 #linhas, colunas e espaçamento
b, h, y0 = 48, 20, 50 #Base, altura e posição inicial dos retângulos
for i in range(l):
cor = random.choice(['green', 'orange', 'white', 'lightgray', 'yellow', 'purple'])
for j in range(c):
r = self.canvas.create_rectangle(b*j+(j+1)*e, i*h+(i+1)*e + y0,b*j+(j+1)*e + b, i*h+(i+1)*e + y0 + h, fill = cor, tag='rect')
self.r.append(r)
#self.canvas.create_text(CANVAS_L/2, CANVAS_A/2, text = 'OLA COLEGA!', fill = 'white')
#cria bola do jogo
self.raio = 30
p = (100, 200)
self.bola = self.canvas.create_oval(p[0], p[1], p[0] + self.raio, p[1] + self.raio, fill='red', outline='black', tag = 'bola')
self.b_vx = self.b_vy = 3
self.b_x, self.b_y = p
self.jogando = True
def começa(self):
"""
inicia jogo
"""
self.jogar()
def jogar(self):
"""jogo rodando"""
if self.jogando:
self.update()
self.root.after(10, self.jogar)
else:
self.acabou(self.msg)
def desenhar(self):
"""metodo para redesenhar a tela do jogo"""
#self.canvas.delete(self.bola)
#self.canvas.delete('bola')
#self.canvas.delete('arc')
#self.bola = self.canvas.create_oval(self.b_x, self.b_y, self.b_x + 30, self.b_y + 30, fill='red', outline='white', tag='bola')
#self.canvas.create_arc(self.b_x, self.b_y, self.b_x + 30, self.b_y + 30,fill='orange', start=60, extent = 90, tag='bola')
pass
def update(self):
"""update condições de jogo"""
#self.canvas.itemconfig(self.player, fill='blue')
#movemos a bola
self.canvas.move('bola', self.b_vx, self.b_vy)
#atualizamos o valor e posição
self.b_x += self.b_vx
self.b_y += self.b_vy
if self.b_x > CANVAS_L - self.raio or self.b_x < 0:
self.b_vx*=-1
if self.b_y > CANVAS_A - self.raio or self.b_y < 0:
self.b_vy*=-1
#caçar por colisoes
self.VerificaColisao()
def VerificaColisao(self):
#verifica se houve alguma colisão entre elementos do jogo
#primeiro criamos uma bounding box para a bola
coord = self.canvas.bbox('bola')
#x1, y1, x2, y2
#depois pegamos a id de todos os objetos que colidem com a bola
colisoes = self.canvas.find_overlapping(*coord)
#se o numero de colisoes for diferente de zero
if len(colisoes) != 0:
#Verificamos se a id do objeto é diferente do player
if colisoes[0] != self.player:
#vamos checar se ha colisão cm o objeto mais proximo do
#topo esquerdo da bola
m_p = self.canvas.find_closest(coord[0], coord[1])
#depois temos que olhar para cada um dos retangulos para
#identificar com q bola colidiu
for r in self.r:
#tendo encontrado o retangulo
if r == m_p[0]:
#deletamos ele do jogo
self.r.remove(r)
self.canvas.delete(r)
#e invertemos o sentido da velocidade da bola
self.b_vy *= -1
#por fim sai fora
return
if __name__ == '__main__':
Jogo()