[ English | 中文 | Deutsch | Español | Français | Italiano | 日本語 | 한국어 | Português | Русский | Türkçe | Українська ]
Pyxel è un motore di gioco retro per Python.
Le specifiche sono ispirate alle console di gioco retro, come il supporto di solo 16 colori e 4 canali audio, permettendoti di divertirti facilmente a creare giochi in stile pixel art.
Lo sviluppo di Pyxel è guidato dai feedback degli utenti. Ti preghiamo di dare una stella a Pyxel su GitHub!
Le specifiche e le API di Pyxel sono ispirate a PICO-8 e TIC-80.
Pyxel è open source sotto la Licenza MIT ed è gratuito da usare. Iniziamo a creare giochi retro con Pyxel!
- Funziona su Windows, Mac, Linux e Web
- Programmazione in Python
- Palette di 16 colori
- 3 banche di immagini di 256x256
- 8 mappe a tessere di 256x256
- 4 canali con 64 suoni definibili
- 8 tracce musicali che possono combinare qualsiasi suono
- Input da tastiera, mouse e gamepad
- Strumenti di editing per immagini e suoni
- Colori, canali e banche estensibili dall'utente
Dopo aver installato Python3 (versione 3.8 o superiore), esegui il seguente comando:
pip install -U pyxel
Quando installi Python usando l'installatore ufficiale, assicurati di selezionare l'opzione Add Python 3.x to PATH
per abilitare il comando pyxel
.
Dopo aver installato Homebrew, esegui i seguenti comandi:
brew install pipx
pipx ensurepath
pipx install pyxel
Per aggiornare Pyxel dopo l'installazione, esegui pipx upgrade pyxel
.
Dopo aver installato il pacchetto SDL2 (libsdl2-dev
per Ubuntu), Python3 (versione 3.8 o superiore) e python3-pip
, esegui il seguente comando:
sudo pip3 install -U pyxel
Se il comando precedente non funziona, considera di costruire Pyxel da sorgente seguendo le istruzioni nel Makefile.
La versione Web di Pyxel non richiede l'installazione di Python o Pyxel e funziona su PC, smartphone e tablet con browser web supportati.
Per istruzioni dettagliate, fai riferimento a questa pagina.
Dopo aver installato Pyxel, puoi copiare gli esempi nella directory corrente con il seguente comando:
pyxel copy_examples
I seguenti esempi saranno copiati nella tua directory corrente:
01_hello_pyxel.py | Applicazione più semplice | Demo | Codice |
02_jump_game.py | Gioco di salti con file di risorse Pyxel | Demo | Codice |
03_draw_api.py | Dimostrazione delle API di disegno | Demo | Codice |
04_sound_api.py | Dimostrazione delle API audio | Demo | Codice |
05_color_palette.py | Elenco delle palette di colori | Demo | Codice |
06_click_game.py | Gioco di clic del mouse | Demo | Codice |
07_snake.py | Gioco della serpente con BGM | Demo | Codice |
08_triangle_api.py | Dimostrazione delle API di disegno di triangoli | Demo | Codice |
09_shooter.py | Shoot 'em up con transizioni di schermo | Demo | Codice |
10_platformer.py | Gioco di piattaforma a scorrimento laterale con mappa | Demo | Codice |
11_offscreen.py | Rendering offscreen con la classe Image | Demo | Codice |
12_perlin_noise.py | Animazione di rumore di Perlin | Demo | Codice |
13_bitmap_font.py | Disegnare un font bitmap | Demo | Codice |
14_synthesizer.py | Sintetizzatore che utilizza funzionalità di espansione audio | Demo | Codice |
15_tiled_map_file.py | Caricamento e disegno di un Tiled Map File (.tmx) | Demo | Codice |
16_transform.py | Rotazione e ridimensionamento delle immagini | Demo | Codice |
99_flip_animation.py | Animazione con la funzione flip (solo per piattaforme non web) | Demo | Codice |
30sec_of_daylight.pyxapp | Gioco vincitore del 1° Pyxel Jam di Adam | Demo | Codice |
megaball.pyxapp | Gioco arcade di fisica della palla di Adam | Demo | Codice |
8bit-bgm-gen.pyxapp | Generatore di musica di sottofondo di frenchbread | Demo | Codice |
Gli esempi possono essere eseguiti con i seguenti comandi:
cd pyxel_examples
pyxel run 01_hello_pyxel.py
pyxel play 30sec_of_daylight.pyxapp
Nel tuo script Python, importa il modulo Pyxel, specifica le dimensioni della finestra con la funzione init
, e poi avvia l'applicazione Pyxel con la funzione 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)
Gli argomenti della funzione run
sono la funzione update
, che gestisce gli aggiornamenti dei fotogrammi, e la funzione draw
, che gestisce il disegno sullo schermo.
In un'applicazione reale, è consigliabile incapsulare il codice Pyxel in una classe, come mostrato di seguito:
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()
Per creare grafica semplice senza animazione, puoi utilizzare la funzione show
per semplificare il tuo codice.
import pyxel
pyxel.init(120, 120)
pyxel.cls(1)
pyxel.circb(60, 60, 40, 7)
pyxel.show()
Uno script creato può essere eseguito utilizzando il comando python
:
python PYTHON_SCRIPT_FILE
Può anche essere eseguito con il comando pyxel run
:
pyxel run PYTHON_SCRIPT_FILE
Inoltre, il comando pyxel watch
monitora le modifiche in una directory specificata e ri-esegue automaticamente il programma quando vengono rilevati cambiamenti:
pyxel watch WATCH_DIR PYTHON_SCRIPT_FILE
Il monitoraggio della directory può essere interrotto premendo Ctrl(Command)+C
.
Durante l'esecuzione di un'applicazione Pyxel, possono essere eseguite le seguenti operazioni delle chiavi speciali:
Esc
Uscire dall'applicazioneAlt(Option)+1
Salvare lo screenshot sul desktopAlt(Option)+2
Reimpostare il tempo di inizio della registrazione del video di cattura dello schermoAlt(Option)+3
Salvare un video di cattura dello schermo sul desktop (fino a 10 secondi)Alt(Option)+8
oppureA+B+X+Y+DL
sul gamepad
Cambiare la scala dello schermo tra massima e interaAlt(Option)+9
oppureA+B+X+Y+DR
sul gamepad
Passare tra le modalità dello schermo (Crisp/Smooth/Retro)Alt(Option)+0
oppureA+B+X+Y+DU
sul gamepad
Visualizzare il monitor delle prestazioni (FPS/update
tempo/draw
tempo)Alt(Option)+Enter
oppureA+B+X+Y+DD
sul gamepad
Visualizzare a schermo interoShift+Alt(Option)+1/2/3
Salvare la banca di immagini 0, 1 o 2 sul desktopShift+Alt(Option)+0
Salvare la palette di colori corrente sul desktop
Pyxel Editor può creare immagini e suoni utilizzati in un'applicazione Pyxel.
Puoi avviare Pyxel Editor con il seguente comando:
pyxel edit PYXEL_RESOURCE_FILE
Se il file di risorse Pyxel specificato (.pyxres) esiste, verrà caricato. Se non esiste, verrà creato un nuovo file con il nome specificato. Se il file di risorse viene omesso, verrà creato un nuovo file chiamato my_resource.pyxres
.
Dopo aver avviato Pyxel Editor, puoi passare a un altro file di risorse trascinandolo e rilasciandolo su Pyxel Editor.
Il file di risorse creato può essere caricato utilizzando la funzione load
.
Pyxel Editor ha i seguenti modi di editing.
Editor di Immagini
Il modo per modificare l'immagine in ciascuna banca di immagini.
Puoi trascinare e rilasciare un file immagine (PNG/GIF/JPEG) nell'editor di immagini per caricare l'immagine nella banca di immagini attualmente selezionata.
Editor di Mappe a Tessere
Il modo per modificare le mappe a tessere in cui le immagini delle banche di immagini sono disposte in un modello di piastrelle.
Trascina e rilascia un file TMX (Tiled Map File) sull'editor di mappe a tessere per caricare il suo strato nell'ordine di disegno corrispondente al numero di mappa a tessere attualmente selezionato.
Editor di Suoni
Il modo per modificare i suoni utilizzati per le melodie e gli effetti sonori.
Editor di Musica
Il modo per modificare le musiche in cui i suoni sono disposti in ordine di riproduzione.
Le immagini e le mappe a tessere di Pyxel possono anche essere create utilizzando i seguenti metodi:
- Crea un'immagine da un elenco di stringhe utilizzando la funzione
Image.set
o la funzioneTilemap.set
- Carica un file immagine (PNG/GIF/JPEG) nella palette Pyxel con la funzione
Image.load
I suoni Pyxel possono anche essere creati utilizzando il seguente metodo:
- Crea un suono da stringhe con la funzione
Sound.set
o la funzioneMusic.set
Fai riferimento alla documentazione dell'API per l'uso di queste funzioni.
Pyxel supporta un formato di file di distribuzione dell'applicazione dedicato (file dell'applicazione Pyxel) che è multipiattaforma.
Un file dell'applicazione Pyxel (.pyxapp) viene creato utilizzando il comando pyxel package
:
pyxel package APP_DIR STARTUP_SCRIPT_FILE
Se hai bisogno di includere risorse o moduli aggiuntivi, posizionali nella directory dell'applicazione.
I metadati possono essere visualizzati durante l'esecuzione specificandoli nel seguente formato all'interno dello script di avvio. I campi diversi da title
e author
sono facoltativi.
# title: Pyxel Platformer
# author: Takashi Kitao
# desc: A Pyxel platformer example
# site: https://github.com/kitao/pyxel
# license: MIT
# version: 1.0
Il file dell'applicazione creato può essere eseguito utilizzando il comando pyxel play
:
pyxel play PYXEL_APP_FILE
Un file dell'applicazione Pyxel può anche essere convertito in un eseguibile o in un file HTML utilizzando i comandi pyxel app2exe
o pyxel app2html
.
-
width
,height
La larghezza e l'altezza dello schermo -
frame_count
Il numero di frame trascorsi -
init(width, height, [title], [fps], [quit_key], [display_scale], [capture_scale], [capture_sec])
Inizializza l'applicazione Pyxel con la dimensione dello schermo (width
,height
). Le seguenti opzioni possono essere specificate: il titolo della finestra contitle
, il frame rate confps
, il tasto per chiudere l'applicazione conquit_key
, la scala di visualizzazione condisplay_scale
, la scala di acquisizione dello schermo concapture_scale
e il tempo massimo di registrazione del video di acquisizione dello schermo concapture_sec
.
Esempio:pyxel.init(160, 120, title="My Pyxel App", fps=60, quit_key=pyxel.KEY_NONE, capture_scale=3, capture_sec=0)
-
run(update, draw)
Avvia l'applicazione Pyxel e chiama la funzioneupdate
per l'aggiornamento del frame e la funzionedraw
per il disegno. -
show()
Mostra lo schermo e attende che venga premuto il tastoEsc
. -
flip()
Aggiorna lo schermo di un frame. L'applicazione si chiude quando viene premuto il tastoEsc
. Questa funzione non è disponibile nella versione web. -
quit()
Chiude l'applicazione Pyxel.
-
load(filename, [excl_images], [excl_tilemaps], [excl_sounds], [excl_musics])
Carica il file di risorse (.pyxres). Se un'opzione è impostata suTrue
, la risorsa corrispondente sarà esclusa dal caricamento. Se esiste un file di palette (.pyxpal) con lo stesso nome nella stessa posizione del file di risorse, anche i colori della palette verranno aggiornati. Il file di palette contiene voci esadecimali per i colori di visualizzazione (ad esempio1100FF
), separate da ritorni a capo. Il file di palette può essere utilizzato anche per modificare i colori visualizzati nell'editor Pyxel. -
user_data_dir(vendor_name, app_name)
Restituisce la directory dei dati utente creata in base avendor_name
eapp_name
. Se la directory non esiste, verrà creata automaticamente. Viene utilizzata per memorizzare punteggi alti, progressi del gioco e dati simili.
Esempio:print(pyxel.user_data_dir("Takashi Kitao", "Pyxel Shooter"))
-
mouse_x
,mouse_y
La posizione corrente del cursore del mouse -
mouse_wheel
Il valore corrente della rotella del mouse -
btn(key)
RestituisceTrue
se il tastokey
è premuto, altrimenti restituisceFalse
. (Elenco delle definizioni dei tasti) -
btnp(key, [hold], [repeat])
RestituisceTrue
se il tastokey
è premuto in quel frame, altrimenti restituisceFalse
. Se vengono specificatihold
erepeat
, dopo che il tastokey
è stato tenuto premuto perhold
frame o più,True
viene restituito ognirepeat
frame. -
btnr(key)
RestituisceTrue
se il tastokey
viene rilasciato in quel frame, altrimenti restituisceFalse
. -
mouse(visible)
Mostra il cursore del mouse sevisible
èTrue
e lo nasconde sevisible
èFalse
. La posizione del cursore continua ad aggiornarsi anche quando è nascosto.
-
colors
Elenco dei colori della palette. Il colore di visualizzazione è specificato da un valore numerico a 24 bit. Usacolors.from_list
ecolors.to_list
per assegnare e recuperare direttamente le liste Python.
Esempio:old_colors = pyxel.colors.to_list(); pyxel.colors.from_list([0x111111, 0x222222, 0x333333]); pyxel.colors[15] = 0x112233
-
images
Elenco delle banche di immagini (istanze della classe Image) (0-2)
Esempio:pyxel.images[0].load(0, 0, "title.png")
-
tilemaps
Elenco delle mappe a tessere (istanze della classe Tilemap) (0-7) -
clip(x, y, w, h)
Imposta l'area di disegno dello schermo da (x
,y
) con una larghezza diw
e un'altezza dih
. Chiamaclip()
per reimpostare l'area di disegno a tutto schermo. -
camera(x, y)
Cambia le coordinate dell'angolo in alto a sinistra dello schermo a (x
,y
). Chiamacamera()
per reimpostare le coordinate dell'angolo in alto a sinistra a (0
,0
). -
pal(col1, col2)
Sostituisce il colorecol1
concol2
durante il disegno. Chiamapal()
per reimpostare la palette iniziale. -
dither(alpha)
Applica un dithering (pseudo-trasparenza) durante il disegno. Impostaalpha
nell'intervallo0.0
-1.0
, dove0.0
è trasparente e1.0
è opaco. -
cls(col)
Pulisce lo schermo con il colorecol
. -
pget(x, y)
Ottiene il colore del pixel a (x
,y
). -
pset(x, y, col)
Disegna un pixel con il colorecol
a (x
,y
). -
line(x1, y1, x2, y2, col)
Disegna una linea di colorecol
da (x1
,y1
) a (x2
,y2
). -
rect(x, y, w, h, col)
Disegna un rettangolo di larghezzaw
, altezzah
e colorecol
da (x
,y
). -
rectb(x, y, w, h, col)
Disegna il contorno di un rettangolo di larghezzaw
, altezzah
e colorecol
da (x
,y
). -
circ(x, y, r, col)
Disegna un cerchio di raggior
e colorecol
a (x
,y
). -
circb(x, y, r, col)
Disegna il contorno di un cerchio di raggior
e colorecol
a (x
,y
). -
elli(x, y, w, h, col)
Disegna un'ellisse di larghezzaw
, altezzah
e colorecol
da (x
,y
). -
ellib(x, y, w, h, col)
Disegna il contorno di un'ellisse di larghezzaw
, altezzah
e colorecol
da (x
,y
). -
tri(x1, y1, x2, y2, x3, y3, col)
Disegna un triangolo con vertici (x1
,y1
), (x2
,y2
), (x3
,y3
) e colorecol
. -
trib(x1, y1, x2, y2, x3, y3, col)
Disegna il contorno di un triangolo con vertici (x1
,y1
), (x2
,y2
), (x3
,y3
) e colorecol
. -
fill(x, y, col)
Riempi l'area connessa con lo stesso colore di (x
,y
) con il colorecol
. -
blt(x, y, img, u, v, w, h, [colkey], [rotate], [scale])
Copia la regione di dimensioni (w
,h
) da (u
,v
) della banca immaginiimg
(0-2) a (x
,y
). Se viene assegnato un valore negativo aw
e/oh
, la regione verrà capovolta orizzontalmente e/o verticalmente. Secolkey
è specificato, verrà trattato come un colore trasparente. Se vengono specificatirotate
(in gradi),scale
(1.0 = 100%) o entrambi, verranno applicate le trasformazioni corrispondenti.
bltm(x, y, tm, u, v, w, h, [colkey], [rotate], [scale])
Copia la regione di dimensioni (w
,h
) da (u
,v
) della mappa a tesseretm
(0-7) a (x
,y
). Se viene assegnato un valore negativo aw
e/oh
, la regione verrà capovolta orizzontalmente e/o verticalmente. Secolkey
è specificato, verrà trattato come un colore trasparente. Se vengono specificatirotate
(in gradi),scale
(1.0 = 100%) o entrambi, verranno applicate le trasformazioni corrispondenti. La dimensione di una tessera è 8x8 pixel ed è memorizzata in una mappa a tessere come una tupla(image_tx, image_ty)
.
text(x, y, s, col)
Disegna una stringas
di colorecol
a (x
,y
).
-
sounds
Elenco dei suoni (istanze della classe Sound) (0-63)
Esempio:pyxel.sounds[0].speed = 60
-
musics
Elenco delle musiche (istanze della classe Music) (0-7) -
play(ch, snd, [tick], [loop], [resume])
Riproduce il suonosnd
(0-63) sul canalech
(0-3). Sesnd
è un elenco, i suoni verranno riprodotti in sequenza. La posizione di partenza può essere specificata datick
(1 tick = 1/120 secondi). Seloop
è impostato suTrue
, la riproduzione verrà eseguita in loop. Per riprendere il suono precedente dopo la fine della riproduzione, impostareresume
suTrue
. -
playm(msc, [tick], [loop])
Riproduce la musicamsc
(0-7). La posizione di partenza può essere specificata datick
(1 tick = 1/120 secondi). Seloop
è impostato suTrue
, la riproduzione verrà eseguita in loop. -
stop([ch])
Interrompe la riproduzione del canale specificatoch
(0-3). Chiamastop()
per interrompere tutti i canali. -
play_pos(ch)
Ottiene la posizione di riproduzione del suono sul canalech
(0-3) sotto forma di tupla(sound_no, note_no)
. RestituisceNone
quando la riproduzione è terminata.
-
ceil(x)
Restituisce il numero intero più piccolo che è maggiore o uguale ax
. -
floor(x)
Restituisce il numero intero più grande che è minore o uguale ax
. -
sgn(x)
Restituisce1
sex
è positivo,0
se è0
, e-1
se è negativo. -
sqrt(x)
Restituisce la radice quadrata dix
. -
sin(deg)
Restituisce il seno dideg
gradi. -
cos(deg)
Restituisce il coseno dideg
gradi. -
atan2(y, x)
Restituisce l'arcotangente diy
/x
in gradi. -
rseed(seed)
Imposta il seme del generatore di numeri casuali. -
rndi(a, b)
Restituisce un numero intero casuale maggiore o uguale aa
e minore o uguale ab
. -
rndf(a, b)
Restituisce un numero in virgola mobile casuale maggiore o uguale aa
e minore o uguale ab
. -
nseed(seed)
Imposta il seme del rumore Perlin. -
noise(x, [y], [z])
Restituisce il valore del rumore Perlin per le coordinate specificate.
-
width
,height
La larghezza e l'altezza dell'immagine -
set(x, y, data)
Imposta l'immagine a (x
,y
) utilizzando un elenco di stringhe.
Esempio:pyxel.images[0].set(10, 10, ["0123", "4567", "89ab", "cdef"])
-
load(x, y, filename)
Carica un file immagine (PNG/GIF/JPEG) a (x
,y
). -
pget(x, y)
Ottiene il colore del pixel a (x
,y
). -
pset(x, y, col)
Disegna un pixel con il colorecol
a (x
,y
).
-
width
,height
La larghezza e l'altezza della mappa a tessere -
imgsrc
La banca immagini (0-2) a cui fa riferimento la mappa a tessere -
set(x, y, data)
Imposta la mappa a tessere a (x
,y
) utilizzando un elenco di stringhe.
Esempio:pyxel.tilemap(0).set(0, 0, ["0000 0100 a0b0", "0001 0101 a1b1"])
-
load(x, y, filename, layer)
Carica il layer nell'ordine di disegnolayer
(0-) dal file TMX (Tiled Map File) a (x
,y
). -
pget(x, y)
Ottiene la tessera a (x
,y
). Una tessera è rappresentata come una tupla(image_tx, image_ty)
. -
pset(x, y, tile)
Disegna unatessera
a (x
,y
). Una tessera è rappresentata come una tupla(image_tx, image_ty)
.
-
notes
Elenco di note (0-127). Più alto è il numero, più acuto è il suono. La nota33
corrisponde a 'A2'(440Hz). Le note di silenzio sono rappresentate da-1
. -
tones
Elenco di toni (0:Triangle / 1:Square / 2:Pulse / 3:Noise) -
volumes
Elenco di volumi (0-7) -
effects
Elenco di effetti (0:None / 1:Slide / 2:Vibrato / 3:FadeOut / 4:Half-FadeOut / 5:Quarter-FadeOut) -
speed
Velocità di riproduzione.1
è la più veloce, e più alto è il numero, più lenta è la velocità di riproduzione. A120
, la durata di una nota diventa 1 secondo. -
set(notes, tones, volumes, effects, speed)
Imposta note, toni, volumi ed effetti utilizzando una stringa. Se la lunghezza di toni, volumi o effetti è inferiore alle note, verranno ripetuti dall'inizio. -
set_notes(notes)
Imposta le note utilizzando una stringa composta da 'CDEFGAB'+'#-'+'01234' o 'R'. Non fa distinzione tra maiuscole e minuscole, e gli spazi bianchi vengono ignorati.
Esempio:pyxel.sounds[0].set_notes("G2B-2D3R RF3F3F3")
-
set_tones(tones)
Imposta i toni con una stringa composta da 'TSPN'. Non fa distinzione tra maiuscole e minuscole, e gli spazi bianchi vengono ignorati.
Esempio:pyxel.sounds[0].set_tones("TTSS PPPN")
-
set_volumes(volumes)
Imposta i volumi con una stringa composta da '01234567'. Non fa distinzione tra maiuscole e minuscole, e gli spazi bianchi vengono ignorati.
Esempio:pyxel.sounds[0].set_volumes("7777 7531")
-
set_effects(effects)
Imposta gli effetti con una stringa composta da 'NSVFHQ'. Non fa distinzione tra maiuscole e minuscole, e gli spazi bianchi vengono ignorati.
Esempio:pyxel.sounds[0].set_effects("NFNF NVVS")
-
seqs
Un elenco bidimensionale di suoni (0-63) su più canali -
set(seq0, seq1, seq2, ...)
Imposta gli elenchi di suoni (0-63) per ciascun canale. Se viene specificato un elenco vuoto, quel canale non verrà utilizzato per la riproduzione.
Esempio:pyxel.musics[0].set([0, 1], [], [3])
Pyxel include un'"API Avanzata" che non è menzionata in questo documento, poiché potrebbe confondere gli utenti o richiedere conoscenze specialistiche per l'uso.
Se sei sicuro delle tue capacità, prova a creare opere straordinarie utilizzando questo come guida!
Utilizza il Issue Tracker per inviare rapporti di bug e richieste di funzionalità o miglioramenti. Prima di inviare un nuovo problema, assicurati che non ci siano problemi aperti simili.
Chiunque testi manualmente il codice e segnali bug o suggerimenti per miglioramenti nel Issue Tracker è molto benvenuto!
Le patch e le correzioni sono accettate sotto forma di richieste di pull (PR). Assicurati che il problema a cui si riferisce la richiesta di pull sia aperto nel Issue Tracker.
Inviare una richiesta di pull implica che accetti di concedere in licenza il tuo contributo sotto la Licenza MIT.
Pyxel è concesso in licenza sotto la Licenza MIT. Può essere riutilizzato in software proprietari, a condizione che tutte le copie del software o delle sue parti sostanziali includano una copia dei termini della Licenza MIT e un avviso di copyright.
Pyxel sta cercando sponsor su GitHub Sponsors. Ti preghiamo di considerare l'idea di sponsorizzare Pyxel per supportarne la manutenzione continua e lo sviluppo di nuove funzionalità. Come beneficio, gli sponsor possono consultare direttamente lo sviluppatore di Pyxel. Per ulteriori dettagli, visita questa pagina.