[Inglês | 中文 | Deutsch | Español | Français | Italiano | 日本語 | 한국어 | Português | Р рйий | Türkçe | Você
Pyxel é um mecanismo de jogo retrô para Python.
Com especificações simples inspiradas nos consoles de jogos retrô, como exibir apenas 16 cores e suportar 4 canais de som, você pode facilmente gostar de fazer jogos de estilo de arte pixel.
O desenvolvimento do pyxel é impulsionado pelo feedback do usuário. Por favor, dê a Pyxel uma estrela no Github!
As especificações e as APIs de Pyxel são inspiradas em Pico-8 e TIC-80.
O Pyxel é de código aberto sob a licença do MIT e é gratuito. Vamos começar a fazer jogos retrô com Pyxel!
Depois de instalar o Python3 (versão 3.8 ou superior), execute o seguinte comando:
pip install -U pyxel
Ao instalar o Python usando o instalador oficial, verifique a opção Add Python 3.x to PATH
para ativar o comando pyxel
.
Depois de instalar o Homebrew, execute os seguintes comandos:
brew install pipx
pipx ensurepath
pipx install pyxel
Para atualizar o pyxel após a instalação, execute pipx upgrade pyxel
.
Depois de instalar o pacote SDL2 ( libsdl2-dev
para Ubuntu), Python3 (versão 3.8 ou superior) e python3-pip
, execute o seguinte comando:
sudo pip3 install -U pyxel
Se o comando anterior falhar, considere a criação do Pyxel a partir da fonte seguindo as instruções no Makefile.
A versão da Web do Pyxel não requer instalação de Python ou pyxel e é executada em PCs, smartphones e tablets com navegadores da Web suportados.
Para instruções detalhadas, consulte esta página.
Depois de instalar o Pyxel, você pode copiar os exemplos para o diretório atual com o seguinte comando:
pyxel copy_examples
Os exemplos a seguir serão copiados para o seu diretório atual:
01_HELLO_PYXEL.PY | Aplicação mais simples | Demonstração | Código |
02_JUMP_GAME.PY | Jogo de salto com arquivo de recursos pyxel | Demonstração | Código |
03_DRAW_API.PY | Demonstração de APIs de desenho | Demonstração | Código |
04_SOUND_API.PY | Demonstração de APIs de som | Demonstração | Código |
05_COLOR_PALETTE.PY | Lista de paleta de cores | Demonstração | Código |
06_CLICK_GAME.PY | Jogo de clique de mouse | Demonstração | Código |
07_SNAKE.PY | Jogo de cobra com BGM | Demonstração | Código |
08_Triangle_Api.py | Demonstração de APIs de desenho de triângulo | Demonstração | Código |
09_shooter.py | Tiro o jogo com transições de tela | Demonstração | Código |
10_platformer.py | Jogo de plataforma de rolagem lateral com mapa | Demonstração | Código |
11_offscreen.py | Renderização fora da tela com a classe de imagem | Demonstração | Código |
12_perlin_noise.py | Animação de ruído de perlin | Demonstração | Código |
13_bitmap_font.py | Desenhando uma fonte de bitmap | Demonstração | Código |
14_synthesizer.py | Sintetizador usando recursos de expansão de áudio | Demonstração | Código |
15_TILED_MAP_FILE.PY | Carregando e desenhando um arquivo de mapa de ladrilhos (.tmx) | Demonstração | Código |
16_transform.py | Rotação de imagem e escala | Demonstração | Código |
99_flip_animation.py | Animação com função FLIP (apenas plataformas não-web) | Demonstração | Código |
30Sec_Of_Daylight.pyxapp | 1º jogo vencedor de Jam Pyxel por Adam | Demonstração | Código |
megaball.pyxapp | Jogo de física do Arcade Ball de Adam | Demonstração | Código |
8bit-BGM-Gen.pyxapp | Gerador de música de fundo por francês pão | Demonstração | Código |
Os exemplos podem ser executados com os seguintes comandos:
cd pyxel_examples
pyxel run 01_hello_pyxel.py
pyxel play 30sec_of_daylight.pyxapp
No seu script python, importe o módulo Pyxel, especifique o tamanho da janela com a função init
e inicie o aplicativo 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 a função update
, que processa as atualizações de quadros, e a função draw
, que lida com o desenho da tela.
Em um aplicativo real, é recomendável envolver o código do pyxel em uma classe, como mostrado 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 ()
Para criar gráficos simples sem animação, você pode usar a função show
para simplificar seu código.
import pyxel
pyxel . init ( 120 , 120 )
pyxel . cls ( 1 )
pyxel . circb ( 60 , 60 , 40 , 7 )
pyxel . show ()
Um script criado pode ser executado usando o comando python
:
python PYTHON_SCRIPT_FILE
Também pode ser executado com o comando pyxel run
:
pyxel run PYTHON_SCRIPT_FILE
Além disso, o comando pyxel watch
monitora as alterações em um diretório especificado e re-reexuja automaticamente o programa quando as alterações são detectadas:
pyxel watch WATCH_DIR PYTHON_SCRIPT_FILE
O monitoramento do diretório pode ser interrompido pressionando Ctrl(Command)+C
.
As seguintes ações especiais estão disponíveis enquanto um aplicativo pyxel está em execução:
Esc
Alt(Option)+1
Alt(Option)+2
Alt(Option)+3
Alt(Option)+8
ou A+B+X+Y+DL
no gamepadAlt(Option)+9
ou A+B+X+Y+DR
no gamepadAlt(Option)+0
ou A+B+X+Y+DU
no gamepadupdate
/ draw
)Alt(Option)+Enter
ou A+B+X+Y+DD
gamepadShift+Alt(Option)+1/2/3
Shift+Alt(Option)+0
O editor pyxel pode criar imagens e sons usados em um aplicativo pyxel.
Você pode iniciar o editor Pyxel com o seguinte comando:
pyxel edit PYXEL_RESOURCE_FILE
Se o arquivo de recursos pyxel especificado (.pyxres) existir, ele será carregado. Se não existir, um novo arquivo com o nome especificado será criado. Se o arquivo de recursos for omitido, será criado um novo arquivo chamado my_resource.pyxres
.
Depois de iniciar o editor do Pyxel, você pode alternar para outro arquivo de recursos arrastando e soltando -o para o editor Pyxel.
O arquivo de recurso criado pode ser carregado usando a função load
.
O editor Pyxel possui os seguintes modos de edição.
Editor de imagem
O modo para editar a imagem em cada banco de imagens .
Você pode arrastar e soltar um arquivo de imagem (PNG/GIF/JPEG) para o editor de imagem para carregar a imagem no banco de imagens atualmente selecionado.
Editor de Tilemap
O modo para editar tilemaps que organizam imagens dos bancos de imagem em um padrão de ladrilhos.
Arraste e solte um arquivo TMX (arquivo de mapa de azulejos) no editor Tilemap para carregar sua camada na ordem de desenho que corresponde ao número Tilemap atualmente selecionado.
Editor de som
O modo para editar sons usados para melodias e efeitos sonoros.
Editor de música
O modo para editar músicas nas quais os sons são organizados em ordem de reprodução.
Imagens pyxel e tilemaps também podem ser criadas usando os seguintes métodos:
Image.set
ou a função Tilemap.set
Image.load
Os sons pyxel também podem ser criados usando o seguinte método:
Sound.set
Music.set
Consulte a referência da API para o uso dessas funções.
O Pyxel suporta um formato de arquivo de distribuição de aplicativos dedicado (arquivo de aplicativo pyxel) que é plataforma cruzada.
Um arquivo de aplicativo pyxel (.pyxapp) é criado usando o comando pyxel package
:
pyxel package APP_DIR STARTUP_SCRIPT_FILE
Se você precisar incluir recursos ou módulos adicionais, coloque -os no diretório de aplicativos.
Os metadados podem ser exibidos em tempo de execução especificando -o no formato a seguir no script de inicialização. Campos que não sejam title
e author
são opcionais.
# title: Pyxel Platformer
# author: Takashi Kitao
# desc: A Pyxel platformer example
# site: https://github.com/kitao/pyxel
# license: MIT
# version: 1.0
O arquivo de aplicativo criado pode ser executado usando o comando pyxel play
:
pyxel play PYXEL_APP_FILE
Um arquivo de aplicativo pyxel também pode ser convertido em um arquivo executável ou html usando os comandos pyxel app2exe
ou pyxel app2html
.
width
, height
A largura e a altura da tela
frame_count
O número de quadros decorridos
init(width, height, [title], [fps], [quit_key], [display_scale], [capture_scale], [capture_sec])
Inicialize o aplicativo Pyxel com o tamanho da tela ( width
, height
). As seguintes opções podem ser especificadas: o título da janela com title
, a taxa de quadros com fps
, a chave para desistir do aplicativo com quit_key
, a escala de exibição com display_scale
, a escala de captura de tela com capture_scale
e o tempo máximo de gravação da captura da tela Vídeo com capture_sec
.
Exemplo: pyxel.init(160, 120, title="My Pyxel App", fps=60, quit_key=pyxel.KEY_NONE, capture_scale=3, capture_sec=0)
run(update, draw)
Inicie o aplicativo Pyxel e chame a função update
para atualização de quadros e a função draw
para desenho.
show()
Mostre a tela e aguarde até que a tecla Esc
seja pressionada.
flip()
Atualize a tela por um quadro. O aplicativo sai quando a tecla Esc
é pressionada. Esta função não está disponível na versão da Web.
quit()
Saia do aplicativo Pyxel.
load(filename, [excl_images], [excl_tilemaps], [excl_sounds], [excl_musics])
Carregue o arquivo de recursos (.pyxres). Se uma opção estiver definida como True
, o recurso correspondente será excluído do carregamento. Se um arquivo de paleta (.pyxpal) com o mesmo nome existir no mesmo local que o arquivo de recursos, as cores da exibição da paleta também serão atualizadas. O arquivo da paleta contém entradas hexadecimais para as cores da tela (por exemplo, 1100FF
), separadas por newlines. O arquivo da paleta também pode ser usado para alterar as cores exibidas no editor pyxel.
user_data_dir(vendor_name, app_name)
Retorna o diretório de dados do usuário criado com base no vendor_name
e app_name
. Se o diretório não existir, ele será criado automaticamente. É usado para armazenar pontuações altas, progresso do jogo e dados semelhantes.
Exemplo: print(pyxel.user_data_dir("Takashi Kitao", "Pyxel Shooter"))
mouse_x
, mouse_y
A posição atual do cursor do mouse
mouse_wheel
O valor atual da roda do mouse
btn(key)
Retorne True
se a key
for pressionada, retorne False
. (Lista de definições -chave)
btnp(key, [hold], [repeat])
Retorne True
se a key
for pressionada nesse quadro, retorne False
. Se hold
e repeat
forem especificados, depois que a key
foi retida para quadros hold
ou mais, True
será devolvido a cada quadros repeat
.
btnr(key)
Retorne True
se a key
for liberada nesse quadro, retorne False
.
mouse(visible)
Mostre o cursor do mouse se visible
for True
e esconda -o se visible
for False
. A posição do cursor continua a atualizar mesmo quando está oculta.
colors
Lista das cores da exibição da paleta. A cor da tela é especificada por um valor numérico de 24 bits. Use colors.from_list
e colors.to_list
para atribuir e recuperar diretamente as listas Python.
Exemplo: old_colors = pyxel.colors.to_list(); pyxel.colors.from_list([0x111111, 0x222222, 0x333333]); pyxel.colors[15] = 0x112233
images
Lista dos bancos de imagem (instâncias da classe de imagem) (0-2)
Exemplo: pyxel.images[0].load(0, 0, "title.png")
tilemaps
Lista dos Tilemaps (instâncias da classe Tilemap) (0-7)
clip(x, y, w, h)
Defina a área de desenho da tela de ( x
, y
) com uma largura de w
e uma altura de h
. Ligue para clip()
para redefinir a área de desenho para tela cheia.
camera(x, y)
Altere as coordenadas do canto superior esquerdo da tela para ( x
, y
). Ligue para camera()
para redefinir as coordenadas de canto superior esquerdo para ( 0
, 0
).
pal(col1, col2)
Substitua a cor col1
por col2
ao desenhar. Ligue para pal()
para redefinir para a paleta inicial.
dither(alpha)
Aplique o Dithering (pseudo-transparência) ao desenhar. Defina alpha
no intervalo de 0.0
- 1.0
, onde 0.0
é transparente e 1.0
é opaco.
cls(col)
Tela transparente com color col
.
pget(x, y)
Obtenha a cor do pixel em ( x
, y
).
pset(x, y, col)
Desenhe um pixel de cor col
em ( x
, y
).
line(x1, y1, x2, y2, col)
Desenhe uma linha de cor col
de ( x1
, y1
) para ( x2
, y2
).
rect(x, y, w, h, col)
Desenhe um retângulo de largura w
, altura h
e cor col
( x
, y
).
rectb(x, y, w, h, col)
Desenhe o contorno x
um retângulo de largura w
, y
h
e cor col
.
circ(x, y, r, col)
Desenhe um círculo de raio r
e cor col
em ( x
, y
).
circb(x, y, r, col)
Desenhe o contorno de um círculo de raio r
e cor col
em ( x
, y
).
elli(x, y, w, h, col)
Desenhe uma elipse de largura w
, altura h
e cor col
( x
, y
).
ellib(x, y, w, h, col)
Desenhe o contorno de uma elipse de largura w
, altura h
e cor col
( x
, y
).
tri(x1, y1, x2, y2, x3, y3, col)
Desenhe um triângulo com vértices ( x1
, y1
), ( x2
, y2
), ( x3
, y3
) e color col
.
trib(x1, y1, x2, y2, x3, y3, col)
Desenhe o contorno de um triângulo com vértices ( x1
, y1
), ( x2
, y2
), ( x3
, y3
) e color col
.
fill(x, y, col)
Preencha a área conectada com a mesma cor que ( x
, y
) com colorido col
.
blt(x, y, img, u, v, w, h, [colkey], [rotate], [scale])
Copie a região do tamanho ( w
, h
) de ( u
, v
) do banco de imagens img
(0-2) para ( x
, y
). Se um valor negativo for atribuído a w
e/ou h
, a região será invertida horizontalmente e/ou verticalmente. Se colkey
for especificado, será tratado como uma cor transparente. Se rotate
(em graus), scale
(1,0 = 100%) ou ambos forem especificados, as transformações correspondentes serão aplicadas.
bltm(x, y, tm, u, v, w, h, [colkey], [rotate], [scale])
w
, h
) de ( u
, v
) do tilemap tm
(0-7) para ( x
, y
). Se um valor negativo for atribuído a w
e/ou h
, a região será invertida horizontalmente e/ou verticalmente. Se colkey
for especificado, será tratado como uma cor transparente. Se rotate
(em graus), scale
(1,0 = 100%) ou ambos forem especificados, as transformações correspondentes serão aplicadas. O tamanho de um ladrilho é de 8x8 pixels e é armazenado em um tilemap como uma tupla de (image_tx, image_ty)
. text(x, y, s, col)
s
em cor col
em ( x
, y
). sounds
Lista dos sons (instâncias da classe de som) (0-63)
Exemplo: pyxel.sounds[0].speed = 60
musics
Lista das músicas (instâncias da aula de música) (0-7)
play(ch, snd, [tick], [loop], [resume])
Jogue o som snd
(0-63) no canal ch
(0-3). Se snd
for uma lista, os sons serão tocados em sequência. A posição inicial de reprodução pode ser especificada por tick
(1 tick = 1/120 segundos). Se loop
estiver definido como True
, a reprodução do loop será realizada. Para retomar o som anterior após o término da reprodução, defina resume
como True
.
playm(msc, [tick], [loop])
Toque o Music msc
(0-7). A posição inicial de reprodução pode ser especificada por tick
(1 tick = 1/120 segundos). Se loop
estiver definido como True
, a reprodução do loop será realizada.
stop([ch])
Pare a reprodução do canal especificado ch
(0-3). Ligue stop()
para parar todos os canais.
play_pos(ch)
Obtenha a posição de reprodução sonora do canal ch
(0-3) como uma tupla de (sound_no, note_no)
. Retorne None
quando a reprodução parar.
ceil(x)
Retorne o menor número inteiro maior ou igual a x
.
floor(x)
Retorne o maior número inteiro que é menor ou igual a x
.
sgn(x)
Retorne 1
quando x
for positivo, 0
quando for 0
e -1
quando for negativo.
sqrt(x)
Retorne a raiz quadrada de x
.
sin(deg)
Devolver o seno de graus deg
graus.
cos(deg)
Retorne o cosseno de deg
graus.
atan2(y, x)
Retorne a arctangente de y
/ x
em graus.
rseed(seed)
Define a semente do gerador de números aleatórios.
rndi(a, b)
Retorne um número inteiro aleatório maior ou igual a a
e menor ou igual a b
rndf(a, b)
Retorne um número de ponto flutuante aleatório maior ou igual a a
e menor ou igual a b
nseed(seed)
Defina a semente do ruído de perlin.
noise(x, [y], [z])
Retorne o valor de ruído perlin para as coordenadas especificadas.
width
, height
A largura e a altura da imagem
set(x, y, data)
Defina a imagem em ( x
, y
) usando uma lista de strings.
Exemplo: pyxel.images[0].set(10, 10, ["0123", "4567", "89ab", "cdef"])
load(x, y, filename)
Carregue um arquivo de imagem (png/gif/jpeg) em ( x
, y
).
pget(x, y)
Obtenha a cor do pixel em ( x
, y
).
pset(x, y, col)
Desenhe um pixel com a cor col
em ( x
, y
).
width
, height
A largura e a altura do tilemap
imgsrc
O banco de imagens (0-2) referenciado pelo Tilemap
set(x, y, data)
Defina o tilemap em ( x
, y
) usando uma lista de strings.
Exemplo: pyxel.tilemap(0).set(0, 0, ["0000 0100 a0b0", "0001 0101 a1b1"])
load(x, y, filename, layer)
Carregue a camada na layer
de ordem de desenho (0-) do arquivo TMX (arquivo de mapa de azulejos) em ( x
, y
).
pget(x, y)
Obtenha o ladrilho em ( x
, y
). Um ladrilho é representado como uma tupla de (image_tx, image_ty)
.
pset(x, y, tile)
Desenhe um tile
em ( x
, y
). Um ladrilho é representado como uma tupla de (image_tx, image_ty)
.
notes
Lista de notas (0-127). Quanto maior o número, maior o tom. Nota 33
corresponde a 'A2' (440Hz). As notas de descanso são representadas por -1
.
tones
Lista de tons (0: Triângulo / 1: quadrado / 2: pulso / 3: ruído)
volumes
Lista de volumes (0-7)
effects
Lista de efeitos (0: Nenhum / 1: Slide / 2: Vibrato / 3: Fadeout / 4: Meio-Fadeout / 5: Quarter-inadeout)
speed
Velocidade de reprodução. 1
é o mais rápido e quanto maior o número, mais lenta a velocidade de reprodução. Aos 120
, o comprimento de uma nota se torna 1 segundo.
set(notes, tones, volumes, effects, speed)
Defina notas, tons, volumes e efeitos usando uma string. Se o comprimento dos tons, volumes ou efeitos forem mais curtos que as notas, eles serão repetidos desde o início.
set_notes(notes)
Defina as notas usando uma sequência feita de 'CDefgab'+'#-'+'01234' ou 'r'. É insensível ao caso e o espaço em branco é ignorado.
Exemplo: pyxel.sounds[0].set_notes("G2B-2D3R RF3F3F3")
set_tones(tones)
Defina os tons com uma corda feita de 'tspn'. O caso insensível ao caso e um espaço em branco é ignorado.
Exemplo: pyxel.sounds[0].set_tones("TTSS PPPN")
set_volumes(volumes)
Defina os volumes com uma sequência feita de '01234567'. O caso insensível ao caso e um espaço em branco é ignorado.
Exemplo: pyxel.sounds[0].set_volumes("7777 7531")
set_effects(effects)
Defina os efeitos com uma sequência feita de 'NSVFHQ'. O caso insensível ao caso e um espaço em branco é ignorado.
Exemplo: pyxel.sounds[0].set_effects("NFNF NVVS")
seqs
Uma lista bidimensional de sons (0-63) em vários canais
set(seq0, seq1, seq2, ...)
Defina as listas de som (0-63) para cada canal. Se uma lista vazia for especificada, esse canal não será usado para reprodução.
Exemplo: pyxel.musics[0].set([0, 1], [], [3])
O Pyxel inclui uma "API avançada" que não é mencionada nesta referência, pois pode confundir usuários ou exigir conhecimento especializado para usar.
Se você está confiante em suas habilidades, tente criar trabalhos incríveis usando isso como um guia!
Use o rastreador de problemas para enviar relatórios de bugs e solicitações de recursos ou aprimoramento. Antes de enviar uma nova edição, verifique se não há questões abertas semelhantes.
Qualquer pessoa que testa manualmente o código e relata bugs ou sugestões para aprimoramentos no rastreador de edições é muito bem -vindo!
Patches e correções são aceitos na forma de solicitações de tração (PRS). Verifique se o problema que os endereços de solicitação de tração está aberto no rastreador de problemas.
O envio de uma solicitação de tração implica que você concorda em licenciar sua contribuição sob a licença do MIT.
O Pyxel é licenciado sob a licença do MIT. Ele pode ser reutilizado no software proprietário, desde que todas as cópias do software ou suas partes substanciais incluam uma cópia dos termos da licença do MIT e um aviso de direitos autorais.
A Pyxel está procurando patrocinadores nos patrocinadores do GitHub. Por favor, considere patrocinar o Pyxel para apoiar sua manutenção contínua e desenvolvimento de recursos. Como benefício, os patrocinadores podem consultar diretamente o desenvolvedor do Pyxel. Para mais detalhes, visite esta página.