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