Объекты локаций - 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), в котором будут описаны места для всех "объектов-сидений".