Desenvolvimento de Jogos em Python — Guia Herez (Parte 5)

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 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
PyGame2D clássicoJogos 2D, protótipos e ensino
Pyglet2D/3D leveAplicações multimídia e OpenGL direto
PyOpenGLOpenGL puroGráficos 3D customizados e engines
Arcade2D modernoJogos 2D com API simples e performance
Panda3D3D completoJogos 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
Jogo simples completo: “Catch the Ball” (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
Jogo simples completo: “Asteroid Lite” (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
Jogo simples completo: "Rotating Triangle" (PyOpenGL)
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
Jogo simples completo: "Space Shooter" (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
Jogo simples completo: "3D Spinner" (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
Foco2D clássico2D modernoMultimídia / OpenGL3D engine completa
Curva de aprendizadoBaixaBaixaMédiaMédia a alta
Ideal paraEducação e protótiposJogos 2D com performanceGráficos customizadosJogos 3D e simulações
EscalabilidadeMédiaMédiaAlta (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.txt para 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.
Dica Herez: para aprender rápido, implemente o jogo "Catch the Ball" em PyGame e depois reimplemente em Arcade para comparar APIs e performance.

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.

Excerpt: Parte 5 da série Herez — guia prático de bibliotecas Python para desenvolvimento de jogos com exemplos completos e jogos simples usados em projetos reais.

Tags: Desenvolvimento de Jogos; Python; PyGame; Arcade