class Tela(pyglet.window.Window): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.set_location(70, 80) self.dicionario_cores = { r'imagens\bola_vermelha.png': 'vermelha', r'imagens\bola_rosa.png': 'rosa', r'imagens\bola_amarela.png': 'amarela', r'imagens\bola_verde.png': 'verde', r'imagens\bola_azul.png': 'azul' } self.cores = [ r'imagens\bola_vermelha.png', r'imagens\bola_rosa.png', r'imagens\bola_amarela.png', r'imagens\bola_verde.png', r'imagens\bola_azul.png' ] self.iniciar() def iniciar(self): self.pos_previa = [865, 35] self.pos_seta = [450, 30] self.bola_previa = None self.prev = True self.raio = 29 self.jogada = 0 self.bola_voando = False self.perdeu = False self.frame_rate = 1 / 120 self.vel_bolas = 800 self.imagem_seta = pyglet.image.load(r'imagens\seta.png') self.imagem_seta.anchor_y = self.imagem_seta.height // 2 cor = choice(self.cores) cor_1 = self.dicionario_cores[cor] self.imagem_bola = pyglet.image.load(cor) self.imagem_bola.anchor_x = self.imagem_bola.width // 2 self.imagem_bola.anchor_y = self.imagem_bola.height // 2 self.bola_previa = Objeto(self.imagem_bola, self.pos_previa[0], self.pos_previa[1]) self.bola_previa.cor = cor_1 self.bolas = [] self.seta = Objeto(self.imagem_seta, self.pos_seta[0], self.pos_seta[1]) self.imagem_Gameover = pyglet.image.load(r'imagens\Gameover.png') self.Gameover = Objeto(self.imagem_Gameover, 0, 0) self.colocar_bolas() ########################################################################### def on_key_press(self, symbol, modifiers): if symbol == pyglet.window.key.SPACE: self.iniciar() if symbol == pyglet.window.key.ESCAPE: quit() def on_mouse_press(self, x, y, button, modifiers): if self.bola_voando == False: if button == pyglet.window.mouse.LEFT: if y >= 15: self.jogar_bola(x, y) else: self.jogar_bola(x, 15) if button == pyglet.window.mouse.RIGHT: for bola in self.bolas: print(bola.cor) def on_mouse_motion(self, x, y, dx, dy): if x - self.seta.sprite.x == 0: self.seta.sprite.rotation = -90 else: tan = (y - self.seta.sprite.y) / (x - self.seta.sprite.x) if x - self.seta.sprite.x > 0: self.seta.sprite.rotation = -(atan(tan) * 180 / pi) else: self.seta.sprite.rotation = (-atan(tan) * 180 / pi) - 180 ########################################################################### def colocar_bolas(self): for y in range(5): for x in range(15): if (y + 1) % 2 == 0: if x == 0: continue cor = choice(self.cores) cor_1 = self.dicionario_cores[cor] self.im_bola = pyglet.image.load(cor) self.im_bola.anchor_x = self.imagem_bola.width // 2 self.im_bola.anchor_y = self.imagem_bola.height // 2 if y % 2 == 0: xi = 30 + (x * 60) else: xi = 30 + (x * 60) - (60 * cos((60 * pi) / 180)) yi = 870 - (y * 60 * sin((60 * pi) / 180)) self.bolas.append(Objeto(self.im_bola, xi, yi)) self.bolas[-1].parada = True self.bolas[-1].cor = cor_1 self.bolas[-1].inicial = True for bola in self.bolas: self.ver_conectados(bola) # def nova_linha(self): # # if self.contagem_bola==3: # self.contagem=0 # for y in range(14): # self.imagem_bola.anchor_x = self.imagem_bola.width // 2 # self.imagem_bola.anchor_y = self.imagem_bola.height // 2 + 2 def jogar_bola(self, x, y): if x != 450: tan = (y - 10) / (x - 450) self.bolas.append(self.nova_bola) if x - 450 > 0: self.bolas[-1].vely = self.vel_bolas * sin(atan(tan)) self.bolas[-1].velx = self.vel_bolas * cos(atan(tan)) else: self.bolas[-1].vely = -self.vel_bolas * sin(atan(tan)) self.bolas[-1].velx = -self.vel_bolas * cos(atan(tan)) else: self.bolas.append(self.nova_bola) self.bolas[-1].vely = self.vel_bolas self.bolas[-1].velx = 0 self.prev = True self.bola_voando = True self.contagem_bola = self.contagem_bola + 1 def ver_conectados(self, bola): raio = 65**2 for bola_2 in self.bolas: if bola_2 == bola: continue raio_2 = self.dist(bola.sprite.x, bola.sprite.y, bola_2.sprite.x, bola_2.sprite.y) if raio_2 <= raio: bola.tocando.append(bola_2) if len(bola.tocando) >= 6: break def testar_colisao(self, bola): for bola_2 in self.bolas: if bola_2 == bola: continue raio = self.dist(bola.sprite.x, bola.sprite.y, bola_2.sprite.x, bola_2.sprite.y) if raio <= ((2 * self.raio)**2): self.mapeamento(bola, bola_2) return True def update_bolas(self, dt): if len(self.bolas) > 0: if self.bolas[-1].parada: self.bola_voando = False for bola in self.bolas: if bola.parada == False: if self.testar_colisao(bola): self.ver_conectados(bola) bola.parada = True self.numero = 1 self.verificados = [bola] self.verificar_iguais(bola) if self.numero >= 3: for bolinha in self.verificados[1:]: self.bolas.remove(bolinha) self.bolas.remove(bola) continue if bola.sprite.x >= 871: bola.velx = -fabs(bola.velx) if bola.sprite.x <= 29: bola.velx = fabs(bola.velx) if bola.sprite.y > 871: bola.parada = True bola.sprite.x += bola.velx * dt bola.sprite.y += bola.vely * dt else: if bola.sprite.y <= 60: self.perdeu = True def previa(self): self.nova_bola = self.bola_previa self.nova_bola.sprite.x = self.pos_seta[0] self.nova_bola.sprite.y = self.pos_seta[1] cor = choice(self.cores) cor_1 = self.dicionario_cores[cor] self.imagem_bola = pyglet.image.load(cor) self.imagem_bola.anchor_x = self.imagem_bola.width // 2 self.imagem_bola.anchor_y = self.imagem_bola.height // 2 self.bola_previa = Objeto(self.imagem_bola, self.pos_previa[0], self.pos_previa[1]) self.bola_previa.cor = cor_1 self.prev = False def on_draw(self): self.clear() if self.perdeu: self.Gameover.draw() else: self.seta.draw() self.nova_bola.draw() self.bola_previa.draw() for bola in self.bolas: bola.draw() def update(self, dt): if self.prev and self.bola_voando == False: self.previa() self.update_bolas(dt) def dist(self, x1, y1, x2, y2): a1 = (x1 - x2)**2 a2 = (y1 - y2)**2 return (a1 + a2) def p_ang(self, xi, yi, xf, yf): if xf == xi: ang = 90 else: ang = atan((yf - yi) / (xf - xi)) ang = (180 * ang / pi) if xf > xi: if ang < 0: ang += 360 return ang elif xf < xi: return ang + 180 else: if yf > yi: return ang else: return ang + 180 def mapeamento(self, bola1, bola2): angulo = self.p_ang(bola2.sprite.x, bola2.sprite.y, bola1.sprite.x, bola1.sprite.y) if angulo <= 30: ang = 0 elif angulo <= 90: ang = (60 * pi) / 180 elif angulo <= 150: ang = (120 * pi) / 180 elif angulo <= 210: ang = pi elif angulo <= 270: ang = (240 * pi) / 180 elif angulo <= 330: ang = (300 * pi) / 180 else: ang = 0 bola1.sprite.x = bola2.sprite.x + (60 * cos(ang)) bola1.sprite.y = bola2.sprite.y + (60 * sin(ang)) for bola in self.bolas: if bola == bola1: bola.parada = True def verificar_iguais(self, bola): cor = bola.cor for bola1 in bola.tocando: if bola1.cor == cor and bola1 not in self.verificados: self.numero += 1 self.verificados.append(bola1) self.verificar_iguais(bola1)
class Tela(pyglet.window.Window): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.set_location(70, 80) self.pos_previa = [865, 35] self.pos_seta = [450, 30] self.bola_previa = None self.prev = True self.raio = 29 self.jogada = 0 self.bola_voando = False self.cores = [ r'imagens\bola_vermelha.png', r'imagens\bola_rosa.png', r'imagens\bola_amarela.png', r'imagens\bola_verde.png', r'imagens\bola_azul.png' ] self.perdeu = False self.frame_rate = 1 / 240 self.vel_bolas = 800 self.imagem_seta = pyglet.image.load(r'imagens\seta.png') self.imagem_seta.anchor_y = self.imagem_seta.height // 2 self.imagem_bola = pyglet.image.load(choice(self.cores)) self.imagem_bola.anchor_x = self.imagem_bola.width // 2 self.imagem_bola.anchor_y = self.imagem_bola.height // 2 self.bola_previa = Objeto(self.imagem_bola, self.pos_previa[0], self.pos_previa[1]) self.bolas = [] self.seta = Objeto(self.imagem_seta, self.pos_seta[0], self.pos_seta[1]) self.imagem_Gameover = pyglet.image.load(r'imagens\Gameover.png') self.Gameover = Objeto(self.imagem_Gameover, 0, 0) def on_mouse_press(self, x, y, button, modifiers): if not self.bola_voando: if button == pyglet.window.mouse.LEFT: if y >= 15: self.jogar_bola(x, y) else: self.jogar_bola(x, 15) if button == pyglet.window.mouse.RIGHT: for bola in self.bolas: print(bola.parada) def on_mouse_motion(self, x, y, dx, dy): if x - self.seta.sprite.x == 0: self.seta.sprite.rotation = -90 else: tan = (y - self.seta.sprite.y) / (x - self.seta.sprite.x) if x - self.seta.sprite.x > 0: self.seta.sprite.rotation = -(atan(tan) * 180 / pi) else: self.seta.sprite.rotation = (-atan(tan) * 180 / pi) - 180 def jogar_bola(self, x, y): if x != 450: tan = (y - 10) / (x - 480) self.bolas.append(self.nova_bola) if x - 480 > 0: self.bolas[-1].vely = self.vel_bolas * sin(atan(tan)) self.bolas[-1].velx = self.vel_bolas * cos(atan(tan)) else: self.bolas[-1].vely = -self.vel_bolas * sin(atan(tan)) self.bolas[-1].velx = -self.vel_bolas * cos(atan(tan)) else: self.bolas.append(self.nova_bola) self.bolas[-1].vely = self.vel_bolas self.bolas[-1].velx = 0 self.prev = True self.bola_voando = True def testar_colisao(self, bola): for bola_2 in self.bolas: if bola_2 == bola: continue raio = self.dist(bola.sprite.x, bola.sprite.y, bola_2.sprite.x, bola_2.sprite.y) if raio <= ((2 * self.raio)**2): return True def update_bolas(self, dt): if len(self.bolas) > 0: if self.bolas[-1].parada: self.bola_voando = False for bola in self.bolas: if self.testar_colisao(bola): bola.parada = True if not bola.parada: bola.sprite.x += bola.velx * dt bola.sprite.y += bola.vely * dt if bola.sprite.x >= 871: bola.velx = -fabs(bola.velx) if bola.sprite.x <= 29: bola.velx = fabs(bola.velx) if bola.sprite.y > 871: bola.parada = True def previa(self): self.nova_bola = self.bola_previa self.nova_bola.sprite.x = self.pos_seta[0] self.nova_bola.sprite.y = self.pos_seta[1] self.imagem_bola = pyglet.image.load(choice(self.cores)) self.imagem_bola.anchor_x = self.imagem_bola.width // 2 self.imagem_bola.anchor_y = self.imagem_bola.height // 2 self.bola_previa = Objeto(self.imagem_bola, self.pos_previa[0], self.pos_previa[1]) self.prev = False def on_draw(self): self.clear() if self.perdeu: self.Gameover.draw() else: self.seta.draw() self.nova_bola.draw() self.bola_previa.draw() for bola in self.bolas: bola.draw() def update(self, dt): if self.prev and self.bola_voando == False: self.previa() self.update_bolas(dt) self.Game_Over() def dist(self, x1, y1, x2, y2): a1 = (x1 - x2)**2 a2 = (y1 - y2)**2 return a1 + a2 def Game_Over(self): for bola in self.bolas: if bola.parada: if bola.sprite.y <= 60: self.perdeu = True def p_ang(self, xi, yi, xf, yf): ang = atan((yf - yi) / (xf - xi)) return 180 * ang / pi