Объекты локаций - TrueCat17/Ren-Engine GitHub Wiki

Регистрация объекта для отображения в локации

$ register_location_object("obj_name", "directory", "main_image", "free_image",
                           max_in_inventory_cell = 0, remove_to_location = True)

Где

  • obj_name - название регистрируемого объекта, который будет отображаться в локации,
  • directory - путь к директории изображений,
  • main_image - основное изображение объекта (в directory) без точки с расширением (.png),
  • free_image - изображение "карты проходимости",
    Аналогично такой же у локаций, но персонаж может передвигаться только вне чёрных зон (у локаций - только внутри),
    Если отсутствует (None), то двигаться можно везде,
  • max_in_inventory_cell - максимальное кол-во таких объектов в одной ячейке инвентаря (если меньше 1, то в инвентарь взять нельзя),
  • remove_to_location - True - если при "удалении" из инвентаря объект возвращается на карту, False - если просто удаляется.

Путь до изображения объекта вычисляется так:
image_path = directory + main_image + '.png'
Для карты проходимости вместо main_image берётся free_image.


Регистрация анимации у объекта

$ register_location_object_animation("obj_name", "anim_name", "directory", "main_image", "free_image",
                                     xoffset, yoffset, 
                                     count_frames, start_frame, end_frame, time = 1.0)

Где

  • obj_name - название объекта локации, для которого регистрируется анимация,
  • anim_name - название регистрируемой анимации,
  • directory - путь к директории изображений,
  • main_image - основное изображение с одинаковыми по размеру кадрами, расположенными горизонтально друг за другом (без расширения),
  • free_image - изображение с кадрами "карты проходимости", так же расположенными друг за другом (без расширения),
    Если кадры не одинаковы, то прохождение по ним игрока во время их смены нежелательно,
  • xoffset, yoffset - отступ относительно обычного состояния (целые числа),
  • count_frames - количество кадров в main_image,
  • start_frame - начальный кадр анимации,
  • end_frame - последний кадр анимации (включительно),
  • time - время, за которое анимация будет закончена (в секундах).

Путь до изображения с кадрами вычисляется аналогично пути к основному изображению (см. абзац выше).


Добавление объекта в локацию

$ add_location_object("location_name", place, "obj_name", **kwargs)
Где

  • location_name - имя локации, в которую добавляется объект,
  • place - имя места в локации, в которое будет поставлен объект,
    Или объект (например, dict) со свойствами x и y (опционально, с xsize и ysize), обозначающми координаты (и размеры) места, в которое будет добавлен объект,
  • obj_name - название зарегистрированного (с помощью register_location_object) объекта, который будет отображаться в локации,
  • kwargs в этом случае не используется.

Также вместо названия ранее зарегистрированного объекта можно использовать свой класс.


Ближайшие объекты

Получить список из count ближайших объектов типа obj_name:
$ objs = get_location_objects("location_name", place, "obj_name", count = -1)
Где

  • location_name - имя локации, на которой ищутся объекты (название текущей локации лежит в переменной cur_location_name),
  • place:
    • Имя места в локации, рядом с которым будет искаться объект,
    • Или объект (например, dict) со свойствами x и y, обозначающими координаты точки, в которой будет искаться объект,
  • Если obj_name == None, то тип объекта игнорируется (берутся все),
  • Если count < 0, то вернётся список всех объектов указанного типа,
  • Если нужных объектов будет меньше count, результат будет аналогичен с count == -1.

Ближайший объект для взятия в инвентарь

$ obj = get_near_location_object_for_inventory(character = None)
Здесь character - персонаж, рядом с которым ищется объект, по умолчанию персонаж игрока (me),


Дать инвентарь объекту

Инвентарь объекта может устанавливаться для создания шкафов или ящиков, в которых игрок может хранить вещи.
Для их открытия игроку нужно просто подойти к объекту и как обычно открыть инвентарь.

inventory.set_size(size, obj = None)
Где:

  • size - новый размер инвентаря (при уменьшении невлезающие вещи будут разбросаны вокруг),
  • obj - объект, у которого меняется размер инвентаря (по умолчанию - персонаж me).

Кроме того, иногда может быть удобно не создавать отдельный объект и добавлять его в локацию, а просто нарисовать его в main.png локации.
В качестве же объекта в этом случае нужно использовать "место" локации, например:
inventory.set_size(16, rpg_locations['house_mt'].places['cupboard'])
(предполагается, что абзац про "внутренности" в статье о локациях уже был прочитан ранее).


Ближайший объект с инвентарём

$ obj = get_near_location_object_with_inventory(character = None)
Здесь character - персонаж, рядом с которым ищется объект, по умолчанию персонаж игрока (me),

Эта функция учитывает параметр openable у объекта (по умолчанию отсутствует).
Он может иметь значение True/False или быть функцией, которая их возвращает.
Это можно использовать для "закрытия" ящиков, шкафов и т. д.


Ближайшие объекты-сиденья

objs = get_near_sit_objects(character = None, max_dist = None)
Где:

  • character - персонаж, возле которого ищется сиденье (me, если не указано),
  • max_dist - максимальное расстояние от персонажа (без ограничений, если меньше 0).

Результатом будет массив из кортежей вида (obj, point), где point - точка (x, y), с которой лучше садиться на obj (вычисляется, исходя из указанного при регистрации поворота).

Функция не учитывает объекты, на которые нельзя сесть (например, из-за занятости мест).


Расстояние до объекта

Посчитать расстояние от точки x, y до объекта: dist = obj.dist_to(x, y)

Расчёт производится до ближайшей точки объекта (на основе "физики", минимального прямоугольника в картинке параметра free_image), а не просто до координат объекта.


Запуск анимации у объекта локации

$ obj.start_animation("anim_name", speed = 1.0, repeat = 0)
Где

  • obj - объект локации из списка, полученного вызовом get_location_objects,
  • anim_name - имя зарегистрированной анимации,
  • speed - скорость воспроизведения относительно указанной при регистрации:
    • Если speed == 0, отображаться будет только начальный кадр анимации,
    • Если speed < 0, то только финальный,
  • repeat определяет кол-во повторов после первого воспроизведения:
    • если repeat == 0, повторов не будет,
    • если repeat < 0, повторы будут длиться до тех пор, пока анимация не будет удалена или заменена. Эту анимацию можно "перемотать", нажав Пробел/Enter или кликнув по фону или кнопке "Далее".

Удаление анимации у объекта

Возврат к обычному изображению объекта:
$ obj.remove_animation()
Где obj - объект локации из списка, полученного вызовом get_location_objects.


Удаление объекта

$ remove_location_object("location_name", place, "obj_name", count = 1)
Здесь

  • "location_name" - имя локации, с которой удаляется объект,
  • place - место в этой локации (название или dict с x и y),
  • obj_name - тип удаляемых объектов,
  • count - кол-во ближайших к place объектов, которые нужно удалить. Если указано больше, чем существует, то оставшееся игнорируется.

Объекты-сиденья

На некоторые объекты (стулья, скамейки...) можно сесть, подойдя к ним и нажав Z (или вызвав me.sit_down(obj) в сценарии). Причём сесть возможно и более чем на одно место в объекте. Чтобы сделать такой объект из обычного, нужно вызвать set_sit_place:

$ set_sit_place("obj_name", sit_places, over = None)
Где

  • obj_name - тип объекта, которому добавляется эта фунциональность,
  • sit_places - массив из элементов: координаты и поворот на объекте, 0, 0 - центральный верхний пиксель объекта (также опциональный параметр #4 говорит о том, могут ли персонажи садиться самостоятельно (True, по умолчанию) или только по сценарию, с указанием индекса конкретного места (False)),
  • over - изображение, которое рисуется поверх объекта и персонажа на нём, если None - отсутствует.

Последний параметр обычно используется, когда при сидении персонаж смотрит "от нас".

Пример:
set_sit_place('liaz_bench_left', [(-16, 30, to_left), (-16, 50, to_left)])

Рекомендуется выделить отдельный файл (locations/sit_places.rpy), в котором будут описаны места для всех "объектов-сидений".


Далее ->
<- Назад

⚠️ **GitHub.com Fallback** ⚠️