[ English | 中文 | Deutsch | Español | Français | Italiano | 日本語 | 한국어 | Português | Русский ]
Pyxel é um motor de jogos retrô para Python.
Graças às suas especificações simples inspiradas em consoles de jogos retrô, assim como permitir a exibição de apenas 16 cores e apenas 4 sons poderem ser reproduzidos ao mesmo tempo, você pode se sentir à vontade para fazer jogos em estilo pixel art.
A motivação para o desenvolvimento do Pyxel é o feedback dos utilizadores. Por favor, dê a Pyxel uma estrela em GitHub!
As especificações e APIs de Pyxel são inspiradas por PICO-8 e TIC-80.
Pyxel é open source e livre para utilização. Vamos começar fazendo um jogo retrô com Pyxel!
- Funciona em Windows, Mac, Linux, e Web
- Programação com Python
- Paleta de 16 cores
- 3 bancos de imagens de tamanho 256x256
- 8 tilemaps de tamanho 256x256
- 4 canais com 64 sons definíveis
- 8 músicas que podem combinar sons arbitrários
- Entradas de teclado, mouse e joystick
- Editor de imagem e som
Após instalar o Python3 (versão 3.7 ou superior), execute o seguinte comando:
pip install -U pyxel
Se instalar Python utilizando o instalador oficial, verifique a caixa de verificação Add Python 3.x to PATH
para activar o comando pyxel
.
Após instalar o Python3 (versão 3.7 ou superior), execute o seguinte comando:
python3 -m pip install -U pyxel
Se utilizar Python3, que é instalado por defeito no Mac, adicione sudo
ao início do comando acima para activar o comando pyxel
.
Após instalar o pacote SDL2 (libsdl2-dev
no Ubuntu), Python3 (versão 3.7 ou superior), e python3-pip
, execute o seguinte comando:
sudo pip3 install -U pyxel
Se o acima mencionado não funcionar, tente auto-construir-se de acordo com as instruções em Makefile.
A versão web do Pyxel não requer instalação de Python ou Pyxel e corre em PCs, bem como smartphones e tablets com navegadores web suportados.
Para instruções específicas, por favor consulte esta página.
Após instalar o Pyxel, os exemplos serão copiados para o diretório atual com o seguinte comando:
pyxel copy_examples
Os exemplos copiados são os seguintes:
01_hello_pyxel.py | Aplicação simples | Demo | Code |
02_jump_game.py | Jogo de pulo com o arquivo de recursos do Pyxel | Demo | Code |
03_draw_api.py | Demonstração das APIs de desenho | Demo | Code |
04_sound_api.py | Demonstração das APIs de som | Demo | Code |
05_color_palette.py | Lista da paleta de cores | Demo | Code |
06_click_game.py | Jogo de clique com mouse | Demo | Code |
07_snake.py | Jogo Snake com BGM | Demo | Code |
08_triangle_api.py | Demonstração da API de desenho de triângulos | Demo | Code |
09_shooter.py | Jogo de tiro com transição de tela | Demo | Code |
10_platformer.py | Jogo side-scrolling de plataforma com mapa | Demo | Code |
11_offscreen.py | Renderização fora do ecrã com classe de Image | Demo | Code |
12_perlin_noise.py | Animação sonora Perlin | Demo | Code |
13_bitmap_font.py | Desenho de uma fonte bitmap | Demo | Code |
99_flip_animation.py | Animação com função flip (apenas plataformas não-web) | Demo | Code |
30SecondsOfDaylight.pyxapp | 1º jogo vencedor de Pyxel Jam de Adam | Demo | Code |
megaball.pyxapp | Jogo de física de bola arcade por Adam | Demo | Code |
8bit-bgm-gen.pyxapp | Gerador de música de fundo feito por frenchbread | Demo | Code |
Os exemplos podem ser executados com os seguintes comandos:
cd pyxel_examples
pyxel run 01_hello_pyxel.py
pyxel play 30SecondsOfDaylight.pyxapp
Após importar o módulo Pyxel em seu script Python, especifique o tamanho da janela com a função init
, em seguida inicialize a aplicação Pyxel com a função run
.
import pyxel
pyxel.init(160, 120)
def update():
if pyxel.btnp(pyxel.KEY_Q):
pyxel.quit()
def draw():
pyxel.cls(0)
pyxel.rect(10, 10, 20, 20, 11)
pyxel.run(update, draw)
Os argumentos da função run
são as funções update
, para atualizar cada frame, e draw
para desenhar a tela quando for necessário.
Em uma aplicação real, é recomendado colocar código pyxel em uma classe, como feito abaixo:
import pyxel
class App:
def __init__(self):
pyxel.init(160, 120)
self.x = 0
pyxel.run(self.update, self.draw)
def update(self):
self.x = (self.x + 1) % pyxel.width
def draw(self):
pyxel.cls(0)
pyxel.rect(self.x, 0, 8, 8, 9)
App()
Ao criar gráficos simples sem animação, a função show
pode ser utilizada para tornar o código mais conciso.
import pyxel
pyxel.init(120, 120)
pyxel.cls(1)
pyxel.circb(60, 60, 40, 7)
pyxel.show()
O script Python criado pode ser executado com o seguinte comando:
pyxel run PYTHON_SCRIPT_FILE
Também pode ser executado como um guião Python normal:
python3 PYTHON_SCRIPT_FILE
(No Windows, use python
ao invés de python3
)
Os seguintes controles especiais podem ser executados quando uma aplicação Pyxel estiver sendo executada:
Esc
Encerra a aplicaçãoAlt(Option)+1
Salva uma captura de tela para a área de trabalhoAlt(Option)+2
Reinicia o momento inicial do vídeo de captura de tela.Alt(Option)+3
Salva um vídeo de captura de tela na área de trabalho (até 10 segundos)Alt(Option)+0
Ativa/desativa o monitor de performance (fps, tempo de update e tempo de draw)Alt(Option)+Enter
Ativa/desativa tela cheia
O Editor Pyxel pode criar imagens e sons usados em uma aplicação Pyxel.
Ele é inicializado com o seguinte comando:
pyxel edit PYXEL_RESOURCE_FILE
Se o arquivo de recursos Pyxel (.pyxres) existir, o arquivo será carregado, e se ele não existir, um novo arquivo com o nome especificado será criado.
Se o arquivo de recursos for omitido, o nome será my_resource.pyxres
.
Após iniciar o Editor Pyxel, o arquivo pode ser trocado arrastando e soltando outro arquivo de recursos. Se o arquivo for arrastado segurando a tecla Ctrl(Cmd)
, somente o recurso (Imagem/Tilemap/Som/Musica) que estiver sendo editado no momento será carregado. Esta operação possibilita a combinar múltiplos arquivos de recursos em um só.
O arquivo recursos criado pode ser carregado através da função load
.
O Editor Pyxel possuí os seguintes modos de edição.
Editor de Imagem:
O modo para editar bancos de imagem.
Arrastando e soltando um arquivo de imagem (png/gif/jpeg) dentro da tela do Editor de Imagens faz com que a imagem possa ser carregada no banco de imagens selecionado no momento.
Editor de Tilemap:
O modo para editar tilemaps em que imagens dos bancos de imagens são organizados em um padrão de tiles.
Editor de Som:
O modo para editar sons.
Editor de Música:
O modo para editar músicas nas quais os sons são organizados na ordem de execução.
Imagens e tilemaps Pyxel também podem ser criados pelos seguintes métodos:
- Criar uma imagem de uma lista de strings com a função
Image.set
ou com a funçãoTilemap.set
- Carregar um arquivo de imagem (png/gif/jpeg) na paleta Pyxel com a função
Image.load
Sons Pyxel também podem ser criados com o seguinte método:
- Criar um som de uma strings com a função
Sound.set
ou com a funçãoMusic.set
Favor consultar a referência da API para o uso dessas funções.
O Pyxel suporta um formato de arquivo de distribuição dedicado (arquivo de aplicação Pyxel) que é multiplataforma.
Crie um arquivo de aplicação Pyxel (.pyxapp) com o seguinte comando:
pyxel package APP_DIR STARTUP_SCRIPT_FILE
Se a candidatura deve incluir recursos ou módulos adicionais, coloque-os no directório da candidatura.
O arquivo de aplicação pode ser executado com o seguinte comando:
pyxel play PYXEL_APP_FILE
O ficheiro de aplicação Pyxel também pode ser convertido num ficheiro executável ou HTML com os comandos pyxel app2exe
ou pyxel app2html
.
-
width
,height
A largura e a altura da tela -
frame_count
O número dos quadros decorridos -
init(width, height, [title], [fps], [quit_key], [display_scale], [capture_scale], [capture_sec])
Inicializa a aplicação Pyxel com tamanho de tela (width
,height
). As seguintes opções podem ser especificadas: o título da janela comtitle
, a taxa de quadros comfps
, a tecla para fechar a aplicação comquit_key
, a escala da exposição comdisplay_scale
, a escala da captura de tela comcapture_scale
, o tempo máximo de gravação do vídeo da captura de telacapture_sec
.
Ex.pyxel.init(160, 120, title="My Pyxel App", fps=60, quit_key=pyxel.KEY_NONE, capture_scale=3, capture_sec=0)
-
run(update, draw)
Roda a aplicação Pyxel e chama a funçãoupdate
para atualizar os quadros e a funçãodraw
para desenhá-los. -
show()
Mostra a tela e espera até a teclaEsc
ser pressionada. -
flip()
Refrear o ecrã por uma moldura. A aplicação sai quando a teclaEsc
é premida. Esta função só funciona em plataformas não-web. -
quit()
Feche a aplicação Pyxel.
load(filename, [image], [tilemap], [sound], [music])
Carrega o arquivo de recursos (.pyxres). SeFalse
for especificado para o tipo de recurso (image/tilemap/sound/music
), o recurso não será carregado. Se existir um ficheiro de palete (.pyxpal) com o mesmo nome no mesmo local que o ficheiro de recurso, a cor de apresentação da palete também será alterada. O ficheiro de palete é uma entrada hexadecimal das cores do visor, separada por novas linhas. O ficheiro de palete também pode ser utilizado para alterar as cores exibidas no Pyxel Editor.
-
mouse_x
,mouse_y
A posição atual do cursor do mouse -
mouse_wheel
O valor atual da roda de rolagem do mouse -
btn(key)
RetornaTrue
sekey
é pressionada, caso contrário retornaFalse
(lista de definições de teclas) -
btnp(key, [hold], [repeat])
RetornaTrue
sekey
for pressionada naquele quadro, caso contrário retornaFalse
. Quandohold
erepeat
são especificados,True
será retornado durante o intervalo de quadrosrepeat
, no qualkey
estiver pressionada por mais quehold
quadros -
btnr(key)
RetornaTrue
sekey
for solta naquele quadro, caso contrário retornaFalse
-
mouse(visible)
Sevisible
forTrue
, mostra o cursor do mouse. Se forFalse
, esconde. Mesmo se o cursor do mouse não for visível, sua posição é atualizada.
-
colors
Lista da paleta de cores da tela. A cor da tela é especificada por um valor numérico de 24 bits. Usecolors.from_list
ecolors.to_list
para atribuir e pegar listas do Python.
Ex.old_colors = pyxel.colors.to_list(); pyxel.colors.from_list([0x111111, 0x222222, 0x333333]); pyxel.colors[15] = 0x112233
-
image(img)
Opera o banco de imagensimg
(0-2). (veja a classe de Imagem)
Ex.pyxel.image(0).load(0, 0, "title.png")
-
tilemap(tm)
Opera o tilemaptm
(0-7) (ver a classe de Tilemap) -
clip(x, y, w, h)
Define a área de desenho da tela de (x
,y
) para a larguraw
e alturah
. Redefina a área de desenho para tela cheia comclip()
-
camera(x, y)
Altera as coordenadas do canto superior esquerdo da tela para (x
,y
). Redefina as coordenadas do canto superior esquerdo para (0
,0
) comcamera()
. -
pal(col1, col2)
Substitui a corcol1
comcol2
ao desenhar. Usepal()
para voltar para a paleta inicial -
cls(col)
Limpar a tela com a corcol
-
pget(x, y)
Captura a cor de um pixel em (x
,y
) -
pset(x, y, col)
Desenha um pixel de corcol
em (x
,y
) -
line(x1, y1, x2, y2, col)
Desenha uma linha da corcol
de (x1
,y1
) até (x2
,y2
) -
rect(x, y, w, h, col)
Desenha um retângulo de larguraw
, alturah
e corcol
a partir de (x
,y
) -
rectb(x, y, w, h, col)
Desenha o contorno de um retângulo de larguraw
, alturah
e corcol
a partir de (x
,y
) -
circ(x, y, r, col)
Desenha um círculo de raior
e corcol
em (x
,y
) -
circb(x, y, r, col)
Desenha o contorno de um círculo de raior
e corcol
em (x
,y
) -
elli(x, y, w, h, col)
Desenhar uma elipse de larguraw
, alturah
e corcol
de (x
,y
). -
ellib(x, y, w, h, col)
Desenhar o contorno de uma elipse de larguraw
, alturah
e corcol
de (x
,y
). -
tri(x1, y1, x2, y2, x3, y3, col)
Desenha um triangulo com os vértices (x1
,y1
), (x2
,y2
), (x3
,y3
) e corcol
-
trib(x1, y1, x2, y2, x3, y3, col)
Desenha o contorno de um triangulo com os vértices (x1
,y1
), (x2
,y2
), (x3
,y3
) e corcol
-
fill(x, y, col)
Desenhar uma elipse de larguraw
, alturah
e corcol
de (x
,y
). -
blt(x, y, img, u, v, w, h, [colkey])
Copia a região de tamanho (w
,h
) de (u
,v
) do banco de imagensimg
(0-2) para (x
,y
). Se um valor negativo for definido paraw
e/ouh
, será invertido horizontalmente e/ou verticalmente. Secolkey
for especificada, será tratado como cor transparente
bltm(x, y, tm, u, v, w, h, [colkey])
Copia a região de tamanho (w
,h
) de (u
,v
) do tilemaptm
(0-7) para (x
,y
). Se um valor negativo for definido paraw
e/ouh
, será invertido horizontalmente e/ou verticalmente. Secolkey
for especificada, será tratado como cor transparente. O tamanho de um tile é de 8x8 pixels e é armazenado em um tilemap como uma tupla de(tile_x, tile_y)
.
text(x, y, s, col)
Desenha uma strings
de corcol
em (x
,y
)
-
sound(snd)
Opera o somsnd
(0-63). (ver a classe de Som)
Ex.pyxel.sound(0).speed = 60
-
music(msc)
Opera a músicamsc
(0-7) (ver a classe de Musica) -
play_pos(ch)
Obtém a posição do canalch
(0-3) da reprodução de som como uma tupla de(sound no, note no)
. RetornaNone
quando a reprodução para. -
play(ch, snd, [tick], [loop])
Reproduz o somsnd
(0-63) no canalch
(0-3). Sesnd
é uma lista, os sons serão reproduzidos em ordem. A posição inicial da reprodução pode ser especificada portick
(1 tick = 1/120 segundos). SeTrue
for especificado paraloop
, a reprodução será feita em laço. -
playm(msc, [tick], [loop])
Reproduz a músicamsc
(0-7). A posição inicial da reprodução pode ser especificada portick
(1 tick = 1/120 segundos). SeTrue
for especificado paraloop
, a reprodução será feita em laço. -
stop([ch])
Para a reprodução do canalch
(0-3).stop()
para parar a reprodução de todos os canais.
-
ceil(x)
Devolve o menor inteiro maior ou igual ax
. -
floor(x)
Devolve o maior inteiro menor ou igual ax
. -
sgn(x)
Retorna 1 quando ox
é positivo, 0 quando é zero, e -1 quando é negativo. -
sqrt(x)
Devolve a raiz quadrada dex
. -
sin(deg)
Devolve o seno dedeg
graus. -
cos(deg)
Retorna o cosseno dedeg
graus. -
atan2(y, x)
Devolve o arctangente dey
/x
em graus. -
rseed(seed: int)
Define a semente do gerador do número aleatório. -
rndi(a, b)
Retorna um inteiro aleatório maior ou igual aa' e menor ou igual a
b'. -
rndf(a, b)
Devolve uma decimal aleatória maior ou igual aa
e menor ou igual ab
. -
nseed(seed)
Define a semente do ruído de Perlin. -
noise(x, [y], [z])
Retorna o valor do ruído Perlin para as coordenadas especificadas.
-
width
,height
Largura e altura da imagem -
set(x, y, data)
Define a imagem em (x
,y
) por uma lista de strings.
Ex.pyxel.image(0).set(10, 10, ["0123", "4567", "89ab", "cdef"])
-
load(x, y, filename)
Carrega um arquivo de imagem (png/gif/jpeg) em (x
,y
). -
pget(x, y)
Pega a cor do pixel em (x
,y
). -
pset(x, y, col)
Desenha um pixel de corcol
em (x
,y
).
-
width
,height
A largura e a altura do tilemap -
refimg
O banco de imagem (0-2) referenciado pelo tilemap -
set(x, y, data)
Define o tilemap em (x
,y
) por uma lista de strings.
Ex.pyxel.tilemap(0).set(0, 0, ["0000 0100 a0b0", "0001 0101 a1b1"])
-
pget(x, y)
Pega o tile em (x
,y
). Um tile é uma tupla de(tile_x, tile_y)
. -
pset(x, y, tile)
Desenha umtile
em (x
,y
). Um tile é uma tupla de(tile_x, tile_y)
.
-
notes
Lista de notas (0-127). Quanto maior o número, mais agudo, e ao chegar em 33 ele se torna 'A2'(440Hz). O resto é -1. -
tones
Lista de tons (0:Triangular / 1:Quadrada / 2:Pulso / 3:Ruído) -
volumes
Lista de volumes (0-7) -
effects
Lista de efeitos (0:Nenhum / 1:Slide / 2:Vibrato / 3:FadeOut) -
speed
Velocidade de reprodução. 1 é a velocidade maior, e quanto maior o número, mais lenta ela é. No valor 120, o tempo de uma nota se torna 1 segundo. -
set(notes, tones, volumes, effects, speed)
Define as notas, tons, volumes e efeitos com uma string. Se os tons, volumes e efeitos são mais curtos que as notas, elas se repetirão do começo. -
set_notes(notes)
Define as notas com uma string 'CDEFGAB'+'#-'+'01234' ou 'R'. É insensível à maiúsculas ou minúsculas e espaços em branco são ignorados.
Ex.pyxel.sound(0).set_notes("G2B-2D3R RF3F3F3")
-
set_tones(tones)
Define os tons com uma string composta por 'TSPN'. É insensível à maiúsculas ou minúsculas e espaços em branco são ignorados.
Ex.pyxel.sound(0).set_tones("TTSS PPPN")
-
set_volumes(volumes)
Define os volumes com uma string composta por '01234567'. É insensível à maiúsculas ou minúsculas e espaços em branco são ignorados.
Ex.pyxel.sound(0).set_volumes("7777 7531")
-
set_effects(effects)
Define os efeitos com uma string composta por 'NSVF'. É insensível à maiúsculas ou minúsculas e espaços em branco são ignorados.
Ex.pyxel.sound(0).set_effects("NFNF NVVS")
-
snds_list
Lista bi-dimensional de sons (0-63) com o número de canais. -
set(snds0, snds1, snds2, snds3)
Define as listas de sons (0-63) para todos os canais. Se uma lista vazia for especificada, aquele canal não será utilizado para reprodução de sons.
Ex.pyxel.music(0).set([0, 1], [2, 3], [4], [])
Pyxel possui "APIs avançadas" que não são mencionadas nesse manual de referência pois elas podem "confundir usuários" ou "precisam de conhecimento especializado para usar".
Se você está familiarizado com suas habilidades, tente criar projetos incríveis utilizando isto como pista!
Utilize o Issue Tracker para relatar bugs e sugerir funcionalidades/melhorias. Antes de relatar uma issue, tenha certeza que não exista uma issue similar aberta.
Qualquer um testando o código manualmente e relatando bugs ou sugestões de melhorias no Issue Tracker são muito bem vindos!
Patches/correções serão aceitas na forma de pull requests (PRs). Tenha certeza de que o que o pull request tenta resolver esteja em aberto no issue tracker.
Será considerado que todo pull request tenha concordado a ser publicado sob a licença MIT.
Pyxel está sob a licença MIT. Ele pode ser reutilizado em software proprietário, contanto que todas as cópias do software ou sua porções substanciais incluam uma cópia dos termos da licença MIT e um aviso de direitos autorais.
Pyxel está procurando patrocinadores nos patrocinadores do GitHub. Considere patrocinar o Pyxel para manutenção contínua e acréscimos de recursos. Os patrocinadores podem consultar sobre o Pyxel como um benefício. Por favor, veja aqui para detalhes.