Desenvolvimento de Jogos em Python — Parte 5 da série Herez
Visão geral: esta é a quinta publicação da série Herez sobre bibliotecas Python. Aqui detalhamos as ferramentas mais usadas para criar jogos em Python: PyGame, Pyglet, PyOpenGL, Arcade e Panda3D. Cada seção traz descrição, motivos para usar, instalação, exemplos de uso e um jogo simples completo que foi aplicado em projetos reais da Herez. Os projetos e exemplos completos estão disponíveis nos repositórios GitHub e GitLab da Herez.
Publicado por Herez em
Como usar este post
Use este guia para escolher a biblioteca certa, copiar trechos de código e rodar jogos simples localmente. Todos os exemplos foram testados em projetos reais da Herez; os repositórios contêm código-fonte, assets e instruções de execução.
Resumo rápido
| Biblioteca | Foco | Quando usar |
|---|---|---|
| PyGame | 2D clássico | Jogos 2D, protótipos e ensino |
| Pyglet | 2D/3D leve | Aplicações multimídia e OpenGL direto |
| PyOpenGL | OpenGL puro | Gráficos 3D customizados e engines |
| Arcade | 2D moderno | Jogos 2D com API simples e performance |
| Panda3D | 3D completo | Jogos 3D, simulações e aplicações interativas |
Bibliotecas detalhadas com jogos simples completos
PyGame
O que é: biblioteca clássica para desenvolvimento de jogos 2D em Python, com suporte a gráficos, som, entrada e temporização.
# Instalação
pip install pygame
import pygame, random, sys
pygame.init()
W, H = 640, 480
screen = pygame.display.set_mode((W,H))
clock = pygame.time.Clock()
player = pygame.Rect(W//2-25, H-60, 50, 50)
balls = []
score = 0
FONT = pygame.font.SysFont(None, 36)
while True:
for e in pygame.event.get():
if e.type == pygame.QUIT:
pygame.quit(); sys.exit()
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]: player.x -= 5
if keys[pygame.K_RIGHT]: player.x += 5
if random.random() < 0.02:
balls.append(pygame.Rect(random.randint(0,W-20), -20, 20, 20))
for b in balls[:]:
b.y += 5
if b.colliderect(player):
score += 1; balls.remove(b)
elif b.y > H:
balls.remove(b)
screen.fill((30,30,40))
pygame.draw.rect(screen, (200,50,50), player)
for b in balls: pygame.draw.ellipse(screen, (50,200,50), b)
screen.blit(FONT.render(f'Score: {score}', True, (255,255,255)), (10,10))
pygame.display.flip()
clock.tick(60)
Contexto Herez: versão usada em workshops internos para ensinar game loop, colisões e input; projeto completo com assets e testes está nos repositórios Herez.
Pyglet
O que é: biblioteca leve para multimídia e jogos, com integração direta a OpenGL e suporte a áudio, janelas e eventos.
# Instalação
pip install pyglet
import pyglet, random
window = pyglet.window.Window(640,480)
batch = pyglet.graphics.Batch()
player = pyglet.shapes.Rectangle(300,20,40,40,color=(50,150,255),batch=batch)
asteroids = []
label = pyglet.text.Label('Score: 0', x=10, y=450)
score = 0
@window.event
def on_draw():
window.clear()
batch.draw()
label.draw()
def update(dt):
global score
if random.random() < 0.02:
asteroids.append(pyglet.shapes.Circle(random.randint(0,640),480,10,color=(200,50,50),batch=batch))
for a in asteroids[:]:
a.y -= 200*dt
if a.y < 0:
asteroids.remove(a)
a.delete()
if a.x > player.x and a.x < player.x+40 and a.y < 60:
score += 1
asteroids.remove(a)
a.delete()
label.text = f'Score: {score}'
pyglet.clock.schedule_interval(update, 1/60.0)
pyglet.app.run()
Contexto Herez: usado em protótipos que exigiam integração OpenGL simples; código e variações estão nos repositórios Herez.
PyOpenGL
O que é: bindings Python para OpenGL, permitindo controle direto do pipeline gráfico para criar gráficos 3D customizados.
# Instalação
pip install PyOpenGL PyOpenGL_accelerate
from OpenGL.GL import *
from OpenGL.GLUT import *
angle = 0.0
def display():
global angle
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
glRotatef(angle, 0, 0, 1)
glBegin(GL_TRIANGLES)
glColor3f(1,0,0); glVertex2f(0,0.6)
glColor3f(0,1,0); glVertex2f(-0.6,-0.6)
glColor3f(0,0,1); glVertex2f(0.6,-0.6)
glEnd()
glutSwapBuffers()
angle += 0.5
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA)
glutInitWindowSize(600,600)
glutCreateWindow(b'Rotating Triangle')
glutDisplayFunc(display)
glutIdleFunc(display)
glutMainLoop()
Contexto Herez: usado para prototipar shaders e efeitos gráficos; exemplos de integração com engines estão nos repositórios Herez.
Arcade
O que é: biblioteca moderna para jogos 2D com API simples, boa performance e integração com OpenGL via pyglet.
# Instalação
pip install arcade
import arcade
SCREEN_W, SCREEN_H = 800, 600
class MyGame(arcade.Window):
def __init__(self):
super().__init__(SCREEN_W, SCREEN_H, "Space Shooter")
self.player = arcade.SpriteSolidColor(50,30,arcade.color.BLUE)
self.player.center_x = SCREEN_W//2; self.player.center_y = 50
self.bullets = arcade.SpriteList()
def on_draw(self):
arcade.start_render()
self.player.draw()
self.bullets.draw()
def on_update(self, dt):
self.bullets.update()
for b in self.bullets:
b.center_y += 5
if b.center_y > SCREEN_H: b.kill()
def on_key_press(self, key, modifiers):
if key == arcade.key.SPACE:
bullet = arcade.SpriteSolidColor(5,10,arcade.color.YELLOW)
bullet.center_x = self.player.center_x; bullet.center_y = self.player.center_y+20
self.bullets.append(bullet)
if __name__ == '__main__':
game = MyGame()
arcade.run()
Contexto Herez: usado para protótipos educacionais e jogos 2D com física simples; projetos completos com assets estão nos repositórios Herez.
Panda3D
O que é: engine 3D completa com renderização, física básica, sistema de cenas e ferramentas para jogos e simulações interativas.
# Instalação
pip install panda3d
from direct.showbase.ShowBase import ShowBase
from panda3d.core import AmbientLight, DirectionalLight
class MyApp(ShowBase):
def __init__(self):
super().__init__()
self.scene = self.loader.loadModel('models/box')
self.scene.reparentTo(self.render)
self.scene.setPos(0, 10, 0)
self.taskMgr.add(self.spin, 'spinTask')
def spin(self, task):
self.scene.setH(task.time * 60 % 360)
return task.cont
app = MyApp()
app.run()
Contexto Herez: usado em protótipos 3D e simulações interativas; cenas, modelos e scripts de build estão nos repositórios Herez.
Comparação prática
| Critério | PyGame | Arcade | Pyglet / PyOpenGL | Panda3D |
|---|---|---|---|---|
| Foco | 2D clássico | 2D moderno | Multimídia / OpenGL | 3D engine completa |
| Curva de aprendizado | Baixa | Baixa | Média | Média a alta |
| Ideal para | Educação e protótipos | Jogos 2D com performance | Gráficos customizados | Jogos 3D e simulações |
| Escalabilidade | Média | Média | Alta (com OpenGL) | Alta |
Boas práticas Herez para desenvolvimento de jogos em Python
- Comece simples: valide mecânicas com um protótipo 2D antes de investir em 3D.
- Organize assets: mantenha sprites, sons e níveis em pastas versionadas; use formatos otimizados para deploy.
- Ambientes e dependências: use ambientes virtuais e registre versões em
requirements.txtpara reprodutibilidade. - Performance: profile o jogo; mova lógica crítica para C/C++ ou use bibliotecas aceleradas quando necessário.
- Testes e CI: automatize testes de integração e builds; inclua smoke tests que executem o loop principal por alguns frames.
- Repositórios Herez: jogos completos, assets e instruções de execução usados em projetos reais da Herez estão disponíveis nos repositórios GitHub e GitLab da Herez.
Próximo post da série
No próximo artigo cobriremos bibliotecas Python para Web Scraping, com exemplos práticos, estratégias éticas e pipelines para transformar dados brutos em insights.

