Skip to content

Commit be1cca3

Browse files
author
renzon
committed
Animação funcionando sem trocar caracteres quando mortos
1 parent 4e98f97 commit be1cca3

6 files changed

Lines changed: 107 additions & 72 deletions

File tree

atores.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,9 @@ def caracter(self, tempo):
1717
else:
1818
return self._caracter_destruido
1919

20-
def __init__(self, x=0, y=0, canvas=None):
20+
def __init__(self, x=0, y=0):
2121
self.y = y
2222
self.x = x
23-
self.canvas = canvas
2423
self._tempo_de_colisao = None
2524

2625
def status(self, tempo):
@@ -59,14 +58,14 @@ class Porco(Ator):
5958
_caracter_ativo = '@'
6059

6160

62-
GRAVIDADE = 30 # m/s^2
61+
GRAVIDADE = 10 # m/s^2
6362

6463

6564
class Passaro(Ator):
6665
_velocidade_scalar = None
6766

68-
def __init__(self, x=0, y=0, canvas=None):
69-
super().__init__(x, y, canvas)
67+
def __init__(self, x=0, y=0):
68+
super().__init__(x, y)
7069
self._x_inicial = x
7170
self._y_inicial = y
7271
self._tempo_de_lancamento = None

fase.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,17 @@ def __init__(self):
2323
self._porcos = []
2424
self._obstaculos = []
2525

26+
def _adicionar_ator(self, lista, *atores):
27+
lista.extend(atores)
28+
2629
def adicionar_obstaculo(self, *obstaculos):
27-
self._obstaculos.extend(obstaculos)
30+
self._adicionar_ator(self._obstaculos, *obstaculos)
2831

2932
def adicionar_porco(self, *porcos):
30-
self._porcos.extend(porcos)
33+
self._adicionar_ator(self._porcos, *porcos)
3134

3235
def adicionar_passaro(self, *passaros):
33-
self._passaros.extend(passaros)
36+
self._adicionar_ator(self._passaros, *passaros)
3437

3538
def acabou(self, tempo):
3639
return not self._existe_porco_ativo(tempo) or not self._existe_passaro_ativo(tempo)
@@ -55,7 +58,7 @@ def calcular_pontos(self, tempo):
5558
return pontos
5659

5760
def _transformar_em_ponto(self, ator, tempo):
58-
return Ponto(ator.x, ator.y, ator.caracter(tempo), ator.canvas)
61+
return Ponto(ator.x, ator.y, ator.caracter(tempo))
5962

6063
def _calcular_ponto_de_passaro(self, passaro, tempo, ):
6164
passaro.calcular_posicao(tempo)

fase_tkinter.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# -*- coding: utf-8 -*-
2+
from itertools import chain
3+
from tkinter import PhotoImage, NW
4+
from atores import ATIVO
5+
from fase import Ponto, Fase
6+
7+
PASSARO_VERMELHO = "images/passaro_vermelho.gif"
8+
PASSARO_AMARELHO = "images/passaro_amarelo.gif"
9+
PORCO = "images/porco.gif"
10+
PORCO_MORTO = "images/porco_morto.gif"
11+
OBSTACULO = "images/obstaculo.gif"
12+
TRANSPARENTE = "images/transparente.gif"
13+
14+
CARACTER_PARA_CAMINHO_IMG_DCT = {'D': PASSARO_VERMELHO, '>': PASSARO_AMARELHO, '@': PORCO, 'O': OBSTACULO,
15+
'+': PORCO_MORTO}
16+
17+
caracter_para_img = {}
18+
19+
20+
def get_imagem(caracter):
21+
# img = caracter_para_img.get(caracter)
22+
# if img is None:
23+
# caracter_para_img[caracter] = PhotoImage(file=CARACTER_PARA_CAMINHO_IMG_DCT.get(caracter, TRANSPARENTE))
24+
return PhotoImage(file=CARACTER_PARA_CAMINHO_IMG_DCT.get(caracter, TRANSPARENTE))
25+
# return img
26+
27+
28+
def ator_para_cooredenadas(ator):
29+
return ator.x, ator.y
30+
31+
32+
def criar_imagem(canvas, ator):
33+
imagem = get_imagem(ator.caracter(0))
34+
return imagem, canvas.create_image(ator_para_cooredenadas(ator),
35+
image=imagem,
36+
anchor=NW)
37+
38+
39+
class FaseTk(Fase):
40+
def __init__(self, canvas):
41+
super().__init__()
42+
self.canvas = canvas
43+
44+
def _adicionar_ator(self, lista, *atores):
45+
super()._adicionar_ator(lista, *atores)
46+
for ator in atores:
47+
ator.img, ator.img_id = criar_imagem(self.canvas, ator)
48+
49+
def _transformar_em_ponto(self, ator, tempo):
50+
ponto = super()._transformar_em_ponto(ator, tempo)
51+
ponto.canvas_img = ator.img
52+
ponto.canvas_img_id = ator.img_id
53+
ponto.new_photo_img = get_imagem(ponto.caracter)
54+
return ponto
55+

images/transparente.gif

58 Bytes
Loading

placa_grafica.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import platform
44
import time
55
import sys
6+
from templates import FIM
67

78
try:
89
import msvcrt

placa_grafica_tkinter.py

Lines changed: 40 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
#coding: utf-8
1+
# coding: utf-8
22
import time
33

44
from tkinter import *
55
from tkinter import ttk
66
from fase import Fase
77
from atores import PassaroVermelho, PassaroAmarelo, Porco, Obstaculo
8+
from fase_tkinter import FaseTk
89

910

1011
def get_angulo(event):
@@ -13,31 +14,10 @@ def get_angulo(event):
1314
popup_angulo.destroy()
1415

1516

16-
root = Tk()
17-
root.title("Python Birds")
18-
root.geometry("800x600")
19-
root.resizable(0, 0)
17+
ALTURA_DA_TELA = 600 # px
2018

21-
stage = Canvas(root, width=800, height=600)
22-
bg_image = PhotoImage(file="images/background.gif")
23-
stage.create_image((0, 0), image=bg_image, anchor=NW)
24-
stage.pack()
2519

26-
passaro_vermelho_img = PhotoImage(file="images/passaro_vermelho.gif")
27-
passaro_vermelho = stage.create_image((40, 482), image=passaro_vermelho_img, anchor=NW)
2820

29-
passaro_amarelo_img = PhotoImage(file="images/passaro_amarelo.gif")
30-
passaro_amarelo = stage.create_image((30, 482), image=passaro_amarelo_img, anchor=NW)
31-
32-
passaro_amarelo2 = stage.create_image((20, 482), image=passaro_amarelo_img, anchor=NW)
33-
34-
porco_img = PhotoImage(file="images/porco.gif")
35-
porco = stage.create_image((700, 482), image=porco_img, anchor=NW)
36-
37-
porco2 = stage.create_image((480, 482), image=porco_img, anchor=NW)
38-
39-
obstaculo_img = PhotoImage(file="images/obstaculo.gif")
40-
obstaculo = stage.create_image((300, 300), image=obstaculo_img, anchor=NW)
4121

4222

4323
# popup_angulo = Toplevel(root)
@@ -48,59 +28,56 @@ def get_angulo(event):
4828
# b.pack(pady=5)
4929

5030

51-
def mover(obj, x, y):
52-
stage.move(obj, x, y)
53-
stage.update()
5431

55-
tempo = 0
56-
passo = 0.1
57-
delta_t = 0.1
5832

59-
passaros = [passaro_vermelho, passaro_amarelo]
60-
fase = None
6133

62-
ultima_posicao = {}
6334

64-
def mover(canvas_id, posicao_atual, proxima_posicao):
65-
if proxima_posicao.y == 0:
66-
return
35+
def plotar(canvas, ponto):
36+
multiplicador = 10 # 10 px/m
37+
x = multiplicador * ponto.x
38+
y = ALTURA_DA_TELA - ponto.y * multiplicador - 11 * multiplicador
39+
canvas.coords(ponto.canvas_img_id, (x, y))
6740

68-
x = posicao_atual.x - proxima_posicao.x
69-
y = posicao_atual.y - proxima_posicao.y
70-
stage.move(canvas_id, -x * 30, y * 30)
7141

72-
def animar():
73-
global tempo, delta_t, fase
74-
tempo += delta_t
75-
time.sleep(passo)
76-
pontos_cartesianos = fase.calcular_pontos(tempo)
77-
for ponto in pontos_cartesianos:
78-
canvas_id = ponto.canvas
79-
ultima_posicao[canvas_id] = ultima_posicao.get(canvas_id, ponto)
80-
mover(canvas_id, ultima_posicao[canvas_id], ponto)
81-
#verificar aqui colisão
42+
def animar(tela,fase,passo=0.1, delta_t=0.1):
43+
tempo=0
44+
def _animar():
45+
nonlocal tempo
46+
tempo += delta_t
47+
time.sleep(passo)
48+
for ponto in fase.calcular_pontos(tempo):
49+
plotar(fase.canvas, ponto)
50+
tela.after(1, _animar)
8251

8352

84-
ultima_posicao[canvas_id] = ponto
8553

86-
root.after(1, animar)
54+
tela.after(1, _animar)
55+
tela.mainloop()
8756

8857

89-
fase = Fase()
90-
passaros = [PassaroVermelho(3, 3, passaro_vermelho), PassaroAmarelo(3, 3, passaro_amarelo), PassaroAmarelo(3, 3, passaro_amarelo2)]
91-
porcos = [Porco(78, 1, porco), Porco(78, 1, porco2)]
92-
obstaculos = [Obstaculo(31, 10, obstaculo)]
58+
if __name__ == '__main__':
59+
root = Tk()
60+
root.title("Python Birds")
61+
root.geometry("800x600")
62+
root.resizable(0, 0)
9363

94-
fase.adicionar_passaro(*passaros)
95-
fase.adicionar_porco(*porcos)
96-
fase.adicionar_obstaculo(*obstaculos)
64+
stage = Canvas(root, width=800, height=ALTURA_DA_TELA)
65+
bg_image = PhotoImage(file="images/background.gif")
66+
stage.create_image((0, 0), image=bg_image, anchor=NW)
67+
stage.pack()
68+
fase = FaseTk(stage)
69+
passaros = [PassaroVermelho(3, 3), PassaroAmarelo(3, 3), PassaroAmarelo(3, 3)]
70+
porcos = [Porco(75, 1), Porco(70, 1)]
71+
obstaculos = [Obstaculo(31, 10)]
9772

73+
fase.adicionar_passaro(*passaros)
74+
fase.adicionar_porco(*porcos)
75+
fase.adicionar_obstaculo(*obstaculos)
9876

99-
fase.lancar(45, 1)
100-
fase.lancar(64, 2)
101-
fase.lancar(23, 3)
77+
fase.lancar(45, 1)
78+
fase.lancar(64, 2)
79+
fase.lancar(23, 3)
10280

103-
root.after(1, animar)
104-
root.mainloop()
81+
animar(root,fase)
10582

106-
# root.wait_window(popup_angulo)
83+
# root.wait_window(popup_angulo)

0 commit comments

Comments
 (0)