Convertendo um jogo escrito em Basic para Python - Parte II
Neste segundo post, vamos melhorar nosso jogo.
Embora a nova versão rode em Python, ainda está muito anos 80.
A primeira coisa a corrigir é a animação. Como estamos usando um sistema
de coordenadas de 280 por 192 pontos para simular as coordenadas do
Apple, multiplicamos cada coordenada por 4 na hora de desenhar. Para
deixar parecido com o Apple, eu reduzi o número de frames a 8 frames por
segundo. Por isso a animação dá tantos saltos! Para fazer com que rode a
60 frames, temos que multiplicar as velocidades pela razão entre o
número de frames antigos e o novo: 8/60. A nova versão define algumas
constantes para isso:
FRAMES_ORIGINAL = 8
FRAMES_NOVO = 60
RATIO = FRAMES_ORIGINAL / FRAMES_NOVO
Olhando o código, fica fácil perceber que o tiro, o avião e as bases são objetos. Vamos extrair o código do jogo e dividir as operações em atualiza e desenha. No caso, atualiza calcula a nova posição do objeto e desenha realiza o desenho em si.
class Aviao:
def __init__(self, jogo, cor=3):
self.cor = cor
self.velocidade_aviao = (random.randint(0, 6) + 4) * RATIO
self.altura_do_aviao = 159 - (random.randint(0, 135) + 11)
self.posicao_do_aviao = self.velocidade_aviao
self.ativo = True
self.jogo = jogo
def desenha(self):
y = self.altura_do_aviao
x = self.posicao_do_aviao
set_color(self.cor)
pyglet.graphics.draw(6, pyglet.gl.GL_LINE_LOOP,
('v2f', (x, y,
x, y - 8,
x + 3, y - 2,
x + 12, y - 2,
x + 14, y,
x, y)))
def desativa(self):
self.ativo = False
self.jogo.desativa(self)
def atualiza(self):
self.posicao_do_aviao += self.velocidade_aviao
if self.posicao_do_aviao > 265:
self.desativa()
O código completo pode ser visto aqui:
Tente entender como a forma de desenhar em etapas, separando o desenho da atualização, permite que exibamos a mensagem com a imagem do jogo no fundo, em vez da tela preta..
Os próximos passos são:
- Limpar as classes
- Vários aviões
- Múltiplos tiros.
- Generalizar os objetos do jogo em uma super classe.
- Exibir um placar
- Atribuir teclas para atirar e jogar de novo ou sair.
Até o próximo!