Пользовательские классы и функции - TrueCat17/Ren-Engine GitHub Wiki
Разработчик игры (т. е. пользователь Ren-Engine) может использовать свои классы для rpg-объектов со своим поведением, специфическим для его игры.
Для этого такие классы должны удовлетворять некоторым требованиям:
- Конструктор (
__init__) помимоselfпринимает ещё и параметрыxpos, ypos, xsize, ysize, **kwargs(позицию, размеры и словарь параметров), разумеется, любые эти параметры можно запомнить, проигнорировать или использовать для каких-то своих вычислений, - Обязательно должен присутствовать метод
free(), возвращающий полный путь (или результатim-функции, илиNone) к карте непроходимости, составленной по принципам обычных объектов локаций, - Метод
update, вызываемый для обновления объекта перед отрисовкой, - Метод
get_draw_data(self), возвращающий данные для отрисовки. Результатом должен быть словарь (dict) или список из нескольких словарей со свойствами:-
image- путь к изображению или результатim-функции, -
pos- кортёж или список изx- иy-координат; дальнейшие параметры не являются обязательными, -
size- кортёж или список из ширины и высоты (по умолчанию - размерыimage), -
crop- как и в ATL или ScreenLang, это часть из отрисовываемого изображения:x, y, xsize, ysize, по умолчанию(0.0, 0.0, 1.0, 1.0), -
anchor- как и в ATL или ScreenLang, это отступ, по умолчанию(0, 0), -
alpha- непрозрачность от0.0до1.0, по умолчанию1.0, -
rotate- поворот по часовой стрелке, в градусах, по умолчанию0, -
zorder- значение для сортировки по глубине:- Если меньше
0, то объект будет отрисовываться позади локации (может быть использовано, когда локация имеет прозрачные участки), - Если больше
1e6(миллион), то будет отрисовываться после изображенияoverлокации (может быть использовано для тумана), - В ином случае объект будет отрисовываться после объектов с меньшим
zorderи до тех, что имеютzorderбольше (у обычных объектовzorderобычно равенy-координате точки, на которой он стоит).
- Если меньше
-
Используется пользовательский класс rpg-объектов в той же функции, что и обычные rpg-объекты,
но вместо зарегистрированного типа объекта (т. е. строки с именем типа) передаётся ваш класс и
именованные параметры, попадающие в kwargs конструктора.
Например:
my_obj = add_location_object('location_name', 'place_name', MySuperObject, param1 = 123, param2 = 234)
my_obj.your_class_method()
Или, если параметров будет много и создавать объект нужно будет не 1 раз:
my_obj_params = {
'param1': 123,
'param2': 234,
}
my_obj = add_location_object('location_name', 'place_name', MySuperObject, **my_obj_params)
Стандартным rpg-объектам можно устанавливать свои функции, которые будут выполняться после стандартной функции обновления перед отрисовкой.
Пользовательские функции должны принимать объект в качестве аргумента и могут менять некоторые его свойства:
x, y, xanchor, yanchor, xsize, ysize, alpha.
Примеры:
Плавно удаляем (сначала добавляя прозрачности) 3 уже существующих мячика:
# функция для плавного сокрытия мячика
def ball_hiding(ball):
dtime = get_game_time() - ball.start_hiding
hiding_time = 3
ball.alpha = 1 - dtime / hiding_time
if ball.alpha < 0:
remove_location_object(ball.location.name, ball, ball.type)
# ...
# получаем список всех мячиков (объектов с типом 'ball')
# в локации location_name, отсортированых по расстоянию до места place_name
balls = get_location_objects('location_name', 'place_name', 'ball')
# для 3 ближайших мячиков
for ball in balls[:3]:
# запоминаем текущее время и запускаем плавное удаление
ball.start_hiding = get_game_time()
ball.user_function = ball_hidingПередвижение для добавляемой машины:
def car_moving(car):
dist = car.location.xsize
moving_time = 10
car.x = ((get_game_time() / moving_time) % 1) * dist
car = add_location_object('location_name', 'place_name', 'car')
car.user_function = car_moving