[ 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 и в браузере
- Программирование на 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 | Простейшее приложение | Demo | Code |
02_jump_game.py | Игра прыжков с простейшими ресурсными файлами Pyxel | Demo | 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 | Змейка с BGM | Demo | Code |
08_triangle_api.py | Демонстрация API по рисованию треугольных полигонов | Demo | Code |
09_shooter.py | Игра жанра «убей всех» с переходом между экранами | 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 (только для не-веб-платформ) | Demo | Code |
30sec_of_daylight.pyxapp | Первая победная игра 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
В вашем 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 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
Переключение между режимами экрана (Crisp/Smooth/Retro)Alt(Option)+0
Включить/выключить мониториг производительности (fps, время на update, время на draw)Alt(Option)+Enter
Переключение полноэкранного режимаShift+Alt(Option)+1/2/3
Сохраните соответствующий банк изображений на рабочем столеShift+Alt(Option)+0
Сохраните текущую палитру цветов на рабочем столе
Pyxel Editor может создавать изображения и звуки, используемые в Pyxel-приложении.
Он запускается следующей командой:
pyxel edit PYXEL_RESOURCE_FILE
Если указанный ресурсный файл (.pyxres) существует, то он будет загружен. В противном случае будет создан файл с указанным именем. Если имя файла пропущено, то используется стандартное имя my_resource.pyxres
После запуска 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 Editor.
-
mouse_x
,mouse_y
Получить положение курсора мышки -
mouse_wheel
Получить значение колесика мышки -
btn(клавиша)
ПолучитьTrue
, есликлавиша
нажата, в противном случае получитьFalse
. (Список определений клавиш) -
btnp(клавиша, [hold], [repeat])
ПолучитьTrue
, есликлавиша
нажата в данный кадр, в противном случае вернутьFalse
. Если указаны параметрыhold
иrepeat
,True
будет возвращаться через каждыеrepeat
кадров, если клавиша удерживается более чемhold
кадров. -
btnr(клавиша)
ВернутьTrue
, есликлавиша
была отпущена в данный кадр, в противном случае вернутьFalse
. -
mouse(видна)
Установить видимость курсора: если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
по координатам (x
,y
). -
rectb(x, y, w, h, col)
Нарисовать контур прямоугольника ширины, высотыw
и цветаh
по координатам (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)
Нарисуйте эллипс ширинойw
, высотойh
и цветомcol
из (x
,y
). -
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])
Нарисовать из тайлмапаtm
(0-7) по координатам (x
,y
) тайл размером (w
,h
), находящийся по координатам (u
,v
). Если переданы отрицательные значенияw
и/илиh
, то изображение будет отражено по горизонтали и/или вертикали. Если указан параметрcolkey
, соответствующий цвет будет считаться цветом фона (прозрачным цветом). Если указаныrotate
(в градусах),scale
(1.0=100%) или оба значения, то будет применено соответствующее преобразование. Размер тайла равен 8x8 точек и хранится в карте тайлов в виде кортежа(tile_x, tile_y)
.
text(x, y, s, col)
Нарисовать строку текстаs
цветаcol
по координате (x
,y
).
-
sounds
Оперировать звукомsnd
(0-63). (См. класс "Звук")
Пример:pyxel.sounds[0].speed = 60
-
musics
Список музыкальных произведений (0-7). (См. класс Music) -
play(ch, snd, [tick], [loop], [resume])
Проигрывать звукsnd
(0-63) на каналеch
(0-3). Еслиsnd
— список, звуки будут воспроизведены по порядку. Позиция начала воспроизведения может быть указана с помощьюtick
(1 тик = 1/120 секунды). Если в качестве значенияloop
переданоTrue
, проигрывание будет зациклено. Чтобы возобновить предыдущий звук после завершения воспроизведения, установитеresume
вTrue
. -
playm(msc, [tick], [loop])
Проигрывает музыкуmsc
(0-7). Позиция начала воспроизведения может быть указана с помощьюtick
(1 тик = 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
, если оно равно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
). Возвращаемое значение представляет собой кортеж(tile_x, tile_y)
. -
pset(x, y, tile)
Задать тайл в координатах (x
,y
). Тайл передаётся в виде кортежа(tile_x, tile_y)
.
-
notes
Список нот (0-127). Чем больше значение, тем выше нота. Значение33
соответствует ноте «ля» второй октавы 'A2' (440Hz). Паузы обозначаются значением-1
. -
tones
Список тонов (0:Треугольник / 1:Квадрат / 2:Пульс / 3:Шум) -
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", который не упоминается в этом руководстве, так как он может запутать пользователей или требует специализированных знаний для использования.
Если вы уверены в своих силах, попробуйте создать удивительные работы, используя это в качестве подсказки!
Используйте трекер проблем для отправки отчётов о проблемах или предложений по улучшению/добавлению новых возможностей. Перед созданием новой задачи убедитесь, что схожие открытые задачи отсутствуют.
Ручное тестирование кода и написание отчетов о проблемах, предложений по улучшению в трекере проблем приветствуется!
Патчи и исправления принимаются в форме запросов на слияние (pull-запрос, PR). Убедитесь, что проблема, к которой относится запрос на слияние, открыта в трекере проблем.
Отправленный pull request считается согласием на публикацию по лицензии MIT
Pyxel распространяется под лицензией MIT. Его можно использовать в проприетарном программном обеспечении при условии, что все копии программного обеспечения или его значительные части включают копию условий лицензии MIT и уведомление об авторских правах.
Pyxel ищет спонсоров на GitHub Sponsors. Рассмотрите возможность спонсирования Pyxel для поддержки его дальнейшего обслуживания и разработки новых функций. Спонсоры могут проконсультироваться напрямую с разработчиком Pyxel. Подробнее см. Здесь.