[ English | 中文 | Deutsch | Español | Français | Italiano | 日本語 | 한국어 | Português | Русский | Türkçe | Українська ]
Pyxel es un motor de juegos retro para Python.
Las especificaciones están inspiradas en las consolas de juegos retro, como el soporte para solo 16 colores y 4 canales de sonido, lo que te permite disfrutar fácilmente de la creación de juegos con estilo de arte en píxeles.
El desarrollo de Pyxel se basa en los comentarios de los usuarios. ¡Por favor, dale una estrella a Pyxel en GitHub!
Las especificaciones y APIs de Pyxel están inspiradas en PICO-8 y TIC-80.
Pyxel es de código abierto bajo la Licencia MIT y es gratuito para usar. ¡Comencemos a crear juegos retro con Pyxel!
- Funciona en Windows, Mac, Linux y Web
- Programación en Python
- Paleta de 16 colores
- 3 bancos de imágenes de 256x256
- 8 mapas de teselas de 256x256
- 4 canales con 64 sonidos definibles
- 8 pistas de música que pueden combinar cualquier sonido
- Entradas de teclado, ratón y gamepad
- Herramientas de edición de imágenes y sonidos
- Colores, canales y bancos ampliables por el usuario
Después de instalar Python3 (versión 3.8 o superior), ejecuta el siguiente comando:
pip install -U pyxel
Al instalar Python usando el instalador oficial, asegúrate de marcar la opción Add Python 3.x to PATH
para habilitar el comando pyxel
.
Después de instalar Homebrew, ejecuta los siguientes comandos:
brew install pipx
pipx ensurepath
pipx install pyxel
Para actualizar Pyxel después de la instalación, ejecuta pipx upgrade pyxel
.
Después de instalar el paquete SDL2 (libsdl2-dev
para Ubuntu), Python3 (versión 3.8 o superior) y python3-pip
, ejecuta el siguiente comando:
sudo pip3 install -U pyxel
Si el comando anterior falla, considera construir Pyxel desde el código fuente siguiendo las instrucciones en el Makefile.
La versión web de Pyxel no requiere instalación de Python o Pyxel y se ejecuta en PCs, smartphones y tabletas con navegadores web compatibles.
Para obtener instrucciones detalladas, consulta esta página.
Después de instalar Pyxel, puedes copiar los ejemplos al directorio actual con el siguiente comando:
pyxel copy_examples
Los siguientes ejemplos serán copiados a tu directorio actual:
01_hello_pyxel.py | La aplicación más simple | Demo | Código |
02_jump_game.py | Juego de saltos con archivo de recursos de Pyxel | Demo | Código |
03_draw_api.py | Demostración de las API de dibujo | Demo | Código |
04_sound_api.py | Demostración de las API de sonido | Demo | Código |
05_color_palette.py | Lista de paletas de colores | Demo | Código |
06_click_game.py | Juego de clic con el ratón | Demo | Código |
07_snake.py | Juego de la serpiente con BGM | Demo | Código |
08_triangle_api.py | Demostración de las API de dibujo de triángulos | Demo | Código |
09_shooter.py | Shoot 'em up con transiciones de pantalla | Demo | Código |
10_platformer.py | Juego de plataformas desplazamiento lateral con mapa | Demo | Código |
11_offscreen.py | Renderizado fuera de pantalla con la clase Image | Demo | Código |
12_perlin_noise.py | Animación de ruido de Perlin | Demo | Código |
13_bitmap_font.py | Dibujo de una fuente de mapa de bits | Demo | Código |
14_synthesizer.py | Sintetizador utilizando características de expansión de audio | Demo | Código |
15_tiled_map_file.py | Carga y dibujo de Tiled Map File (.tmx) | Demo | Código |
16_transform.py | Rotación y escalado de imágenes | Demo | Código |
99_flip_animation.py | Animación con la función flip (solo para plataformas que no son web) | Demo | Código |
30sec_of_daylight.pyxapp | Juego ganador del 1er Pyxel Jam por Adam | Demo | Código |
megaball.pyxapp | Juego de física de pelota arcade por Adam | Demo | Código |
8bit-bgm-gen.pyxapp | Generador de música de fondo por frenchbread | Demo | Código |
Los ejemplos se pueden ejecutar con los siguientes comandos:
cd pyxel_examples
pyxel run 01_hello_pyxel.py
pyxel play 30sec_of_daylight.pyxapp
En su script de Python, importe el módulo Pyxel, especifique el tamaño de la ventana con la función init
y luego inicie la aplicación Pyxel con la función 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)
Los argumentos de la función run
son la función update
, que procesa las actualizaciones de los fotogramas, y la función draw
, que maneja el dibujo en la pantalla.
En una aplicación real, se recomienda encapsular el código de Pyxel en una clase, como se muestra a continuación:
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 crear gráficos simples sin animación, puede usar la función show
para simplificar su código.
import pyxel
pyxel.init(120, 120)
pyxel.cls(1)
pyxel.circb(60, 60, 40, 7)
pyxel.show()
Un script creado se puede ejecutar utilizando el comando python
:
python PYTHON_SCRIPT_FILE
También se puede ejecutar con el comando pyxel run
:
pyxel run PYTHON_SCRIPT_FILE
Además, el comando pyxel watch
supervisa los cambios en un directorio especificado y vuelve a ejecutar automáticamente el programa cuando se detectan cambios:
pyxel watch WATCH_DIR PYTHON_SCRIPT_FILE
La supervisión del directorio se puede detener presionando Ctrl(Command)+C
.
Durante la ejecución de una aplicación Pyxel, se pueden realizar las siguientes acciones de teclas especiales:
Esc
Salir de la aplicaciónAlt(Option)+1
Guardar la captura de pantalla en el escritorioAlt(Option)+2
Reiniciar el tiempo de inicio de la grabación del video de captura de pantallaAlt(Option)+3
Guardar un video de captura de pantalla en el escritorio (hasta 10 segundos)Alt(Option)+8
oA+B+X+Y+DL
en el gamepad
Alterna el escalado de pantalla entre máximo e enteroAlt(Option)+9
oA+B+X+Y+DR
en el gamepad
Cambiar entre los modos de pantalla (Crisp/Smooth/Retro)Alt(Option)+0
oA+B+X+Y+DU
en el gamepad
Alternar el monitor de rendimiento (FPS/update
tiempo/draw
tiempo)Alt(Option)+Enter
oA+B+X+Y+DD
en el gamepad
Alternar pantalla completaShift+Alt(Option)+1/2/3
Guarda el banco de imágenes 0, 1 o 2 en el escritorioShift+Alt(Option)+0
Guardar la paleta de colores actual en el escritorio
Pyxel Editor puede crear imágenes y sonidos utilizados en una aplicación Pyxel.
Puedes iniciar Pyxel Editor con el siguiente comando:
pyxel edit PYXEL_RESOURCE_FILE
Si el archivo de recursos de Pyxel especificado (.pyxres) existe, se cargará. Si no existe, se creará un nuevo archivo con el nombre especificado. Si se omite el archivo de recursos, se creará un nuevo archivo llamado my_resource.pyxres
.
Después de iniciar Pyxel Editor, puedes cambiar a otro archivo de recursos arrastrándolo y soltándolo en Pyxel Editor.
El archivo de recursos creado se puede cargar utilizando la función load
.
Pyxel Editor tiene los siguientes modos de edición.
Editor de imágenes
El modo para editar la imagen en cada banco de imágenes.
Puedes arrastrar y soltar un archivo de imagen (PNG/GIF/JPEG) en el editor de imágenes para cargar la imagen en la banca de imágenes actualmente seleccionada.
Editor de mapas de teselas
El modo para editar los mapas de teselas que organizan imágenes de los bancos de imágenes en un patrón de teselas.
Arrastra y suelta un archivo TMX (Tiled Map File) en el editor de mapas de teselas para cargar su capa 0 en el mapa de teselas actualmente seleccionado.
Editor de sonidos
El modo para editar los sonidos utilizados para melodías y efectos de sonido.
Editor de música
El modo para editar músicas en el que los sonidos están organizados en orden de reproducción.
Las imágenes y los mapas de teselas de Pyxel también se pueden crear utilizando los siguientes métodos:
- Crear una imagen a partir de una lista de cadenas utilizando la función
Image.set
o la funciónTilemap.set
- Cargar un archivo de imagen (PNG/GIF/JPEG) en la paleta de Pyxel con la función
Image.load
Los sonidos de Pyxel también se pueden crear utilizando el siguiente método:
- Crear un sonido a partir de cadenas con la función
Sound.set
o la funciónMusic.set
Consulta la referencia de la API para el uso de estas funciones.
Pyxel admite un formato de archivo dedicado a la distribución de aplicaciones (archivo de aplicación Pyxel) que es multiplataforma.
Un archivo de aplicación Pyxel (.pyxapp) se crea utilizando el comando pyxel package
:
pyxel package APP_DIR STARTUP_SCRIPT_FILE
Si necesitas incluir recursos o módulos adicionales, colócalos en el directorio de la aplicación.
Los metadatos se pueden mostrar en tiempo de ejecución especificándolos en el siguiente formato dentro del script de inicio. Los campos distintos de title
y author
son opcionales.
# title: Pyxel Platformer
# author: Takashi Kitao
# desc: A Pyxel platformer example
# site: https://github.com/kitao/pyxel
# license: MIT
# version: 1.0
El archivo de aplicación creado se puede ejecutar utilizando el comando pyxel play
:
pyxel play PYXEL_APP_FILE
Un archivo de aplicación Pyxel también se puede convertir en un archivo ejecutable o un archivo HTML utilizando los comandos pyxel app2exe
o pyxel app2html
.
-
width
,height
El ancho y la altura de la pantalla -
frame_count
El número de fotogramas transcurridos -
init(width, height, [title], [fps], [quit_key], [display_scale], [capture_scale], [capture_sec])
Inicializa la aplicación Pyxel con el tamaño de la pantalla (width
,height
). Se pueden especificar las siguientes opciones: el título de la ventana contitle
, la tasa de fotogramas confps
, la tecla para salir de la aplicación conquit_key
, la escala de la pantalla condisplay_scale
, la escala de captura de pantalla concapture_scale
, y el tiempo máximo de grabación del video de captura de pantalla concapture_sec
.
Ejemplo:pyxel.init(160, 120, title="My Pyxel App", fps=60, quit_key=pyxel.KEY_NONE, capture_scale=3, capture_sec=0)
-
run(update, draw)
Inicia la aplicación Pyxel y llama a la funciónupdate
para actualizar el fotograma y a la funcióndraw
para dibujar. -
show()
Muestra la pantalla y espera hasta que se presione la teclaEsc
. -
flip()
Actualiza la pantalla por un fotograma. La aplicación se cierra cuando se presiona la teclaEsc
. Esta función no está disponible en la versión web. -
quit()
Cierra la aplicación Pyxel.
-
load(filename, [excl_images], [excl_tilemaps], [excl_sounds], [excl_musics])
Carga el archivo de recursos (.pyxres). Si se establece una opción comoTrue
, se excluirá el recurso correspondiente de la carga. Si existe un archivo de paleta (.pyxpal) con el mismo nombre en la misma ubicación que el archivo de recursos, los colores de la paleta también se actualizarán. El archivo de paleta contiene entradas hexadecimales para los colores de visualización (ej.1100FF
), separadas por saltos de línea. El archivo de paleta también puede utilizarse para cambiar los colores mostrados en Pyxel Editor. -
user_data_dir(vendor_name, app_name)
Devuelve el directorio de datos de usuario creado en función devendor_name
yapp_name
. Si el directorio no existe, se creará automáticamente. Se utiliza para almacenar puntuaciones altas, el progreso del juego y datos similares.
Ejemplo:print(pyxel.user_data_dir("Takashi Kitao", "Pyxel Shooter"))
-
mouse_x
,mouse_y
La posición actual del cursor del ratón -
mouse_wheel
El valor actual de la rueda del ratón -
btn(key)
DevuelveTrue
si se presiona la teclakey
, de lo contrario, devuelveFalse
. (Lista de definición de teclas) -
btnp(key, [hold], [repeat])
DevuelveTrue
si se presiona la teclakey
en ese fotograma, de lo contrario, devuelveFalse
. Si se especificanhold
yrepeat
, después de que la teclakey
haya sido presionada durante más dehold
fotogramas, se devolveráTrue
cadarepeat
fotogramas. -
btnr(key)
DevuelveTrue
si la teclakey
se ha soltado en ese fotograma, de lo contrario, devuelveFalse
. -
mouse(visible)
Muestra el cursor del ratón sivisible
esTrue
, y lo oculta sivisible
esFalse
. La posición del cursor sigue actualizándose incluso cuando está oculto.
-
colors
Lista de los colores de la paleta. El color de visualización se especifica mediante un valor numérico de 24 bits. Usacolors.from_list
ycolors.to_list
para asignar y recuperar directamente listas de Python.
Ejemplo:old_colors = pyxel.colors.to_list(); pyxel.colors.from_list([0x111111, 0x222222, 0x333333]); pyxel.colors[15] = 0x112233
-
images
Lista de los bancos de imágenes (instancias de la clase Image) (0-2)
Ejemplo:pyxel.images[0].load(0, 0, "title.png")
-
tilemaps
Lista de los mapas de teselas (instancias de la clase Tilemap) (0-7) -
clip(x, y, w, h)
Establece el área de dibujo de la pantalla desde (x
,y
) con un ancho dew
y una altura deh
. Llama aclip()
para restablecer el área de dibujo a la pantalla completa. -
camera(x, y)
Cambia las coordenadas de la esquina superior izquierda de la pantalla a (x
,y
). Llama acamera()
para restablecer las coordenadas de la esquina superior izquierda a (0
,0
). -
pal(col1, col2)
Reemplaza el colorcol1
concol2
al dibujar. Llama apal()
para restablecer la paleta original. -
dither(alpha)
Aplica tramado (pseudo-transparencia) al dibujar. Establecealpha
en el rango de0.0
a1.0
, donde0.0
es transparente y1.0
es opaco. -
cls(col)
Limpia la pantalla con el colorcol
. -
pget(x, y)
Obtiene el color del píxel en (x
,y
). -
pset(x, y, col)
Dibuja un píxel de colorcol
en (x
,y
). -
line(x1, y1, x2, y2, col)
Dibuja una línea de colorcol
desde (x1
,y1
) hasta (x2
,y2
). -
rect(x, y, w, h, col)
Dibuja un rectángulo de anchow
, altoh
y colorcol
desde (x
,y
). -
rectb(x, y, w, h, col)
Dibuja el contorno de un rectángulo de anchow
, altoh
y colorcol
desde (x
,y
). -
circ(x, y, r, col)
Dibuja un círculo con radior
y colorcol
en (x
,y
). -
circb(x, y, r, col)
Dibuja el contorno de un círculo con radior
y colorcol
en (x
,y
). -
elli(x, y, w, h, col)
Dibuja una elipse de anchow
, altoh
y colorcol
desde (x
,y
). -
ellib(x, y, w, h, col)
Dibuja el contorno de una elipse de anchow
, altoh
y colorcol
desde (x
,y
). -
tri(x1, y1, x2, y2, x3, y3, col)
Dibuja un triángulo con vértices en (x1
,y1
), (x2
,y2
), (x3
,y3
) y colorcol
. -
trib(x1, y1, x2, y2, x3, y3, col)
Dibuja el contorno de un triángulo con vértices en (x1
,y1
), (x2
,y2
), (x3
,y3
) y colorcol
. -
fill(x, y, col)
Rellena el área conectada con el mismo color que (x
,y
) con el colorcol
. -
blt(x, y, img, u, v, w, h, [colkey], [rotate], [scale])
Copia la región de tamaño (w
,h
) desde (u
,v
) del banco de imágenesimg
(0-2) a (x
,y
). Si se asigna un valor negativo aw
y/oh
, la región se volteará horizontal y/o verticalmente. Si se especificacolkey
, será tratado como un color transparente. Si se especificanrotate
(en grados),scale
(1.0 = 100%) o ambos, se aplicarán las transformaciones correspondientes.
bltm(x, y, tm, u, v, w, h, [colkey], [rotate], [scale])
Copia la región de tamaño (w
,h
) desde (u
,v
) del mapa de teselastm
(0-7) a (x
,y
). Si se asigna un valor negativo aw
y/oh
, la región se volteará horizontal y/o verticalmente. Si se especificacolkey
, será tratado como un color transparente. Si se especificanrotate
(en grados),scale
(1.0 = 100%) o ambos, se aplicarán las transformaciones correspondientes. El tamaño de una tesela es de 8x8 píxeles y se almacena en un mapa de teselas como una tupla de(image_tx, image_ty)
.
text(x, y, s, col)
Dibuja una cadena de textos
en el colorcol
en (x
,y
).
-
sounds
Lista de los sonidos (instancias de la clase Sound) (0-63)
Ejemplo:pyxel.sounds[0].speed = 60
-
musics
Lista de las músicas (instancias de la clase Music) (0-7) -
play(ch, snd, [tick], [loop], [resume])
Reproduce el sonidosnd
(0-63) en el canalch
(0-3). Sisnd
es una lista, los sonidos se reproducirán en secuencia. La posición de inicio de reproducción puede especificarse mediantetick
(1 tick = 1/120 segundos). Siloop
se establece enTrue
, la reproducción se repetirá. Para reanudar el sonido anterior después de que termine la reproducción, estableceresume
enTrue
. -
playm(msc, [tick], [loop])
Reproduce la músicamsc
(0-7). La posición de inicio de reproducción puede especificarse mediantetick
(1 tick = 1/120 segundos). Siloop
se establece enTrue
, la reproducción se repetirá. -
stop([ch])
Detiene la reproducción del canal especificadoch
(0-3). Llama astop()
para detener todos los canales. -
play_pos(ch)
Obtiene la posición de reproducción del sonido en el canalch
(0-3) como una tupla de(sound_no, note_no)
. DevuelveNone
cuando se ha detenido la reproducción.
-
ceil(x)
Devuelve el entero más pequeño que es mayor o igual ax
. -
floor(x)
Devuelve el entero más grande que es menor o igual ax
. -
sgn(x)
Devuelve1
six
es positivo,0
si es0
, y-1
si es negativo. -
sqrt(x)
Devuelve la raíz cuadrada dex
. -
sin(deg)
Devuelve el seno dedeg
grados. -
cos(deg)
Devuelve el coseno dedeg
grados. -
atan2(y, x)
Devuelve el arcotangente dey
/x
en grados. -
rseed(seed)
Establece la semilla del generador de números aleatorios. -
rndi(a, b)
Devuelve un número entero aleatorio mayor o igual aa
y menor o igual ab
. -
rndf(a, b)
Devuelve un número flotante aleatorio mayor o igual aa
y menor o igual ab
. -
nseed(seed)
Establece la semilla del ruido de Perlin. -
noise(x, [y], [z])
Devuelve el valor de ruido de Perlin para las coordenadas especificadas.
-
width
,height
El ancho y la altura de la imagen -
set(x, y, data)
Establece la imagen en (x
,y
) utilizando una lista de cadenas de texto.
Ejemplo:pyxel.images[0].set(10, 10, ["0123", "4567", "89ab", "cdef"])
-
load(x, y, filename)
Carga un archivo de imagen (PNG/GIF/JPEG) en (x
,y
). -
pget(x, y)
Obtiene el color del píxel en (x
,y
). -
pset(x, y, col)
Dibuja un píxel con el colorcol
en (x
,y
).
-
width
,height
El ancho y la altura del mapa de teselas -
imgsrc
El banco de imágenes (0-2) referenciado por el mapa de teselas -
set(x, y, data)
Establece el mapa de teselas en (x
,y
) utilizando una lista de cadenas de texto.
Ejemplo:pyxel.tilemap(0).set(0, 0, ["0000 0100 a0b0", "0001 0101 a1b1"])
-
load(x, y, filename, layer)
Carga lalayer
(0-) desde el archivo TMX (Tiled Map File) en (x
,y
). -
pget(x, y)
Obtiene la tesela en (x
,y
). Una tesela se representa como una tupla de(image_tx, image_ty)
. -
pset(x, y, tile)
Dibuja unatesela
en (x
,y
). Una tesela se representa como una tupla de(image_tx, image_ty)
.
-
notes
Lista de notas (0-127). Cuanto mayor es el número, mayor es el tono. La nota33
corresponde a 'A2'(440Hz). Las notas de descanso se representan con-1
. -
tones
Lista de tonos (0:Triangle / 1:Square / 2:Pulse / 3:Noise) -
volumes
Lista de volúmenes (0-7) -
effects
Lista de efectos (0:None / 1:Slide / 2:Vibrato / 3:FadeOut / 4:Half-FadeOut / 5:Quarter-FadeOut) -
speed
Velocidad de reproducción.1
es la más rápida, y cuanto mayor sea el número, más lenta será la reproducción. A120
, la duración de una nota es de 1 segundo. -
set(notes, tones, volumes, effects, speed)
Establece notas, tonos, volúmenes y efectos utilizando una cadena de texto. Si la longitud de los tonos, volúmenes o efectos es menor que la de las notas, se repetirán desde el principio. -
set_notes(notes)
Establece las notas utilizando una cadena de texto compuesta por 'CDEFGAB'+'#-'+'01234' o 'R'. No se distingue entre mayúsculas y minúsculas, y los espacios en blanco se ignoran.
Ejemplo:pyxel.sounds[0].set_notes("G2B-2D3R RF3F3F3")
-
set_tones(tones)
Establece los tonos con una cadena de texto compuesta por 'TSPN'. No se distingue entre mayúsculas y minúsculas, y los espacios en blanco se ignoran.
Ejemplo:pyxel.sounds[0].set_tones("TTSS PPPN")
-
set_volumes(volumes)
Establece los volúmenes con una cadena de texto compuesta por '01234567'. No se distingue entre mayúsculas y minúsculas, y los espacios en blanco se ignoran.
Ejemplo:pyxel.sounds[0].set_volumes("7777 7531")
-
set_effects(effects)
Establece los efectos con una cadena de texto compuesta por 'NSVFHQ'. No se distingue entre mayúsculas y minúsculas, y los espacios en blanco se ignoran.
Ejemplo:pyxel.sounds[0].set_effects("NFNF NVVS")
-
seqs
Una lista bidimensional de sonidos (0-63) a través de múltiples canales -
set(seq0, seq1, seq2, ...)
Establece las listas de sonidos (0-63) para cada canal. Si se especifica una lista vacía, ese canal no se utilizará para la reproducción.
Ejemplo:pyxel.musics[0].set([0, 1], [], [3])
Pyxel incluye una "API Avanzada" que no se menciona en esta referencia, ya que puede confundir a los usuarios o requerir conocimientos especializados para su uso.
Si confías en tus habilidades, ¡intenta crear obras increíbles usando esto como guía!
Utiliza el Issue Tracker para enviar informes de errores y solicitudes de funciones o mejoras. Antes de enviar un nuevo problema, asegúrate de que no haya problemas abiertos similares.
¡Cualquier persona que pruebe manualmente el código y reporte errores o sugerencias de mejoras en el Issue Tracker es muy bienvenida!
Los parches y correcciones se aceptan en forma de solicitudes de extracción (PRs). Asegúrate de que el problema que aborda la solicitud de extracción esté abierto en el Issue Tracker.
Enviar una solicitud de extracción implica que aceptas licenciar tu contribución bajo la Licencia MIT.
Pyxel está licenciado bajo la Licencia MIT. Se puede reutilizar en software propietario, siempre que todas las copias del software o sus partes sustanciales incluyan una copia de los términos de la Licencia MIT y un aviso de copyright.
Pyxel está buscando patrocinadores en GitHub Sponsors. Por favor, considera patrocinar a Pyxel para apoyar su mantenimiento continuo y desarrollo de funciones. Como beneficio, los patrocinadores pueden consultar directamente con el desarrollador de Pyxel. Para más detalles, visita esta página.