Capítulo 15 - Jogada de cobra

Como você já deve imaginar, para desenvolver jogos com a linguagem Python você terá que usar o comando import para carregar uma biblioteca que propicie as funcionalidades necessárias para a sua nova tarefa. Você está correto!

Atenção: O serviço de compartilhamento utilizado para armazenar os arquivos desse livro, o UbuntuOne, foi descontinuado. O novo link para as imagens usadas neste programa são os seguintes:

raquete.png
bola.png

O programa bola.py:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
# 
# bola.py - versão 0.6 - Cesar Brod 
# 
# Para executar esse programa, você deve ter a linguagem Python 
# instalada em seu sistema, assim como a biblioteca Pygame. 
# 
# Usuários de sistemas Debian e seus derivados podem usar seu 
# gerenciador de pacotes e instalar python e python-pygame ou, na linha 
# de comandos digitar: 
# 
# sudo apt-get install python python-pygame 
# 
# As imagens utilizadas devem ser baixadas dos links
# fornecidos no início dessa página
# (certifique-se de colocá-las na mesma pasta onde baixou este programa) 
# 
# 
# Execute o programa, na pasta onde o baixou, com o comando 
# 
# python bola.py 
# 
# Este programa foi desenvolvido para o livro "De Tartaruga à Cobra - 
# programação e arte", de Cesar Brod, Editora Novatec, São Paulo, 2013. 
# 
# Este programa amplia o inicialmente apresentado por Pete Shinners em seu 
# artigo "Python Pygame Introduction" -  
# (http://www.pygame.org/docs/tut/intro/intro.html) 
# 
# O programa bola.py é um exemplo simples de animação com a biblioteca de 
# funções Pygame (http://www.pygame.org) para o desenvolvimento de jogos. 
# Além de carregar a biblioteca pygame, carregamos também a função sleep 
# da biblioteca de funções time e a biblioteca sys, para tratar eventos 
# do sistema. 

import sys  # reconhece eventos do sistema 
from time import sleep 
import pygame 
from pygame.locals import *  # constantes para a interação com o sistema 
pygame.init()  # inicializa as funções da biblioteca Pygame 

tamanho = largura, altura = 500, 420  # define o tamanho da tela 
velocidade = [1, 1]  # define a velocidade inicial de deslocamento em x, y 
raquete_centro = [250, 410]  # coordenadas iniciais do centro da raquete
gravidade = 1  # define o aumento da velocidade em y, simulando a gravidade 
preto = 0, 0, 0  # RGB para a cor preta 
cenario = pygame.display.set_mode(tamanho)  # cria o cenário do jogo 

# Cria o elemento bola e o retângulo que o emoldura 

bola = pygame.image.load("bola.png") 
bolarect = bola.get_rect()  

# Cria o elemento raquete, o retângulo que o emoldura e posiciona seu centro 
# nas coordenadas 250, 410 (centro, inferior da tela) 

raquete = pygame.image.load("raquete.png") 
raqueterect = raquete.get_rect() 
raqueterect.center = (250, 410) 

while 1:  # Repetição infinita, qualquer condição que seja sempre verdadeira 

# As linhas abaixo verificam se a ação de fechamento da janela (QUIT) foi 
# chamada e, caso positivo, fecha o programa 

    for event in pygame.event.get(): 
        if event.type == pygame.QUIT: 
            sys.exit()

# Não permite que a bola "caia" abaixo do limite da tela 

    if bolarect.bottom > altura: 
        bolarect.bottom = altura 

# Move a bola em x e y, de acordo com o que foi definido no vetor velocidade 

    bolarect = bolarect.move(velocidade) 

# Testa se a bola está tocando na raquete (se a parte de baixo da bola, 
# "bolarect.bottom" toca ou passa do topo da raquete "raqueterect.top), com 
# lógica idêntica para os limites laterais da raquete. A condição "and" 
# faz com que todas as condições tenham que ser atendidas simultaneamente. 
# Caso isso aconteça, a bola muda de direção (velocidade[1] muda de sinal) e 
# a bola recebe um "impulso". Experimente com o valor 1.5 abaixo, ou 
# coloque-o em uma variável chamada "impulso", por exemplo. 

    if bolarect.bottom >= raqueterect.top and bolarect.right >= raqueterect.left and bolarect.left <= raqueterect.right: 
        velocidade[1] = -velocidade[1] 
        velocidade[1] = velocidade[1] - 1.5 * gravidade 

# *** PAUSA *** 
# A linha abaixo introduz uma pausa que pode ser interessante em casos de 
# teste. Para que a pausa aconteça, remova o # do começo da linha a seguir. 
#        raw_input("Presione Enter para continuar...") 

# Caso contrário, apenas testa se a bola bate nas laterais da janela, 
# trocando a direção de sua velocidade no eixo x (velocidade[0]) 
# ou no eixo y (velocidade[1]) quando apropriado. 

    else: 
        if bolarect.left < 0 or bolarect.right > largura: 
            velocidade[0] = -velocidade[0] 
        if bolarect.top < 0 or bolarect.bottom > altura: 
            velocidade[1] = -velocidade[1] 

# Se a velocidade no eixo y for positiva, a bola está caindo e, por isso, a 
# velocidade é acrescida do valor da gravidade. Na subida da bola (velocidade 
# negativa (a condição else), ainda desaceleramos a bola em um fator de 10%, 
# o multiplicador 1.1. 

        if velocidade[1] >= 0: 
            velocidade[1] = velocidade[1] + gravidade 
        else: 
            velocidade[1] = velocidade[1] + 1.1*gravidade 

# As linhas abaixo foram usadas na depuração do programa e exibem a posição da 
# bola e da raquete. Descomente-as se quiser exibir estas variáveis. Use-as em 
# conjunto com as porções do programa identificadas com *** PAUSA *** 
 
#    print 'bolarect.left = ' + str(bolarect.left) + ' | bolarect.right = ' + str(bolarect.right) + ' | bolarect.bottom = ' + str(bolarect.bottom) 
#    print 'raqueterect.left = ' + str(raqueterect.left) + ' | raqueterect.right = ' + str(raqueterect.right) + ' | raqueterect.top = ' + str(raqueterect.top) 

# Habilita a verificação de teclas pressionadas 
    tecla = pygame.key.get_pressed() 
# Usa as setas para mover a raquete 
    if (tecla[K_LEFT]): 
        raquete_centro[0] = raquete_centro[0] - 1 
    elif (tecla[K_RIGHT]): 
        raquete_centro[0] = raquete_centro[0] + 1 
    raqueterect.center = (raquete_centro[0], raquete_centro[1])

    cenario.fill(preto)  # pinta o cenário de preto 
    cenario.blit(bola, bolarect)  # coloca a bola no cenário, posição bolarect 
    cenario.blit(raquete, raqueterect)  # idem para a raquete 
    pygame.display.flip()  # imprime o cenário atualizado 
    sleep(0.02)  # pausa por 20 milissegundos (para melhorar a visualização) 

# *** PAUSA *** 
# Para rodar seu programa passo-a-passo, remova o # do início da linha abaixo 
#        raw_input("Presione Enter para continuar...") 

Atenção: O serviço de compartilhamento utilizado para armazenar os arquivos desse livro, o UbuntuOne, foi descontinuado. O novo link para os arquivos referenciados no livro são os seguintes:

raquete.png
bola.png
imagem da máquina virtual
explode.tar.bz2
bolas.tar.bz2



Design: Dobro Comunicação. Desenvolvimento: Brod Tecnologia. Powered by Drupal