Pygame

Origem: Wikipédia, a enciclopédia livre.
Pygame
Desenvolvedor Pygame Community
Versão estável 2.0.1 (24 de dezembro de 2009)
Idioma(s) inglês
Escrito em C++ e Python
Sistema operativo Multiplataforma
Gênero(s) Motor de jogo
Licença LGPL
Estado do desenvolvimento Ativo
Tamanho
Página oficial www.pygame.org
Exemplo de programa Hello World criado em Python com o módulo Pygame.

Pygame é uma biblioteca de jogos multiplataforma (independente de sistema operacional) feita para ser utilizada em conjunto com a linguagem de programação Python. O seu nome tem origem da junção de Py, proveniente de Python e Game, que significa Jogo, ou seja, Jogos em Python.

Pygame se baseia na ideia de que as tarefas mais intensivas a nível computacional em um jogo podem ser abstraídas separadamente da lógica principal, ou seja, o uso de memória e CPU (úteis para processar imagens e sons) são tratados pelo próprio código do Pygame e não pelo código do seu jogo. Assim, torna-se possível utilizar uma linguagem de alto nível, como Perl, Lua ou Python para organizar a estrutura do jogo em si.

História[editar | editar código-fonte]

O desenvolvimento da biblioteca Pygame começou no ano 2000 por Pete Shinners que, familiarizado com a linguagem de programação C, descobriu a linguagem Python e a biblioteca SDL (Simple Directmedia Library) ao mesmo tempo.

A SDL é uma biblioteca escrita em linguagem C que controla os recursos de multimídia e é utilizada por várias aplicações de código-aberto e por aplicações comerciais empresariais.

A descontinuidade da implementação da SDL em Python por Mark Baker denominada PySDL inspirou-o a começar um projeto robusto, também em Python, sob a SDL, chamada Pygame.

Sua intenção era

[1]

O que é Python[editar | editar código-fonte]

Ver artigo principal: Python

Python é uma linguagem de alto-nível interpretada, interativa, orientada a objetos, de tipagem dinâmica e forte.

A linguagem foi projetada com a filosofia de enfatizar a importância do esforço do programador sobre o esforço computacional. Prioriza a legibilidade do código sobre a velocidade ou expressividade. Combina uma sintaxe concisa e clara com os recursos poderosos de sua biblioteca padrão e por módulos e frameworks desenvolvidos por terceiros.

Pete Shinners, quando começou a desenvolver o Pygame, afirmou, sobre o modo como Python facilita a programação, que "queria um projeto que realmente tirasse proveito de Python"[1] e queria que os módulos do Pygame também explicitassem essa clareza e simplicidade.

O que é SDL[editar | editar código-fonte]

Ver artigo principal: SDL

Simple DirectMedia Layer (SDL) é uma biblioteca multimídia e multiplataforma escrita em C, possui interfaces para outras linguagens de programação, como Ada, Eiffel, Java, Lua, ML, Perl, PHP, Ruby e também para Python, que cria uma abstração em várias plataformas de gráficos, sons, e entrada de APIs, tornando possível ao programador escrever um jogo de computador ou outra aplicação multimedia já que pode rodar em vários tipos de sistema operacionais. Gerencia video, eventos, audio digital, CD-ROM, som, threads, processamento de objetos compartilhados, rede e tempo.

Pygame é um jogo?[editar | editar código-fonte]

Pygame é um "motor de jogo" ou em inglês "game engine". Um motor de jogo é um software ou um conjunto de bibliotecas usado na simplificação do desenvolvimento de jogos, por exemplo, para videogames e computadores.

As funcionalidades típicas fornecidas por um motor de jogo incluem o mecanismo de renderização (ou rendering engine) para gráficos 2D ou 3D, um mecanismo de detecção de colisão, suporte a sons, uma linguagem de script, suporte à animação, inteligência artificial e jogos pela internet.

Ou seja, é utilizado um motor de jogo que contém todas as funções visuais e de processamento como base do código, e a essência do jogo como a estratégia, o design e a ideia principal que serão realmente pensadas e estudadas para o jogo.

Eventos essenciais[editar | editar código-fonte]

Abaixo, apresentam-se alguns dos eventos mais importantes na concepção de um jogo, como cores, superfície, manipulação da tela ou sons.

  • Surface são as superfícies em 2D ou 3D onde se desenha o jogo, podendo preencher uma área com uma cor ou mudar a cor da superfície dependendo da posição, e outros recursos como transparência.
  • Display é o eventos para manipulação da tela do jogo, podendo atualizar o conteúdo da tela, retornar a superfície que representa a tela ou configurar o tamanho da tela.
  • draw são os desenhos na superfície, em linha, círculo, retângulo ou polígono.
  • image são as imagens, podendo ler ou gravar as imagens.
  • event são os eventos de um jogo, algumas operações como o poll() retorna o próximo evento da fila de eventos ou post() que coloca um evento na fila.
  • font é utilizado para trabalhar com fontes TrueType, podendo utilizar o render() para retornar uma superfície com o teto desenhado ou size() que calcula o tamanho da superfície que irá escrever nela.
  • transform pode rotacionar, espelhar, modificar ou cortar as superfícies do jogo.
  • mixer trabalha com com os sons do jogo.
  • Clock trabalha com o tempo dos quadros do jogo.
  • sprite é uma imagem bi-dimensional que faz parte de uma cena maior, isto é, os componentes que aparecem no jogo. Podendo se dividir em Sprite e Group, a classe Group serve para agrupar vários Sprites.

Detectando colisões durante um jogo[editar | editar código-fonte]

A detecção de colisão é um dos recursos mais utilizados em jogos. A colisão entre objetos de um jogo acontece porque dentro do jogo não há formas físicas, logo, se o código do jogo não prevê quando um objeto se sobrepõe a outro, o jogo terá, certamente, defeitos.

Exemplificando: se no jogo Super Mario não estivesse prevista a colisão do "Mario" com a parede, o Mario iria passar por dentro da parede e o jogo estaria com um sério problema de colisão. Como a colisão é tratada, o Mario não pode ultrapassar os limites exteriores da parede, tendo obrigatoriamente de pular ou passar por cima dela.

A implementação de colisões pode ser dada de várias formas, o Projeto de um Jogo de Tiro ao Alvo 3D [2] explica que uma das formas de tratar a colisão recorre à técnica de volumes envoltórios de esféricos. Todo objeto de um "Sprite" ou de um "Group" será associado a um esfera com centro no centróide do objeto e com raio igual à distância entre o centróide do objeto e o ponto do objeto mais distante do centróide, com um fator de escala aplicado para reduzir um pouco esse raio, para que o volume não seja muito maior que o objeto, caso este apresente uma dimensão bem maior que as outras.

Desta forma, para verificar uma colisão basta saber se a distância entre os centróides de dois objetos é maior que a soma dos raios de suas respectivas esferas envoltórias, se a distância é menor, os dois objetos colidiriam.

No Pygame existem dois recursos para o tratamento de colisões: um é o "spritecollide" que detecta a colisão do "Sprite" com os elementos do grupo, e o "groupcollide" que detecta a colisão dos "Sprites" de cada "Group" do jogo.

Visão geral do código[editar | editar código-fonte]

Pygame é escrito em Linguagem C e Python, necessitando de recursos da SDL como o SDL 1.2.6, SDL_image 1.2.3, SDL_ttf 2.0.6, SDL_mixer 1.2.5 e SMPEG 0.4.4 e Numeric 23.0.[3]

Abaixo, apresenta-se um resumo sobre os módulos que o Pygame contém para o desenvolvimento de jogos.[1]

  • cdrom: gerencia o dispositivo de cdrom e a execução do áudio.
  • cursors: carrega imagens de cursores como mouse.
  • display: controle a exibição da tela ou janela.
  • draw: desenha formas simples sobre uma superfície.
  • event: controla eventos e a fila de eventos.
  • font: cria e renderiza fontes Truetype.
  • image: grava e carrega imagens.
  • joystick: controla dispositivos de joystick.
  • key: controla o teclado.
  • mouse: controla o mouse.
  • movie: executa filmes no formato mpeg.
  • sndarray: manipula sons com Numeric.
  • surfarray: manipula imagens com Numeric.
  • time: controla o tempo dos eventos.
  • transform: escalar, rotacionar e girar imagens.

Exemplos de códigos[editar | editar código-fonte]

Abaixo um código de exemplo obtido do site oficial do pygame,[1] faz uma animação de uma bola saltando.

import sys, pygame

pygame.init()
size = width, height = 320, 240
speed = [2, 2]
black = 0, 0, 0

screen = pygame.display.set_mode(size)  # define o tamanho da tela
ball = pygame.image.load("ball.bmp")    # carrega a imagem da bola
ballrect = ball.get_rect()
while 1:                                # cria um loop infinito
    for event in pygame.event.get():    # se houver algum evento do usuário,
        if event.type == pygame.QUIT:   # o programa termina
           sys.exit()

# movimentação da bola e atualização da tela
    ballrect = ballrect.move(speed)
    if ballrect.left < 0 or ballrect.right > width:
       speed[0] = -speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
       speed[1] = -speed[1]

    screen.fill(black)
    screen.blit(ball, ballrect)
    pygame.display.flip()

Outros exemplos de códigos:

Lentidão do Python[editar | editar código-fonte]

Um dos grandes problemas do Python é sua lentidão no processamento de imagens e iterações..[4] Depois de descobrir onde está a lentidão do programa com recursos próprios da linguagem Python como "timeit", "profile" ou hotshot", uma das soluções mais utilizadas é escrever uma extensão em linguagem C do código lento do seu programa em Python.

Outra solução para otimizar sua aplicação é o uso de um compilador JIT para o Python, como por exemplo, o programa "Psyco" que gera um ganho de 4 vezes mais velocidade mas utiliza muita memória do computador.[5]

Comparação entre motores de jogos[editar | editar código-fonte]

Geral ¹ OGRE Panda3D RPG Toolkit Crystal Space Game Blender Pygame GTGE APOCALYX
Site do Projeto
(Home page)
[1] [2] [3] [4] [5] [6] [7] [8]
Licença LGPL Panda 3D Public License [9] GNU GPL ² LGPL GNU GPL LGPL Creative Commons GNU GPL
Código interno c++ C++ C++ e Visual Basic C++ C++ C++ e Python Java C++
Compatibilidade OpenGL e DirectX OpenGL e DirectX OpenGL, SDL, X11 e SVGALib. OpenGL e OpenAL SDL OpenGL OpenGL e OpenAL
Sistemas operacionais Windows, Linux e MacOS Windows e Linux Windows Multiplataforma Multiplataforma Multiplataforma Multiplataforma Windows
Linguagem de desenvolvimento C++ C++ e Python RPG Code Python, Perl e Java Python Python Java Lua
  1. Informações obtidas diretamente dos sites dos projetos.
  2. A versão 3.0.7 será lançada sobre a licença GNU GPL. Versões anteriores (3.0.2 à 3.0.6) estão sobre a licença ACOL.

Jogos desenvolvidos com Pygame[editar | editar código-fonte]

Referências

Ver também[editar | editar código-fonte]

Ligações externas[editar | editar código-fonte]