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...")