====== Pyxel ======
Biblioteca de [[informatica:programacion:python|Python]] para desarrollar juegos retro.
Inspirado en consolas retro, aplica varias restricciones como una paleta de 16 colores y 4 canales de audio.
* [[https://github.com/kitao/pyxel|Repositorio de código]]
===== Características =====
* Multiplataforma (Windows, Mac, Linux y web)
* Programable con Python (aunque está hecho en Rust)
* Paleta de 16 colores
* 3 bancos de imágenes de 256x256
* 8 tilemaps de 256x256
* 4 canales con 64 sonidos diferentes
* 8 pistas de música combinando cualquier sonido
* Compatible con teclado, ratón y mando
* Herramientas para la edición de imágenes y sonidos
* Bancos, canales y colores extensibles por el usuario
===== Instalación =====
En Linux, sería de la siguiente manera:
sudo pip3 install -U pyxel
Necesario el paquete SDL2 (''libsdl2-dev'' en Ubuntu), Python3 (version 3.8 o superior), y ''python3-pip''
En Arch Linux, está disponible mediante el paquete ''python-pyxel'', en AUR.
===== Hola, mundo =====
Ejemplo más sencillo que muestra un texto por pantalla:
import pyxel
class App:
def __init__(self):
pyxel.init(160,120,title="Hello, world")
pyxel.run(self.update, self.draw)
def update(self):
# Se ejecutará 60 veces por segundo (FPS)
if pyxel.btnp(pyxel.KEY_Q):
pyxel.quit()
def draw(self):
pyxel.cls(0)
pyxel.text(55, 41, "Hello, world!", 5)
App()
Si guardamos el fichero como ''main.py'', lo podríamos ejecutar con:
pyxel run main.py
==== pyxel.init ====
Esta función inicializa el motor de Pyxel y genera la ventana.
pyxel.init(160,120,title="Hello, world")
La anterior instrucción crea una ventana de 160 x 120 pixeles con el título //Hello, world//.
Firma de la función:
init(width, height, [title], [fps], [quit_key], [display_scale], [capture_scale], [capture_sec])
* ''width'': anchura de la pantalla.
* ''height'': altura de la pantalla.
* ''title'': título de la ventana.
* ''fps'': frames por segundo.
* ''quit_key'': tecla para cerrar la aplicación.
* ''display_scale'':
* ''capture_scale''
* ''capture_sec'': duración máxima (segundos) de la captura de vídeo.
==== pyxel.run ====
Esta función inicia la aplicación Pyxel. Necesita recibir por parámetro 2 funciones:
* ''update'': actualiza los valores del juego (controles, física, etc) en cada //frame//.
* ''draw'': dibuja elementos en pantalla
pyxel.run(self.update, self.draw)
Por defecto, la función ''update'' se ejecuta 30 veces por segundo.
===== API =====
Todas las funciones disponibles de la API de Pyxel se pueden consultar en:
* [[https://github.com/kitao/pyxel?tab=readme-ov-file#api-reference|API Reference]]
===== Ejecutar una aplicación =====
Al tratarse de scripts en Python, los juegos hechos con Pyxel se pueden lanzar de la siguiente manera:
python mijuego.py
También puede ejecutarse con el comando ''pyxel run'':
pyxel run mijuego.py
Si queremos que Pyxel esté pendiente de los cambios en un directorio y relance el programa cuando esto suceda:
pyxel watch
==== Controles durante la ejecución de la aplicación ====
^ Tecla ^ Descripción ^
| Esc | Cierra la aplicación |
| Alt + 1 | Guarda una captura de pantalla en el escritorio |
| Alt + 2 | Reinicia el tiempo de inicio de grabación de una captura de vídeo |
| Alt + 3 | Guarda una captura de vídeo en el escritorio (de 10 segundos) |
| Alt + 8 | Alterna el escalado de pantalla |
| Alt + 9 | Cambia entre modos de pantalla (Crisp/Smooth/Retro) |
| Alt + 0 | Alterna el monitor de rendimiento (fps/update time/draw time) |
| Alt + Enter | Alterna pantalla completa |
| Shift + Alt + 1 | Guarda el banco de imágenes 0 al escritorio |
| Shift + Alt + 2 | Guarda el banco de imágenes 1 al escritorio |
| Shift + Alt + 3 | Guarda el banco de imágenes 2 al escritorio |
| Shift + Alt + 0 | Guarda la paleta de colores actual en el escritorio |
===== Distribuir una aplicación =====
==== Paquete Pyxel (pyxapp) ====
Pyxel dispone de un formato propio de distribución multiplataforma. Se crea de la siguiente manera:
pyxel package
Tanto los ficheros con el código como los recursos estarán contenidos en un único fichero.
El paquete creado se puede ejecutar con:
pyxel play
==== Ejecutable Windows ====
pyxel app2exe
Utiliza [[https://pyinstaller.org/en/stable/|PyInstaller]] para crear el ejecutable
==== Fichero HTML ====
pyxel app2html
El fichero ''.html'' resultante podremos abrirlo con cualquier navegador y el juego se ejecutará en él.
Pyxel utiliza [[https://pyodide.org/en/stable/|Pyodide]] para que código Python se pueda ejecutar en un navegador
===== Pyxel Editor: editor de recursos =====
Pyxel incluye un editor visual desde el que podremos crear recursos:
* Imágenes (sprites)
* Tilemap (mapas)
* Efectos de sonido
* Música
Para abrir este editor:
pyxel edit
Si no indicamos ningún nombre de fichero, se creará uno con el nombre ''my_resource.pyxres''.
==== Editor de imágenes ====
El editor tiene 3 bancos de imágenes (0, 1, 2) con lo que podremos guardar hasta 3 imágenes de 256x256.
También se puede arrastrar una imagen (PNG, GIF o JPEG) y se mostrará en un banco de imágenes del editor.
==== Editor de mapas ====
El editor de //tilemaps// nos permite hacer mosaicos que luego se utilizarán para crear mapas en el juego.
Podemos hacer mapas a partir de los elementos que hay en los bancos de imágenes.
Podemos tener hasta 7 mapas usando los 3 bancos de imágenes.
==== Editor de sonidos ====
Permite generar hasta 64 sonidos diferentes.
Los sonidos son MIDI y se pueden añadir efectos sobre los sonidos.
===== Colores =====
Por defecto, Pyxel soporta 16 colores que están representados por números enteros (del 0 al 15), pero también se pueden usar constantes definidas en este fichero: https://github.com/kitao/pyxel/blob/main/python/pyxel/__init__.pyi
Por ejemplo:
^ Color ^ Número ^ Uso con Pyxel ^
| Negro | 0 | ''pyxel.COLOR_BLACK'' |
| Blanco | 7 | ''pyxel.COLOR_WHITE'' |
===== Teclas =====
Se pueden consultar la definición de las teclas, entre otras cosas, en este fichero: https://github.com/kitao/pyxel/blob/main/python/pyxel/__init__.pyi
Por ejemplo:
^ Tecla ^ Uso con Pyxel ^
| A | ''KEY_A'' |
| Q | ''KEY_Q'' |
| → | ''KEY_RIGHT'' |
| ← | ''KEY_LEFT'' |
===== Controles / entrada =====
Desde Pyxel también se puede usar el ratón y mandos (hasta 4 mandos).
Se pueden consultar la definición de las teclas, entre otras cosas, en este fichero: https://github.com/kitao/pyxel/blob/main/python/pyxel/__init__.pyi
Por ejemplo:
^ Tecla ^ Uso con Pyxel ^
| Botón derecho del ratón | ''pyxel.MOUSE_BUTTON_RIGHT'' |
| Botón izquierdo del ratón | ''pyxel.MOUSE_BUTTON_LEFT'' |
| Botón A del primer mando | ''pyxel.GAMEPAD1_BUTTON_A'' |
| Arriba en el mando 2 | ''pyxel.GAMEPAD2_BUTTON_DPAD_UP'' |
===== Juegos de ejemplo =====
En el repositorio de Pyxel hay varios scripts con ejemplos de juegos que se pueden hacer con esta biblioteca:
* https://github.com/kitao/pyxel/tree/main/python/pyxel/examples
Se recomienda seguir el siguiente orden para aprender Pyxel: 01, 05, 03, 04, 02.
Otros ejemplos en esta wiki:
* [[informatica:programacion:python:pyxel:juego_tipo_pong|Pong clon]]
* [[informatica:programacion:python:pyxel:juego_tipo_breakout|Breakout clon]]
* [[informatica:programacion:python:pyxel:juego_tipo_endless_runner|Endless Runner clon]]
* [[informatica:programacion:python:pyxel:juego_tipo_snake|Snake clon]]
* [[informatica:programacion:python:pyxel:juego_tipo_space_invaders|Space Invaders clon]]
* [[informatica:programacion:python:pyxel:juego_tipo_tetris|Tetris clon]]
* [[informatica:programacion:python:pyxel:juego_tipo_flappy_bird|Flappy Bird clon]]
===== Recursos =====
* https://github.com/kitao/pyxel/wiki/Pyxel-User-Examples
* https://github.com/shivanju/pyxel-games
* https://github.com/gonzalocarreterohdz/Super-Mario-Bros-Game
* https://github.com/dascruz/mario-bros-revisited
* https://github.com/timbledum/snake
* https://github.com/nadi726/Rocket-Flight
* [[https://www.youtube.com/watch?v=Qg16VhEo2Qs|Python Retro Game Tutorial]] (vídeo)
* [[https://www.youtube.com/watch?v=8Glx88BVMLs|Create a Retro Game with Pyxel in Python (Breakout)]] (vídeo)
* [[https://www.youtube.com/watch?v=qcpLwnFNsxA|Taller de Pyxel | Gamejam]] (vídeo)
* [[https://www.youtube.com/watch?v=Z6-eGh3KJyA|Victor Suarez - Pyxel: Los 8 bits Retro Pythoneros]] (vídeo)
* [[https://www.youtube.com/watch?v=0g0L5iGKv9g|¡Crea fácilmente juegos retro con Pyxel! ¡Incluso los principiantes pueden hacer juegos en Python!]] (vídeo, audio en japonés, pero hay subtítulos en español)