Skip to content

Latest commit

 

History

History
749 lines (536 loc) · 41 KB

README.ru.md

File metadata and controls

749 lines (536 loc) · 41 KB

Downloads GitHub Repo stars GitHub forks GitHub Sponsors

ko-fi

[ 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 музыкальных дорожек, которые могут комбинировать любые звуки
  • Ввод с клавиатуры, мыши и геймпада
  • Инструменты для редактирования изображений и звуков
  • Возможность пользовательского расширения палитры, каналов и банков

Цветовая палитра

Как установить

Windows

После установки Python3 (версии 3.8 или выше) выполните следующую команду:

pip install -U pyxel

Если вы устанавливаете Python с помощью официального установщика, убедитесь, что выбрана опция Add Python 3.x to PATH, чтобы команда pyxel была доступна.

Mac

После установки Homebrew выполните следующие команды:

brew install pipx
pipx ensurepath
pipx install pyxel

Чтобы обновить версию после установки Pyxel, выполните команду pipx upgrade pyxel.

Linux

После установки пакета SDL2 (libsdl2-dev для Ubuntu), Python3 (версии 3.8 или выше) и python3-pip выполните следующую команду:

sudo pip3 install -U pyxel

Если вышеописанная команда не работает, попробуйте собрать Pyxel из исходного кода, следуя инструкциям в Makefile.

Web

Веб-версия Pyxel не требует установки Python или Pyxel и работает на ПК, а также на смартфонах и планшетах с поддерживаемыми веб-браузерами.

Для получения конкретных инструкций, пожалуйста, обратитесь к этой странице.

Попробуйте примеры 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

Как использовать Pyxel

Создание Pyxel приложения

В вашем 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()

Запуск Pyxel приложения

Созданный сценарий 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.

Руководство по API

Система

  • 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])
    Возвращает значение шума Перлина для указанных координат.

Класс Image

  • 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).

Класс Tilemap

  • 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).

Класс Sound

  • 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")

Класс Music

  • seqs
    Двумерный список звуков (0-63) с указанием количества каналов

  • set(seq0, seq1, seq2, ...)
    Установить списки звуков (0-63) для каждого канала. Если указан пустой список, этот канал не используется для воспроизведения.
    Пример: pyxel.musics[0].set([0, 1], [], [3])

Расширенный API

Pyxel включает в себя "Расширенный API", который не упоминается в этом руководстве, так как он может запутать пользователей или требует специализированных знаний для использования.

Если вы уверены в своих силах, попробуйте создать удивительные работы, используя это в качестве подсказки!

Как внести вклад

Сообщение о проблемах

Используйте трекер проблем для отправки отчётов о проблемах или предложений по улучшению/добавлению новых возможностей. Перед созданием новой задачи убедитесь, что схожие открытые задачи отсутствуют.

Ручное тестирование

Ручное тестирование кода и написание отчетов о проблемах, предложений по улучшению в трекере проблем приветствуется!

Создание запроса на слияние

Патчи и исправления принимаются в форме запросов на слияние (pull-запрос, PR). Убедитесь, что проблема, к которой относится запрос на слияние, открыта в трекере проблем.

Отправленный pull request считается согласием на публикацию по лицензии MIT

Прочая информация

Лицензия

Pyxel распространяется под лицензией MIT. Его можно использовать в проприетарном программном обеспечении при условии, что все копии программного обеспечения или его значительные части включают копию условий лицензии MIT и уведомление об авторских правах.

Набор Спонсоров

Pyxel ищет спонсоров на GitHub Sponsors. Рассмотрите возможность спонсирования Pyxel для поддержки его дальнейшего обслуживания и разработки новых функций. Спонсоры могут проконсультироваться напрямую с разработчиком Pyxel. Подробнее см. Здесь.