[Inglés | 中文 | Deutsch | Español | Français | Italiano | 日本語 | 한국어 | Português | Русий | Türkçe | Українська]
Pyxel es un motor de juego retro para Python.
Con especificaciones simples inspiradas en consolas de juegos retro, como mostrar solo 16 colores y admitir 4 canales de sonido, puede disfrutar fácilmente haciendo juegos de estilo Pixel-Art.
El desarrollo de Pyxel está impulsado por los comentarios de los usuarios. ¡Por favor, dale a Pyxel una estrella en Github!
Las especificaciones y las API de Pyxel están inspiradas en Pico-8 y Tic-80.
Pyxel es de código abierto bajo la licencia MIT y de forma gratuita. ¡Comencemos a hacer juegos retro con Pyxel!
Después de instalar Python3 (versión 3.8 o superior), ejecute el siguiente comando:
pip install -U pyxel
Al instalar Python usando el instalador oficial, asegúrese de verificar la opción Add Python 3.x to PATH
para habilitar el comando pyxel
.
Después de instalar HomeBrew, ejecute los siguientes comandos:
brew install pipx
pipx ensurepath
pipx install pyxel
Para actualizar Pyxel después de la instalación, ejecute pipx upgrade pyxel
.
Después de instalar el paquete SDL2 ( libsdl2-dev
para ubuntu), python3 (versión 3.8 o superior) y python3-pip
, ejecute el siguiente comando:
sudo pip3 install -U pyxel
Si el comando anterior falla, considere construir pyxel desde la fuente siguiendo las instrucciones en el archivo de make.
La versión web de Pyxel no requiere la instalación de Python o Pyxel y se ejecuta en PC, teléfonos inteligentes y tabletas con navegadores web compatibles.
Para obtener instrucciones detalladas, consulte esta página.
Después de instalar Pyxel, puede copiar los ejemplos al directorio actual con el siguiente comando:
pyxel copy_examples
Los siguientes ejemplos se copiarán a su directorio actual:
01_hello_pyxel.py | Aplicación más simple | Manifestación | Código |
02_jump_game.py | Juego de salto con el archivo de recursos de Pyxel | Manifestación | Código |
03_draw_api.py | Demostración de apis de dibujo | Manifestación | Código |
04_sound_api.py | Demostración de apis de sonido | Manifestación | Código |
05_color_palette.py | Lista de paletas de colores | Manifestación | Código |
06_click_game.py | Juego de clic del mouse | Manifestación | Código |
07_Snake.py | Juego de serpiente con BGM | Manifestación | Código |
08_triangle_api.py | Demostración de apis de dibujo triangular | Manifestación | Código |
09_shooter.py | Dispara el juego con transiciones de pantalla | Manifestación | Código |
10_platformer.py | Juego de plataforma de desplazamiento lateral con mapa | Manifestación | Código |
11_offscreen.py | Renderización fuera de la pantalla con clase de imagen | Manifestación | Código |
12_perlin_noise.py | Animación de ruido de Perlin | Manifestación | Código |
13_bitmap_font.py | Dibujar una fuente de mapa de bits | Manifestación | Código |
14_synthesizer.py | Synthesizer utilizando funciones de expansión de audio | Manifestación | Código |
15_tiled_map_file.py | Carga y dibujo un archivo de mapa de mosaico (.tmx) | Manifestación | Código |
16_transform.py | Rotación de imágenes y escala | Manifestación | Código |
99_flip_animation.py | Animación con función Flip (solo plataformas no WEB) | Manifestación | Código |
30sec_of_daylight.pyxapp | 1er juego ganador de Pyxel Jam de Adam | Manifestación | Código |
megaball.pyxapp | Juego de física de la pelota de arcade por Adam | Manifestación | Código |
8bit-bgm-gen.pyxapp | Generador de música de fondo de Frenchbread | Manifestación | 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 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 cuadros y la función draw
, que maneja el dibujo de la pantalla.
En una aplicación real, se recomienda envolver el código 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 ()
Se puede ejecutar un script creado 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
monitorea los cambios en un directorio especificado y vuelve a ejecutar automáticamente el programa cuando se detectan los cambios:
pyxel watch WATCH_DIR PYTHON_SCRIPT_FILE
El monitoreo del directorio se puede detener presionando Ctrl(Command)+C
.
Las siguientes acciones clave especiales están disponibles mientras se ejecuta una aplicación Pyxel:
Esc
Alt(Option)+1
Alt(Option)+2
Alt(Option)+3
Alt(Option)+8
o A+B+X+Y+DL
en gamepadAlt(Option)+9
o A+B+X+Y+DR
en gamepadAlt(Option)+0
o A+B+X+Y+DU
en gamepadupdate
/ tiempo draw
)Alt(Option)+Enter
o A+B+X+Y+DD
en GamepadShift+Alt(Option)+1/2/3
Shift+Alt(Option)+0
El editor de Pyxel puede crear imágenes y sonidos utilizados en una aplicación Pyxel.
Puede iniciar el editor Pyxel con el siguiente comando:
pyxel edit PYXEL_RESOURCE_FILE
Si existe el archivo de recursos pyxel especificado (.pyxres), 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 comenzar el editor de Pyxel, puede cambiar a otro archivo de recursos arrastrándolo y dejándolo en el editor Pyxel.
El archivo de recursos creado se puede cargar utilizando la función load
.
El editor de Pyxel tiene los siguientes modos de edición.
Editor de imágenes
El modo para editar la imagen en cada banco de imágenes .
Puede arrastrar y soltar un archivo de imagen (PNG/GIF/JPEG) en el editor de imágenes para cargar la imagen en el banco de imágenes seleccionado actualmente.
Editor de tilemap
El modo para editar TilEmaps que organizan imágenes de los bancos de imágenes en un patrón de mosaico.
Arrastre y suelte un archivo TMX (archivo de mapa en mosaico) en el editor de tilemap para cargar su capa en el orden de dibujo que corresponde al número TILEMAP actualmente seleccionado.
Editor de sonido
El modo para editar sonidos utilizados para melodías y efectos de sonido.
Editor musical
El modo para editar músicos en los que se organizan los sonidos en orden de reproducción.
Las imágenes de Pyxel y TilEmaps también se pueden crear utilizando los siguientes métodos:
Image.set
o la función Tilemap.set
Image.load
.Los sonidos de Pyxel también se pueden crear utilizando el siguiente método:
Sound.set
o Music.set
Consulte la referencia de API para el uso de estas funciones.
PYXEL admite un formato de archivo de distribución de aplicaciones dedicado (archivo de aplicación PYXEL) que es multiplataforma.
Se crea un archivo de aplicación pyxel (.pyxapp) utilizando el comando pyxel package
:
pyxel package APP_DIR STARTUP_SCRIPT_FILE
Si necesita incluir recursos o módulos adicionales, colóquelos en el directorio de aplicaciones.
Los metadatos se pueden mostrar en tiempo de ejecución especificando en el siguiente formato dentro del script de inicio. Los campos que no sean 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 usando 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 marcos transcurridos
init(width, height, [title], [fps], [quit_key], [display_scale], [capture_scale], [capture_sec])
Inicialice 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 con title
, la velocidad de fotogramas con fps
, la clave para dejar la aplicación con quit_key
, la escala de visualización con display_scale
, la escala de captura de pantalla con capture_scale
y el tiempo máximo de grabación de la captura de pantalla de la pantalla Video con capture_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)
Inicie la aplicación Pyxel y llame a la función update
para la actualización de cuadro y la función draw
para el dibujo.
show()
Muestre la pantalla y espere hasta que se presione la tecla Esc
.
flip()
Actualice la pantalla por un marco. La aplicación sale cuando se presiona la tecla Esc
. Esta función no está disponible en la versión web.
quit()
Renuncia a la aplicación Pyxel.
load(filename, [excl_images], [excl_tilemaps], [excl_sounds], [excl_musics])
Cargue el archivo de recursos (.pyxres). Si se establece una opción en True
, el recurso correspondiente se excluirá 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 pantalla de la paleta también se actualizarán. El archivo de la paleta contiene entradas hexadecimales para los colores de la pantalla (por ejemplo, 1100FF
), separado por NewLines. El archivo de paleta también se puede usar para cambiar los colores que se muestran en el editor Pyxel.
user_data_dir(vendor_name, app_name)
Devuelve el directorio de datos del usuario creado en función de vendor_name
y app_name
. Si el directorio no existe, se creará automáticamente. Se utiliza para almacenar puntajes altos, 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 mouse
mouse_wheel
El valor actual de la rueda del mouse
btn(key)
Devuelve True
si se presiona la key
, de lo contrario, devuelve False
. (Lista de definición de clave)
btnp(key, [hold], [repeat])
Devuelve True
si la key
se presiona en ese cuadro, de lo contrario regresa False
. Si se especifican hold
and repeat
, después de que la key
se ha mantenido presionada para marcos hold
o más, True
se devuelve cada cuadro repeat
.
btnr(key)
Devuelve True
si la key
se lanza en ese cuadro, de lo contrario regresa False
.
mouse(visible)
Muestre el cursor del mouse si es visible
es True
, y esconderlo si visible
es False
. La posición del cursor continúa actualizándose incluso cuando está oculta.
colors
Lista de los colores de visualización de la paleta. El color de la pantalla se especifica mediante un valor numérico de 24 bits. Use colors.from_list
y colors.to_list
para asignar y recuperar directamente las 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 imagen (instancias de la clase de imagen) (0-2)
Ejemplo: pyxel.images[0].load(0, 0, "title.png")
tilemaps
Lista de los TileMaps (instancias de la clase TilEmap) (0-7)
clip(x, y, w, h)
Establezca el área de dibujo de la pantalla desde ( x
, y
) con un ancho de w
y una altura de h
. Llame clip()
para restablecer el área de dibujo a la pantalla completa.
camera(x, y)
Cambie las coordenadas de esquina superior izquierda de la pantalla a ( x
, y
). Llame a camera()
para restablecer las coordenadas de esquina superior izquierda a ( 0
, 0
).
pal(col1, col2)
Reemplace el color col1
con col2
al dibujar. Llame pal()
para restablecer a la paleta inicial.
dither(alpha)
Aplicar dithering (pseudo-transparencia) al dibujar. Establezca alpha
en el rango 0.0
- 1.0
, donde 0.0
es transparente y 1.0
es opaco.
cls(col)
Clear pantalla con color col
.
pget(x, y)
Obtenga el color del píxel en ( x
, y
).
pset(x, y, col)
Dibuja un píxel de color col
en ( x
, y
).
line(x1, y1, x2, y2, col)
Dibuja una línea de color col
de ( x1
, y1
) a ( x2
, y2
).
rect(x, y, w, h, col)
Dibuja un rectángulo de ancho w
, altura h
y color col
de ( x
, y
).
rectb(x, y, w, h, col)
Dibuja el contorno de un rectángulo de ancho w
, altura h
y color col
de ( x
, y
).
circ(x, y, r, col)
Dibuja un círculo de radio r
y color col
en ( x
, y
).
circb(x, y, r, col)
Dibuja el contorno de un círculo de radio r
y color col
en ( x
, y
).
elli(x, y, w, h, col)
Dibuja una elipse de ancho w
, altura h
y color col
de ( x
, y
).
ellib(x, y, w, h, col)
Dibuja el contorno de una elipse de ancho w
, altura h
y color col
de ( x
, y
).
tri(x1, y1, x2, y2, x3, y3, col)
Dibuja un triángulo con vértices ( x1
, y1
), ( x2
, y2
), ( x3
, y3
) y color col
.
trib(x1, y1, x2, y2, x3, y3, col)
Dibuja el contorno de un triángulo con vértices ( x1
, y1
), ( x2
, y2
), ( x3
, y3
) y color col
.
fill(x, y, col)
Llene el área conectada con el mismo color que ( x
, y
) con color col
.
blt(x, y, img, u, v, w, h, [colkey], [rotate], [scale])
Copie la región de tamaño ( w
, h
) de ( u
, v
) del banco de imágenes img
(0-2) a ( x
, y
). Si se asigna un valor negativo a w
y/o h
, la región se volteará horizontalmente y/o verticalmente. Si se especifica colkey
, se tratará como un color transparente. Si rotate
(en grados), se especifican scale
(1.0 = 100%), o ambas, se aplicarán las transformaciones correspondientes.
bltm(x, y, tm, u, v, w, h, [colkey], [rotate], [scale])
w
, h
) de ( u
, v
) del tilemap tm
(0-7) a ( x
, y
). Si se asigna un valor negativo a w
y/o h
, la región se volteará horizontalmente y/o verticalmente. Si se especifica colkey
, se tratará como un color transparente. Si rotate
(en grados), se especifican scale
(1.0 = 100%), o ambas, se aplicarán las transformaciones correspondientes. El tamaño de un mosaico es de 8x8 píxeles y se almacena en un tilemap como una tupla de (image_tx, image_ty)
. text(x, y, s, col)
s
de color col
en ( x
, y
). sounds
Lista de los sonidos (instancias de la clase de sonido) (0-63)
Ejemplo: pyxel.sounds[0].speed = 60
musics
Lista de las músicas (instancias de la clase de música) (0-7)
play(ch, snd, [tick], [loop], [resume])
Reproduzca el sonido snd
(0-63) en el canal ch
(0-3). Si snd
es una lista, los sonidos se reproducirán en secuencia. La posición de inicio de reproducción se puede especificar por tick
(1 tick = 1/120 segundos). Si loop
se establece en True
, se realiza la reproducción de bucle. Para reanudar el sonido anterior después de que termina la reproducción, configure resume
en True
.
playm(msc, [tick], [loop])
Reproduce el msc
de Music (0-7). La posición de inicio de reproducción se puede especificar por tick
(1 tick = 1/120 segundos). Si loop
se establece en True
, se realiza la reproducción de bucle.
stop([ch])
Detener la reproducción del canal especificado ch
(0-3). Llame stop()
para detener todos los canales.
play_pos(ch)
Obtenga la posición de reproducción de sonido de Channel ch
(0-3) como una tupla de (sound_no, note_no)
. No devuelve None
cuando la reproducción se ha detenido.
ceil(x)
Devuelva el entero más pequeño que sea mayor o igual a x
.
floor(x)
Devuelva el entero más grande que sea menor o igual a x
.
sgn(x)
Devuelve 1
cuando x
es positivo, 0
cuando es 0
y -1
cuando es negativo.
sqrt(x)
Devuelve la raíz cuadrada de x
.
sin(deg)
Devuelve el seno de grados deg
.
cos(deg)
Devuelve el coseno de grados deg
.
atan2(y, x)
Devuelve el arctangent de y
/ x
en grados.
rseed(seed)
Establece la semilla del generador de números aleatorios.
rndi(a, b)
Devolver un entero aleatorio mayor o igual a a
y menor o igual a b
.
rndf(a, b)
Devolver un número de punto flotante aleatorio mayor o igual a a
y menor o igual a b
nseed(seed)
Establezca la semilla del ruido de Perlin.
noise(x, [y], [z])
Devuelva el valor de ruido de Perlin para las coordenadas especificadas.
width
, height
El ancho y la altura de la imagen
set(x, y, data)
Establezca la imagen en ( x
, y
) usando una lista de cadenas.
Ejemplo: pyxel.images[0].set(10, 10, ["0123", "4567", "89ab", "cdef"])
load(x, y, filename)
Cargue un archivo de imagen (PNG/GIF/JPEG) en ( x
, y
).
pget(x, y)
Obtenga el color del píxel en ( x
, y
).
pset(x, y, col)
Dibuja un píxel con el color col
en ( x
, y
).
width
, height
El ancho y la altura del mapa de manchas
imgsrc
El banco de imágenes (0-2) referenciado por el TilEmap
set(x, y, data)
Establezca el tilemap en ( x
, y
) usando una lista de cadenas.
Ejemplo: pyxel.tilemap(0).set(0, 0, ["0000 0100 a0b0", "0001 0101 a1b1"])
load(x, y, filename, layer)
Cargue la capa en la layer
de orden de dibujo (0-) desde el archivo TMX (archivo de mapa de mosaico) en ( x
, y
).
pget(x, y)
Obtenga el mosaico en ( x
, y
). Un mosaico se representa como una tupla de (image_tx, image_ty)
.
pset(x, y, tile)
Dibuja un tile
en ( x
, y
). Un mosaico se representa como una tupla de (image_tx, image_ty)
.
notes
Lista de notas (0-127). Cuanto mayor sea el número, mayor es el tono. La nota 33
corresponde a 'A2' (440Hz). Las notas de descanso están representadas por -1
.
tones
Lista de tonos (0: Triángulo / 1: cuadrado / 2: Pulso / 3: Ruido)
volumes
Lista de volúmenes (0-7)
effects
Lista de efectos (0: Ninguno / 1: Diapositiva / 2: Vibrato / 3: FadeOut / 4: Half-FadeOut / 5: Quarter-FadeOut)
speed
Velocidad de reproducción. 1
es el más rápido y cuanto mayor es el número, más lenta es la velocidad de reproducción. Con 120
, la longitud de una nota se convierte en 1 segundo.
set(notes, tones, volumes, effects, speed)
Establezca notas, tonos, volúmenes y efectos usando una cadena. Si la longitud de los tonos, los volúmenes o los efectos son más cortos que las notas, se repetirán desde el principio.
set_notes(notes)
Establezca las notas usando una cadena hecha de 'CDEFGAB'+'#-'+'01234' o 'R'. Es insensible al caso, y se ignora el espacio en blanco.
Ejemplo: pyxel.sounds[0].set_notes("G2B-2D3R RF3F3F3")
set_tones(tones)
Establezca los tonos con una cadena hecha de 'TSPN'. Se ignora el caso de los casos y el espacio en blanco.
Ejemplo: pyxel.sounds[0].set_tones("TTSS PPPN")
set_volumes(volumes)
Establezca los volúmenes con una cadena hecha de '01234567'. Se ignora el caso de los casos y el espacio en blanco.
Ejemplo: pyxel.sounds[0].set_volumes("7777 7531")
set_effects(effects)
Establezca los efectos con una cadena hecha de 'NSVFHQ'. Se ignora el caso de los casos y el espacio en blanco.
Ejemplo: pyxel.sounds[0].set_effects("NFNF NVVS")
seqs
Una lista bidimensional de sonidos (0-63) en múltiples canales
set(seq0, seq1, seq2, ...)
Establezca las listas de sonido (0-63) para cada canal. Si se especifica una lista vacía, ese canal no se usará 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 un conocimiento especializado para usar.
Si tiene confianza en sus habilidades, intente crear trabajos increíbles usando esto como guía.
Use el rastreador de problemas para enviar informes de errores y características o solicitudes de mejora. Antes de enviar un nuevo problema, asegúrese de que no haya problemas abiertos similares.
¡Cualquiera que pruebe manualmente el código e informa errores o sugerencias de mejoras en el rastreador de problemas es muy bienvenido!
Los parches y las correcciones se aceptan en forma de solicitudes de extracción (PR). Asegúrese de que el problema de las direcciones de solicitud de extracción esté abierto en el rastreador de problemas.
Enviar una solicitud de extracción implica que acepta licenciar su contribución bajo la licencia MIT.
Pyxel tiene licencia bajo la licencia MIT. Se puede reutilizar en software propietario, siempre que todas las copias del software o sus porciones sustanciales incluyan una copia de los términos de la licencia del MIT y un aviso de derechos de autor.
Pyxel está buscando patrocinadores en los patrocinadores de GitHub. Considere patrocinar a Pyxel para respaldar su mantenimiento continuo y desarrollo de características. Como beneficio, los patrocinadores pueden consultar directamente con el desarrollador de Pyxel. Para más detalles, visite esta página.