[ English | 中文 | Deutsch | Español | Français | Italiano | 日本語 | 한국어 | Português | Русский | Türkçe | Українська ]
Pyxel — це ретро-ігровий движок для Python.
Специфікації натхнені ретро-ігровими консолями, такими як підтримка лише 16 кольорів та 4 звукових канали, що дозволяє легко насолоджуватися створенням ігор у стилі піксельної графіки.
Розробка Pyxel здійснюється на основі відгуків користувачів. Будь ласка, поставте Pyxel зірку на GitHub!
Специфікації та API Pyxel були натхненні PICO-8 та TIC-80.
Pyxel є відкритим програмним забезпеченням під ліцензією MIT та безкоштовний для використання. Давайте почнемо створювати ретро-ігри з Pyxel!
- Працює на Windows, Mac, Linux та Web
- Програмування на Python
- 16-кольорова палітра
- 3 банки зображень розміром 256x256
- 8 тайлових карт розміром 256x256
- 4 канали з 64 налаштовуваними звуками
- 8 музичних треків, які можуть поєднувати будь-які звуки
- Введення з клавіатури, миші та ігрового контролера
- Інструменти для редагування зображень та звуків
- Розширювані користувачем кольори, канали та банки
Після встановлення Python3 (версія 3.8 або вища) виконайте наступну команду:
pip install -U pyxel
При установці Python за допомогою офіційного установника, переконайтеся, що ви вибрали опцію Add Python 3.x to PATH
, щоб активувати команду pyxel
.
Після встановлення Homebrew виконайте наступні команди:
brew install pipx
pipx ensurepath
pipx install pyxel
Щоб оновити Pyxel після установки, виконайте pipx upgrade pyxel
.
Після установки пакета SDL2 (libsdl2-dev
для Ubuntu), Python3 (версія 3.8 або вища) та python3-pip
, виконайте наступну команду:
sudo pip3 install -U pyxel
Якщо попередня команда не спрацювала, подумайте про збірку Pyxel з виходу, дотримуючись інструкцій у Makefile.
Веб-версія Pyxel не вимагає установки Python або Pyxel і працює на ПК, смартфонах і планшетах з підтримуваними веб-браузерами.
Для детальних інструкцій зверніться до цієї сторінки.
Після установки Pyxel ви можете скопіювати приклади в поточний каталог за допомогою наступної команди:
pyxel copy_examples
Наступні приклади будуть скопійовані у ваш поточний каталог:
01_hello_pyxel.py | Найпростіший додаток | Демонстрація | Код |
02_jump_game.py | Гра зі стрибками з використанням файлу ресурсів Pyxel | Демонстрація | Код |
03_draw_api.py | Демонстрація API для малювання | Демонстрація | Код |
04_sound_api.py | Демонстрація API для звуку | Демонстрація | Код |
05_color_palette.py | Список кольорових паліт | Демонстрація | Код |
06_click_game.py | Гра на клік миші | Демонстрація | Код |
07_snake.py | Гра «Змійка» з BGM | Демонстрація | Код |
08_triangle_api.py | Демонстрація API для малювання трикутників | Демонстрація | Код |
09_shooter.py | Shoot 'em up з переходами між екранами | Демонстрація | Код |
10_platformer.py | Горизонтальна платформна гра з картою | Демонстрація | Код |
11_offscreen.py | Відображення поза екраном з класом Image | Демонстрація | Код |
12_perlin_noise.py | Анімація Перлін-шуму | Демонстрація | Код |
13_bitmap_font.py | Малювання бітмап-шрифта | Демонстрація | Код |
14_synthesizer.py | Синтезатор з використанням функцій розширення звуку | Демонстрація | Код |
15_tiled_map_file.py | Завантаження та малювання Tiled Map File (.tmx) | Демонстрація | Код |
16_transform.py | Обертання та масштабування зображень | Демонстрація | Код |
99_flip_animation.py | Анімація за допомогою функції flip (тільки для платформ, що не є веб) | Демонстрація | Код |
30sec_of_daylight.pyxapp | Ігра-переможець 1-го Pyxel Jam від Adam | Демонстрація | Код |
megaball.pyxapp | Аркадна гра з фізикою м'ячів від Adam | Демонстрація | Код |
8bit-bgm-gen.pyxapp | Генератор фонової музики від frenchbread | Демонстрація | Код |
Приклади можна виконати за допомогою наступних команд:
cd pyxel_examples
pyxel run 01_hello_pyxel.py
pyxel play 30sec_of_daylight.pyxapp
У вашому Python-скрипті імпортуйте модуль Pyxel, вкажіть розмір вікна за допомогою функції init
, а потім запустіть програму Pyxel за допомогою функції 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)
Аргументи функції run
— це функція update
, яка обробляє оновлення кадрів, та функція draw
, яка відповідає за малювання на екрані.
У реальному застосуванні рекомендується обернути код Pyxel в клас, як показано нижче:
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()
Для створення простих графіків без анімації ви можете використовувати функцію show
, щоб спростити ваш код.
import pyxel
pyxel.init(120, 120)
pyxel.cls(1)
pyxel.circb(60, 60, 40, 7)
pyxel.show()
Створений скрипт можна виконати за допомогою команди python
:
python PYTHON_SCRIPT_FILE
Його також можна запустити за допомогою команди pyxel run
:
pyxel run PYTHON_SCRIPT_FILE
Крім того, команда pyxel watch
відстежує зміни в зазначеній директорії та автоматично перезапускає програму при виявленні змін:
pyxel watch WATCH_DIR PYTHON_SCRIPT_FILE
Спостереження за директорією можна зупинити, натиснувши Ctrl(Command)+C
.
Під час виконання програми Pyxel можна виконати наступні спеціальні дії з клавішами:
Esc
Вийти з програмиAlt(Option)+1
Зберегти знімок екрану на робочий стілAlt(Option)+2
Скинути час початку запису відео з екрануAlt(Option)+3
Зберегти відео захоплення екрану на робочий стіл (до 10 секунд)Alt(Option)+8
абоA+B+X+Y+DL
на геймпаді
Перемикати масштаб екрану між максимальним та цілимAlt(Option)+9
абоA+B+X+Y+DR
на геймпаді
Перемикати режими екрану (Crisp/Smooth/Retro)Alt(Option)+0
абоA+B+X+Y+DU
на геймпаді
Перемикати монітор продуктивності (FPS/часupdate
/часdraw
)Alt(Option)+Enter
абоA+B+X+Y+DD
на геймпаді
Перемикати повноекранний режимShift+Alt(Option)+1/2/3
Зберегти банк зображень 0, 1 або 2 на робочий стілShift+Alt(Option)+0
Зберегти поточну кольорову палітру на робочий стіл
Pyxel Editor може створювати зображення та звуки, що використовуються в програмі Pyxel.
Ви можете запустити Pyxel Editor за допомогою наступної команди:
pyxel edit PYXEL_RESOURCE_FILE
Якщо зазначений файл ресурсу Pyxel (.pyxres) існує, він буде завантажений. Якщо ні, то буде створено новий файл з вказаним ім'ям. Якщо файл ресурсу пропущено, буде створено новий файл з назвою my_resource.pyxres
.
Після запуску Pyxel Editor ви можете перемикатися на інший файл ресурсу, перетягуючи його на Pyxel Editor.
Створений файл ресурсу можна завантажити за допомогою функції load
.
Pyxel Editor має такі режими редагування.
Редактор зображень
Режим для редагування зображення в кожному банку зображень.
Ви можете перетягувати файл зображення (PNG/GIF/JPEG) у редактор зображень, щоб завантажити зображення в поточний вибраний банк зображень.
Редактор тайлових карт
Режим для редагування карти плиток, де зображення з банків зображень розташовані в плитковому шаблоні.
Перетягніть файл TMX (Tiled Map File) на редактор карт плиток, щоб завантажити його шар у порядку малювання, що відповідає поточному вибраному номеру карти плиток.
Редактор звуку
Режим для редагування звуків, що використовуються для мелодій і звукових ефектів。
Редактор музики
Режим для редагування музик, в яких звуки розташовані в порядку відтворення.
Зображення та тайлових карт Pyxel також можна створювати за допомогою таких методів:
- Створіть зображення з списку рядків за допомогою функції
Image.set
абоTilemap.set
- Завантажте файл зображення (PNG/GIF/JPEG) з палітрою Pyxel за допомогою функції
Image.load
Звуки Pyxel також можна створити за допомогою наступного методу:
- Створіть звук з рядків за допомогою функції
Sound.set
абоMusic.set
Зверніться до документації API для використання цих функцій.
Pyxel підтримує спеціальний формат файлу для розподілу програм (файл програми Pyxel), який є кросплатформеним.
Файл програми Pyxel (.pyxapp) створюється за допомогою команди pyxel package
:
pyxel package APP_DIR STARTUP_SCRIPT_FILE
Якщо потрібно включити ресурси або додаткові модулі, розмістіть їх у каталозі програми.
Метадані можна відображати під час виконання, вказуючи їх у наступному форматі в скрипті запуску. Поля, крім title
і author
, є необов'язковими.
# title: Pyxel Platformer
# author: Takashi Kitao
# desc: A Pyxel platformer example
# site: https://github.com/kitao/pyxel
# license: MIT
# version: 1.0
Створений файл програми можна запустити за допомогою команди pyxel play
:
pyxel play PYXEL_APP_FILE
Файл програми Pyxel також можна конвертувати в виконуваний файл або HTML-файл за допомогою команд pyxel app2exe
або pyxel app2html
.
-
width
,height
Ширина та висота екрану -
frame_count
Кількість пройдених кадрів -
init(width, height, [title], [fps], [quit_key], [display_scale], [capture_scale], [capture_sec])
Ініціалізує Pyxel-додаток з розміром екрану (width
,height
). Можна вказати такі параметри: заголовок вікна черезtitle
, частоту кадрів черезfps
, клавішу для завершення програми черезquit_key
, масштаб відображення черезdisplay_scale
, масштаб захоплення екрану черезcapture_scale
та максимальний час запису відео черезcapture_sec
.
Приклад:pyxel.init(160, 120, title="My Pyxel App", fps=60, quit_key=pyxel.KEY_NONE, capture_scale=3, capture_sec=0)
-
run(update, draw)
Запускає Pyxel-додаток і викликає функціюupdate
для оновлення кадрів та функціюdraw
для малювання. -
show()
Відображає екран та очікує на натискання клавішіEsc
. -
flip()
Оновлює екран на один кадр. Програма завершується при натисканні клавішіEsc
. Ця функція недоступна у веб-версії. -
quit()
Завершує Pyxel-додаток.
-
load(filename, [excl_images], [excl_tilemaps], [excl_sounds], [excl_musics])
Завантажує файл ресурсу (.pyxres). Якщо для параметра вказаноTrue
, відповідний ресурс буде виключено з завантаження. Якщо файл палітри (.pyxpal) з таким самим іменем знаходиться у тому самому місці, що й файл ресурсу, кольори відображення палітри також будуть оновлені. Файл палітри містить кольори у шістнадцятковому форматі (наприклад,1100FF
), розділені новими рядками. Файл палітри також можна використовувати для зміни кольорів у редакторі Pyxel. -
user_data_dir(vendor_name, app_name)
Повертає каталог користувацьких даних, створений на основіvendor_name
іapp_name
. Якщо каталог не існує, він буде створений автоматично. Використовується для збереження результатів, прогресу в грі та подібних даних.
Приклад:print(pyxel.user_data_dir("Takashi Kitao", "Pyxel Shooter"))
-
mouse_x
,mouse_y
Поточна позиція курсору миші -
mouse_wheel
Поточне значення колеса миші -
btn(key)
ПовертаєTrue
, якщо клавішуkey
натиснуто, інакше повертаєFalse
. (Список визначень клавіш) -
btnp(key, [hold], [repeat])
ПовертаєTrue
, якщо клавішуkey
було натиснуто в цьому кадрі, інакше повертаєFalse
. Якщо вказаноhold
таrepeat
, після того, як клавішуkey
було натиснуто протягом більше ніжhold
кадрів,True
буде повертатися кожніrepeat
кадрів. -
btnr(key)
ПовертаєTrue
, якщо клавішуkey
було відпущено в цьому кадрі, інакше повертаєFalse
. -
mouse(visible)
Показує курсор миші, якщо параметрvisible
встановлено уTrue
, та приховує, якщо уFalse
. Позиція курсору продовжує оновлюватися, навіть якщо він прихований.
-
colors
Список кольорів палітри. Кольори відображення вказуються у 24-бітному числовому значенні. Використовуйтеcolors.from_list
таcolors.to_list
для безпосереднього присвоєння та отримання списків у Python.
Приклад:old_colors = pyxel.colors.to_list(); pyxel.colors.from_list([0x111111, 0x222222, 0x333333]); pyxel.colors[15] = 0x112233
-
images
Список банків зображень (екземпляри класу Image) (0-2)
Приклад:pyxel.images[0].load(0, 0, "title.png")
-
tilemaps
Список тайлмапів (екземпляри класу Tilemap) (0-7) Список тайлмапів (0-7) -
clip(x, y, w, h)
Встановлює область малювання на екрані від (x
,y
) з шириноюw
та висотоюh
. Викличтеclip()
, щоб скинути область малювання на весь екран. -
camera(x, y)
Змінює координати верхнього лівого кута екрана на (x
,y
). Викличтеcamera()
, щоб скинути координати верхнього лівого кута на (0
,0
). -
pal(col1, col2)
Заміщує колірcol1
наcol2
при малюванні. Викличтеpal()
, щоб скинути палітру на початкову. -
dither(alpha)
Застосовує дезеринг (імітацію прозорості) при малюванні. Встановітьalpha
у діапазоні від0.0
до1.0
, де0.0
є прозорим, а1.0
— непрозорим. -
cls(col)
Очищає екран кольоромcol
. -
pget(x, y)
Повертає колір пікселя на позиції (x
,y
). -
pset(x, y, col)
Малює піксель кольоруcol
на позиції (x
,y
). -
line(x1, y1, x2, y2, col)
Малює лінію кольоруcol
від точки (x1
,y1
) до точки (x2
,y2
). -
rect(x, y, w, h, col)
Малює прямокутник шириноюw
, висотоюh
і кольоромcol
від позиції (x
,y
). -
rectb(x, y, w, h, col)
Малює контур прямокутника шириноюw
, висотоюh
і кольоромcol
від позиції (x
,y
). -
circ(x, y, r, col)
Малює коло радіусомr
і кольоромcol
на позиції (x
,y
). -
circb(x, y, r, col)
Малює контур кола радіусомr
і кольоромcol
на позиції (x
,y
). -
elli(x, y, w, h, col)
Малює еліпс шириноюw
, висотоюh
і кольоромcol
від позиції (x
,y
). -
ellib(x, y, w, h, col)
Малює контур еліпса шириноюw
, висотоюh
і кольоромcol
від позиції (x
,y
). -
tri(x1, y1, x2, y2, x3, y3, col)
Малює трикутник із вершинами в точках (x1
,y1
), (x2
,y2
), (x3
,y3
) і кольоромcol
. -
trib(x1, y1, x2, y2, x3, y3, col)
Малює контур трикутника із вершинами в точках (x1
,y1
), (x2
,y2
), (x3
,y3
) і кольоромcol
. -
fill(x, y, col)
Заповнює область, яка має той самий колір, що й позиція (x
,y
), кольоромcol
. -
blt(x, y, img, u, v, w, h, [colkey], [rotate], [scale])
Копіює область розміром (w
,h
) із позиції (u
,v
) банку зображеньimg
(0-2) у позицію (x
,y
). Якщо негативне значення присвоєно дляw
та/абоh
, область буде віддзеркалена по горизонталі та/або вертикалі. Якщо вказаноcolkey
, цей колір буде трактуватися як прозорий. Якщо вказаноrotate
(у градусах),scale
(1.0 = 100%) або обидва параметри, будуть застосовані відповідні трансформації.
bltm(x, y, tm, u, v, w, h, [colkey], [rotate], [scale])
Копіює область розміром (w
,h
) із позиції (u
,v
) тайлмапуtm
(0-7) у позицію (x
,y
). Якщо негативне значення присвоєно дляw
та/абоh
, область буде віддзеркалена по горизонталі та/або вертикалі. Якщо вказаноcolkey
, цей колір буде трактуватися як прозорий. Якщо вказаноrotate
(у градусах),scale
(1.0 = 100%) або обидва параметри, будуть застосовані відповідні трансформації. Розмір одного тайла становить 8x8 пікселів, і він зберігається в тайлмапі у вигляді кортежу(image_tx, image_ty)
.
text(x, y, s, col)
Малює рядокs
кольоромcol
на позиції (x
,y
).
-
sounds
Список звуків (екземпляри класу Sound) (0-63)
Приклад:pyxel.sounds[0].speed = 60
-
musics
Список музик (екземпляри класу Music) (0-7) -
play(ch, snd, [tick], [loop], [resume])
Програє звукsnd
(0-63) на каналіch
(0-3). Якщоsnd
є списком, звуки програватимуться послідовно. Початкову позицію відтворення можна вказати за допомогою параметраtick
(1 tick = 1/120 секунди). Якщо параметрloop
встановлено в значенняTrue
, звук програватиметься у циклі. Щоб відновити попередній звук після завершення відтворення, встановіть параметрresume
у значенняTrue
. -
playm(msc, [tick], [loop])
Програє музичну композиціюmsc
(0-7). Початкову позицію відтворення можна вказати за допомогою параметраtick
(1 tick = 1/120 секунди). Якщо параметрloop
встановлено в значенняTrue
, музика програватиметься у циклі. -
stop([ch])
Зупиняє відтворення на вказаному каналіch
(0-3). Викликstop()
зупиняє відтворення на всіх каналах. -
play_pos(ch)
Повертає позицію відтворення звуку на каналіch
(0-3) у вигляді кортежу(sound_no, note_no)
. ПовертаєNone
, коли відтворення зупинено.
-
ceil(x)
Повертає найменше ціле число, більше або рівнеx
. -
floor(x)
Повертає найбільше ціле число, менше або рівнеx
. -
sgn(x)
Повертає1
, якщоx
додатний,0
, якщо він дорівнює нулю, і-1
, якщо від'ємний. -
sqrt(x)
Повертає квадратний корінь зx
. -
sin(deg)
Повертає синус кутаdeg
у градусах. -
cos(deg)
Повертає косинус кутаdeg
у градусах. -
atan2(y, x)
Повертає арктангенс відношенняy
доx
у градусах. -
rseed(seed)
Встановлює насіння генератора випадкових чисел. -
rndi(a, b)
Повертає випадкове ціле число відa
доb
включно. -
rndf(a, b)
Повертає випадкове дійсне число відa
доb
включно. -
nseed(seed)
Встановлює насіння для шуму Перліна. -
noise(x, [y], [z])
Повертає значення шуму Перліна для заданих координат.
-
width
,height
Ширина та висота зображення -
set(x, y, data)
Встановлює зображення на позиції (x
,y
), використовуючи список рядків.
Приклад:pyxel.images[0].set(10, 10, ["0123", "4567", "89ab", "cdef"])
-
load(x, y, filename)
Завантажує файл зображення (PNG/GIF/JPEG) на позицію (x
,y
). -
pget(x, y)
Повертає колір пікселя на позиції (x
,y
). -
pset(x, y, col)
Малює піксель кольоруcol
на позиції (x
,y
).
-
width
,height
Ширина та висота тайлмапу -
imgsrc
Банк зображень (0-2), на який посилається тайлмап -
set(x, y, data)
Встановлює тайлмап на позиції (x
,y
), використовуючи список рядків.
Приклад:pyxel.tilemap(0).set(0, 0, ["0000 0100 a0b0", "0001 0101 a1b1"])
-
load(x, y, filename, layer)
Завантажує шар у порядку малюванняlayer
(0-) з файлу TMX (Tiled Map File) на позицію (x
,y
). -
pget(x, y)
Повертає тайл на позиції (x
,y
). Тайл представлений у вигляді кортежу(image_tx, image_ty)
. -
pset(x, y, tile)
Малюєtile
на позиції (x
,y
). Тайл представлений у вигляді кортежу(image_tx, image_ty)
.
-
notes
Список нот (0-127). Чим більше число, тим вища нота. Нота33
відповідає 'A2' (440Hz). Пауза позначається як-1
. -
tones
Список тонів (0:Triangle / 1:Square / 2:Pulse / 3:Noise) -
volumes
Список гучностей (0-7) -
effects
Список ефектів (0:None / 1:Slide / 2:Vibrato / 3:FadeOut / 4:Half-FadeOut / 5:Quarter-FadeOut) -
speed
Швидкість відтворення.1
— найшвидша швидкість, чим більше число, тим повільніше відтворення. При120
тривалість однієї ноти становить 1 секунду. -
set(notes, tones, volumes, effects, speed)
Встановлює ноти, тони, гучності та ефекти за допомогою рядка. Якщо довжина тонів, гучностей або ефектів коротша за ноти, вони будуть повторюватися з початку. -
set_notes(notes)
Встановлює ноти за допомогою рядка, що складається з 'CDEFGAB'+'#-'+'01234' або 'R'. Регістр не має значення, пробіли ігноруються.
Приклад:pyxel.sounds[0].set_notes("G2B-2D3R RF3F3F3")
-
set_tones(tones)
Встановлює тони за допомогою рядка, що складається з 'TSPN'. Регістр не має значення, пробіли ігноруються.
Приклад:pyxel.sounds[0].set_tones("TTSS PPPN")
-
set_volumes(volumes)
Встановлює гучності за допомогою рядка, що складається з '01234567'. Регістр не має значення, пробіли ігноруються.
Приклад:pyxel.sounds[0].set_volumes("7777 7531")
-
set_effects(effects)
Встановлює ефекти за допомогою рядка, що складається з 'NSVFHQ'. Регістр не має значення, пробіли ігноруються.
Приклад:pyxel.sounds[0].set_effects("NFNF NVVS")
-
seqs
Двовимірний список звуків (0-63) по кількох каналах -
set(seq0, seq1, seq2, ...)
Встановлює списки звуків (0-63) для кожного каналу. Якщо вказано порожній список, цей канал не використовуватиметься для відтворення.
Приклад:pyxel.musics[0].set([0, 1], [], [3])
Pyxel включає "Розширене API", яке не згадується в цьому довіднику, оскільки воно може заплутати користувачів або вимагати спеціальних знань для використання.
Якщо ви впевнені у своїх силах, спробуйте створити дивовижні роботи, використовуючи цей посібник!
Використовуйте Трекер проблем для подання звітів про помилки та запитів на функції або покращення. Перед поданням нової проблеми переконайтеся, що немає подібних відкритих проблем.
Будь-хто, хто тестує код вручну та повідомляє про помилки або пропозиції щодо покращення в Трекері проблем, дуже вітається!
Патчі та виправлення приймаються у вигляді запитів на витягування (PR). Переконайтеся, що проблема, яку вирішує запит на витягування, відкрита в Трекері проблем.
Подання запиту на витягування означає, що ви погоджуєтеся ліцензувати свій внесок відповідно до ліцензії MIT.
Pyxel ліцензовано під ліцензією MIT. Його можна використовувати в власному програмному забезпеченні, за умови, що всі копії програмного забезпечення або його істотні частини містять копію умов ліцензії MIT та повідомлення про авторські права.
Pyxel шукає спонсорів на GitHub Sponsors. Розгляньте можливість спонсорування Pyxel, щоб підтримати його подальше обслуговування та розвиток функцій. Як перевага, спонсори можуть безпосередньо консультуватися з розробником Pyxel. Для отримання додаткової інформації відвідайте цю сторінку.