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:

  1. Limpar as classes
  2. Vários aviões
  3. Múltiplos tiros.
  4. Generalizar os objetos do jogo em uma super classe.
  5. Exibir um placar
  6. Atribuir teclas para atirar e jogar de novo ou sair.

Até o próximo!