Criando um dragão que segue o mouse com Pyrtugues e Pygame 🐉
Já imaginou criar um jogo usando comandos de programação em português?
Neste tutorial, vamos criar um pequeno projeto gráfico com Pyrtugues e Pygame: um dragão esmeralda que segue o mouse, com corpo sinuoso, asas roxas, chifres dourados e olhos brilhantes. ✨
A ideia é aprender programação fazendo algo visual, sem depender de imagens prontas. O dragão será desenhado usando formas geométricas, cores e coordenadas.
🐍 O que é o Pyrtugues?
O Pyrtugues é um projeto educacional de programação baseado na lógica do Python. Ele permite escrever código com comandos em português e traduzi-lo para Python.
Por exemplo:
mostrar("Olá, mundo!")
É traduzido para:
print("Olá, mundo!")
Isso permite aprender conceitos de programação em português enquanto você acompanha como eles aparecem no Python.
🎮 O que vamos criar?
Nosso projeto terá:
- Um dragão verde com detalhes brilhantes.
- Um corpo que acompanha o caminho percorrido pelo mouse.
- Asas roxas e espinhos ao longo do corpo.
- Olhos dourados e chifres.
- Um céu escuro com estrelas.
- Um controle simples para fechar a janela.
Tudo será desenhado pelo Pygame, então não precisamos baixar sprites ou imagens externas.
🛠️ Antes de começar
Este exemplo é voltado à versão Desktop do Pyrtugues, utilizando a integração com Pygame.
Você pode encontrar o código-fonte e as instruções de instalação no repositório oficial do Pyrtugues.
A disponibilidade dos recursos pode variar conforme a versão do tradutor e o ambiente. O exemplo utiliza os aliases de Pygame documentados no código do projeto.
💻 Código completo
Crie um arquivo de código no Pyrtugues Desktop e experimente o seguinte exemplo:
importar jogo
jogo.iniciar()
janela = jogo.display.criar_janela((1000, 700))
jogo.display.definir_título("Dragão Esmeralda — Pyrtugues")
relogio = jogo.tempo.relógio()
x, y = jogo.mouse.posição()
# Criamos os pontos iniciais do corpo.
rastro = []
para i em intervalo(130):
rastro.adicionar((x - i * 3, y))
# Estrelas fixas no fundo.
estrelas = [
(38, 45), (120, 90), (210, 55), (310, 120),
(430, 65), (540, 100), (650, 45), (750, 115),
(870, 70), (960, 140), (80, 220), (190, 300),
(340, 250), (500, 190), (680, 280), (820, 220),
(930, 350), (100, 460), (260, 520), (430, 610),
(600, 520), (770, 600), (900, 500), (970, 610)
]
executando = verdadeiro
enquanto executando:
# Verificamos os eventos da janela.
para evento em jogo.eventos.obter():
se evento.type == jogo.sair_evento:
executando = falso
se evento.type == jogo.tecla_pressionada_evento e evento.key == jogo.esc:
executando = falso
# Posição atual do mouse.
x, y = jogo.mouse.posição()
# Adicionamos posições ao rastro quando o mouse se move.
antigo_x, antigo_y = rastro[0]
dx = x - antigo_x
dy = y - antigo_y
se dx * dx + dy * dy >= 9:
rastro.inserir(0, (x, y))
rastro = rastro[:130]
# Fundo noturno.
janela.preencher((8, 12, 29))
# Estrelas do cenário.
para estrela em estrelas:
jogo.desenho.círculo(
janela,
(100, 160, 210),
estrela,
2
)
# Desenhamos as asas atrás do corpo.
asa_x, asa_y = rastro[18]
# Asa superior: contorno e membrana.
jogo.desenho.polígono(
janela,
(7, 22, 45),
[
(asa_x, asa_y),
(asa_x - 14, asa_y - 19),
(asa_x - 38, asa_y - 49),
(asa_x - 36, asa_y - 17),
(asa_x - 55, asa_y - 29),
(asa_x - 38, asa_y + 2),
(asa_x - 10, asa_y + 8)
]
)
jogo.desenho.polígono(
janela,
(116, 64, 184),
[
(asa_x - 5, asa_y - 3),
(asa_x - 14, asa_y - 19),
(asa_x - 34, asa_y - 39),
(asa_x - 31, asa_y - 14),
(asa_x - 46, asa_y - 21),
(asa_x - 32, asa_y + 1)
]
)
# Asa inferior.
jogo.desenho.polígono(
janela,
(7, 22, 45),
[
(asa_x, asa_y),
(asa_x - 14, asa_y + 19),
(asa_x - 38, asa_y + 49),
(asa_x - 36, asa_y + 17),
(asa_x - 55, asa_y + 29),
(asa_x - 38, asa_y - 2),
(asa_x - 10, asa_y - 8)
]
)
jogo.desenho.polígono(
janela,
(91, 49, 157),
[
(asa_x - 5, asa_y + 3),
(asa_x - 14, asa_y + 19),
(asa_x - 34, asa_y + 39),
(asa_x - 31, asa_y + 14),
(asa_x - 46, asa_y + 21),
(asa_x - 32, asa_y - 1)
]
)
# Corpo sinuoso: desenhamos da cauda até a cabeça.
# A largura aumenta conforme nos aproximamos da cabeça.
para i em intervalo(120, 0, -1):
corpo_x, corpo_y = rastro[i]
proximo_x, proximo_y = rastro[i - 1]
largura = 8 + (120 - i) // 5
# Contorno escuro.
jogo.desenho.linha(
janela,
(5, 31, 43),
(corpo_x, corpo_y),
(proximo_x, proximo_y),
largura + 8
)
# Corpo esmeralda.
jogo.desenho.linha(
janela,
(25, 170, 112),
(corpo_x, corpo_y),
(proximo_x, proximo_y),
largura
)
# Reflexo verde-claro.
jogo.desenho.linha(
janela,
(108, 255, 192),
(corpo_x, corpo_y),
(proximo_x, proximo_y),
2
)
# Escamas brilhantes.
para i em intervalo(10, 112, 10):
escama_x, escama_y = rastro[i]
jogo.desenho.círculo(
janela,
(153, 255, 192),
(escama_x, escama_y - 6),
3
)
jogo.desenho.círculo(
janela,
(231, 244, 153),
(escama_x, escama_y - 6),
1
)
# Espinhos ao longo das costas.
para i em intervalo(20, 110, 18):
espinho_x, espinho_y = rastro[i]
jogo.desenho.polígono(
janela,
(5, 52, 54),
[
(espinho_x, espinho_y - 20),
(espinho_x - 9, espinho_y - 2),
(espinho_x + 9, espinho_y - 2)
]
)
jogo.desenho.polígono(
janela,
(93, 255, 165),
[
(espinho_x, espinho_y - 15),
(espinho_x - 5, espinho_y - 4),
(espinho_x + 5, espinho_y - 4)
]
)
# Pequenas partículas mágicas pelo caminho.
para i em intervalo(8, 100, 23):
brilho_x, brilho_y = rastro[i]
jogo.desenho.círculo(
janela,
(100, 255, 230),
(brilho_x, brilho_y + 13),
2
)
# Cabeça: base escura.
jogo.desenho.círculo(
janela,
(5, 28, 37),
(x - 2, y - 1),
24
)
# Formato externo da cabeça.
jogo.desenho.polígono(
janela,
(5, 36, 43),
[
(x - 22, y - 14),
(x - 8, y - 23),
(x + 13, y - 18),
(x + 24, y - 8),
(x + 37, y - 5),
(x + 30, y + 7),
(x + 12, y + 10),
(x - 10, y + 7),
(x - 22, y + 3)
]
)
# Cor principal da cabeça.
jogo.desenho.polígono(
janela,
(38, 205, 125),
[
(x - 17, y - 12),
(x - 7, y - 18),
(x + 11, y - 14),
(x + 20, y - 7),
(x + 31, y - 5),
(x + 25, y + 2),
(x + 10, y + 5),
(x - 8, y + 4),
(x - 17, y)
]
)
# Chifres dourados.
jogo.desenho.polígono(
janela,
(239, 191, 81),
[
(x - 15, y - 15),
(x - 23, y - 34),
(x - 5, y - 20)
]
)
jogo.desenho.polígono(
janela,
(255, 224, 130),
[
(x - 13, y - 19),
(x - 20, y - 30),
(x - 9, y - 21)
]
)
jogo.desenho.polígono(
janela,
(239, 191, 81),
[
(x - 4, y - 17),
(x + 2, y - 35),
(x + 8, y - 15)
]
)
# Olho dourado e pupila.
jogo.desenho.círculo(
janela,
(255, 221, 110),
(x + 10, y - 10),
6
)
jogo.desenho.círculo(
janela,
(12, 25, 32),
(x + 12, y - 10),
3
)
jogo.desenho.círculo(
janela,
(255, 255, 255),
(x + 11, y - 12),
1
)
# Narinas e boca.
jogo.desenho.círculo(
janela,
(5, 52, 48),
(x + 25, y - 5),
2
)
jogo.desenho.círculo(
janela,
(5, 52, 48),
(x + 30, y - 3),
2
)
jogo.desenho.linha(
janela,
(5, 52, 48),
(x + 12, y + 5),
(x + 27, y + 4),
3
)
# Mantém a animação fluida.
relogio.marcar_fps(60)
jogo.display.atualizar_tela()
jogo.sair()
🧠 Como o dragão segue o mouse?
A parte mais importante é o rastro.
se dx * dx + dy * dy >= 9:
rastro.inserir(0, (x, y))
rastro = rastro[:130]
Cada vez que o mouse se desloca o suficiente, guardamos a nova posição no começo da lista. As posições antigas continuam atrás dela.
Depois, o código desenha linhas entre esses pontos. Como o corpo é desenhado da cauda para a cabeça, podemos aumentar sua largura conforme nos aproximamos do cursor.
É isso que cria a sensação de um dragão serpentino acompanhando o movimento, em vez de uma figura estática que apenas muda de posição.
🐍 O que o Pyrtugues traduz?
O código usa aliases documentados no projeto para operações do Pygame. Por exemplo:
| Pyrtugues | Pygame |
|---|---|
jogo.iniciar() |
pygame.init() |
jogo.display.criar_janela() |
pygame.display.set_mode() |
jogo.mouse.posição() |
pygame.mouse.get_pos() |
jogo.desenho.círculo() |
pygame.draw.circle() |
jogo.desenho.linha() |
pygame.draw.line() |
jogo.display.atualizar_tela() |
pygame.display.flip() |
O objetivo é manter a lógica de programação próxima do Python, permitindo escrever comandos em português e observar suas correspondências.
Você pode consultar os aliases e a implementação na documentação e no código do Pyrtugues.
🚀 Ideias para continuar
Agora que temos o dragão seguindo o mouse, existem várias formas de evoluir o projeto:
- Fazer as asas baterem durante o movimento.
- Adicionar partículas de fogo pela boca.
- Criar obstáculos e colisões.
- Fazer o dragão perseguir um objeto.
- Adicionar sons e música.
- Criar pontos e uma pontuação.
Cada melhoria pode ensinar um novo conceito, como animação, eventos, condições, colisões ou controle de tempo.
📚 Conheça o Pyrtugues
🐙 GitHub: https://github.com/pyrtugues/Pyrtugues
🌐 Site de apresentação: https://pyrtugues-apre.pages.dev/
📚 Curso: https://pyrtugues.pages.dev/
💻 Editor Web: https://pyrtugues-editor.pages.dev/
🧩 Extensão para VS Code: https://open-vsx.org/extension/pyrtugues/pyrtugues
O Pyrtugues é um projeto educacional em evolução. Consulte a documentação e a licença oficial antes de utilizar o projeto.
Programar não precisa começar com uma barreira de idioma. Você pode começar com uma ideia, transformá-la em código e aprender cada vez mais enquanto constrói.
Qual criatura você criaria com Pyrtugues? 🐉💚
Top comments (0)