Novo Blog

Novo endereço

https://blog.nilo.pro.br

sábado, 21 de maio de 2016

Convertendo um jogo escrito em Basic para Python - Parte II

Leia no novo blog

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, ao invés 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!


Nenhum comentário: