[ 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 має відкритий вихідний код і є безкоштовним у використанні. Почнемо створювати ретро-ігри за допомогою 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
Якщо вищевказане не допомогло, спробуйте самостійну збірку відповідно до інструкцій в Makefile.
Веб-версія Pyxel не вимагає інсталяції Python або Pyxel і працює на ПК, а також на смартфонах і планшетах із підтримуваними веб-браузерами.
Для отримання конкретних вказівок, будь ласка, зверніться до цієї сторінки.
Після інсталяції Pyxel, приклади Pyxel будуть скопійовані до поточного каталогу за допомогою наступної команди:
pyxel copy_examples
Перелік прикладів, які будуть скопійовані:
01_hello_pyxel.py | Найпростіша програма | Демо | Code |
02_jump_game.py | Гра в стрибки з файлом ресурсів Pyxel | Демо | Code |
03_draw_api.py | Демонстрація API для малювання | Demo | Code |
04_sound_api.py | Демонстрація API для роботи зі звуками | Demo | Code |
05_color_palette.py | Палітра кольорів | Demo | Code |
06_click_game.py | Гра клацання мишкою | Demo | Code |
07_snake.py | Гра «Змійка» з фоновою музикою | Demo | Code |
08_triangle_api.py | Демонстрація API по малюванню трикутників | Demo | Code |
09_shooter.py | Гра в жарні «Shoot 'em up» з переходом між екранами | Demo | Code |
10_platformer.py | Гра-платформер із бічною прокруткою та картою | Demo | Code |
11_offscreen.py | Позакадровий рендеринг за допомогою класу Image | Demo | Code |
12_perlin_noise.py | Анімація шуму Перліна | Demo | Code |
13_bitmap_font.py | Малювання растрового шрифту | Demo | Code |
14_synthesizer.py | Синтезатор, який використовує функції розширення аудіо | Demo | Code |
15_tiled_map_file.py | Завантаження та малювання файлу карти тайлів (.tmx) | Demo | Code |
16_transform.py | Обертання та масштабування зображення | Demo | Code |
99_flip_animation.py | Анімація з функцією flip (не для web-платформ) | Demo | Code |
30sec_of_daylight.pyxapp | Гра-переможець 1-го Pyxel Jam від Adam | Demo | Code |
megaball.pyxapp | Аркадна гра з фізикою м'яча від Adam | Demo | Code |
8bit-bgm-gen.pyxapp | Генератор фонової музики від frenchbread | Demo | Code |
Приклади можуть бути запущені за допомогою наступних команд:
cd pyxel_examples
pyxel run 01_hello_pyxel.py
pyxel play 30sec_of_daylight.pyxapp
Після імпортування модуля Pyxel у ваш скрипт Python спочатку вкажіть розмір вікна за допомогою функції 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 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)+9
Перемкнути режим екрану (чіткий/плавний/ретро)Alt(Option)+0
Перемкнути монітор продуктивності (кадрів в секунду, час на update, час на draw)Alt(Option)+Enter
Перемкнути повноекранний режимShift+Alt(Option)+1/2/3
Зберегти відповідне сховище зображень на робочий стілShift+Alt(Option)+0
Зберегти поточну палітру кольорів на робочий стіл
Вбудований редактор Pyxel може створювати зображення та звуки, які використовуються в програмі Pyxel.
Він запускається за допомогою наступної команди:
pyxel edit PYXEL_RESOURCE_FILE
Якщо вказаний файл ресурсів Pyxel (.pyxres) існує, файл завантажується, а якщо він не існує, створюється новий файл із зазначеною назвою. Якщо файл ресурсу пропущено, його назва буде my_resource.pyxres
.
Після запуску редактора Pyxel перемикання між файлами відбувається шляхом перетягування іншого файлу ресурсу.
Створений файл ресурсу можна завантажити за допомогою функції load
.
Вбудований редактор Pyxel має наступні режими редагування.
Редактор зображень
Режим редагування сховищ зображень.
Перетягніть файл зображення (PNG/GIF/JPEG) у редактор зображень, щоб завантажити зображення в поточне обране сховище зображень.
Редактор карт тайлів
Режим редагування карт тайлів, в якому зображення зі сховища зображень упорядковуються у вигляді тайлів.
Перетягніть файл TMX (файл карти тайлів) у редактор карти тайлів, щоб завантажити його шар у порядку малювання, який відповідає поточному вибраному номеру карти тайлів.
Редактор звуків
Режим редагування звуків.
Редактор музики
Режим редагування музичних композицій, у якому звуки впорядковуються в порядку відтворення.
Зображення 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 також можна перетворити на виконуваний файл EXE або файл 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
. Ця функція не працює у web-версії. -
quit()
Вийти із програми Pyxel.
load(filename, [excl_images], [excl_tilemaps], [excl_sounds], [excl_musics])
Завантажує файл ресурсів (.pyxres). Якщо параметр має значенняTrue
, ресурс не буде завантажено. Якщо файл палітри (.pyxpal) з такою ж назвою існує в тому самому місці, що й файл ресурсів, колір відображення палітри також буде змінено. Файл палітри — це шістнадцятковий запис кольорів відображення (наприклад,1100FF
), розділених символами нового рядка. Файл палітри також можна використовувати для зміни кольорів, які відображаються в редакторі Pyxel.
-
mouse_x
,mouse_y
Поточна позиція курсора миші. -
mouse_wheel
Поточне значення колеса миші. -
btn(key)
ПовертаєTrue
, якщо клавішаkey
натиснута, інакше повертаєFalse
. (Список визначень клавіш) -
btnp(key, [hold], [repeat])
ПовертаєTrue
, якщо в цьому кадрі натиснуто клавішуkey
, інакше повертаєFalse
. Якщо вказаноhold
іrepeat
, значенняTrue
буде повернено в інтервалі кадрівrepeat
, якщо клавішаkey
утримується натиснутою більше ніжhold
кадрів. -
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
Список сховищ зображень (0-2). (Див. клас Image)
напр.pyxel.images[0].load(0, 0, "title.png")
-
tilemaps
Список карт тайлів (0-7). (Див. клас Tilemap) -
clip(x, y, w, h)
Встановіть область малювання екрану від координат (x
,y
) до шириниw
і висотиh
. Скиньте область малювання на весь екран за допомогоюclip()
. -
camera(x, y)
Змінити координати верхнього лівого кута екрана на (x
,y
). Скиньте координати верхнього лівого кута на (0
,0
) за допомогоюcamera()
. -
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 пікселів, і він зберігається в карті тайлів як кортеж(tile_x, tile_y)
.
text(x, y, s, col)
Намалювати рядокs
кольоромcol
в координатах (x
,y
).
-
sounds
Список звуків (0-63). (Див. клас Image)
напр.pyxel.sounds[0].speed = 60
-
musics
Перелік музичних композицій (0-7). (Див. клас Music) -
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 (файл карти тайлів) в координатах (x
,y
). -
pget(x, y)
Отримати тайл з координат (x
,y
). Тайл — це кортеж(tile_x, tile_y)
. -
pset(x, y, tile)
Намалюватиtile
в координатах (x
,y
). Тайл — це кортеж(tile_x, tile_y)
.
-
notes
Список нот (0-127). Чим більше число, тим вище висота тону, і при 33 він стає 'A2'(440Hz). Решта становить -1. -
tones
Список тонів (0:Трикутник / 1:Квадрат / 2:Пульс / 3:Шум) -
volumes
Список гучностей (0-7) -
effects
Список ефектів (0:Немає / 1:Слайд / 2:Вібрато / 3:Згасання / 4:Напівзгасання / 5:Згасання на чверть) -
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", які не згадуються в цьому довіднику, оскільки вони «можуть заплутати користувачів» або «вимагають спеціальних знань для використання».
Якщо ви в своїх навичках, спробуйте створити дивовижні роботи, використовуючи це як підказку!
Використовуйте систему відстеження проблем, щоб надсилати звіти про помилки та запити щодо функцій/розширень. Перш ніж надсилати нову проблему, переконайтеся, що немає аналогічної відкритої проблеми.
Щиро дякую всім, хто вручну тестує код і повідомляє про помилки чи пропозиції щодо покращення в системі відстеження проблем!
Патчі/виправлення приймаються у формі pull-запитів на злиття. Переконайтеся, що проблема, яка стосується pull-запиту на злиття, відкрита в системі відстеження проблем.
Надісланий pull-запит вважатиметься опублікованим під ліцензією MIT License.
Pyxel знаходиться під ліцензією MIT License. Pyxel можна використовувати у власному програмному забезпеченні за умови, що всі копії програмного забезпечення або його значні частини містять копію умов ліцензії MIT License, а також повідомлення про авторські права.
Pyxel шукає спонсорів на GitHub Sponsors. Розгляньте можливість спонсорування Pyxel для подальшого обслуговування та додавання функцій. Спонсорам доступна можливість консультації щодо Pyxel. Будь ласка, перегляньте деталі тут.