Персонажи - TrueCat17/Ren-Engine GitHub Wiki
Для этого сначала регистрируются "обычные" персонажи (см. Простейшие примеры), которым затем добавляется RPG-функционал.
$ ch.make_rpg("directory", "rpg_name", "start_dress")
Где
-
ch
- персонаж, который уже создан (ch = Character("NewCharacter", color="0x0000FF")
), -
directory
- часть пути к картинке 240x384, на которой в 4 ряда (строки) расположены 5 кадров (столбцы) на каждый поворот:- Кадры (слева на право):
- 1, 2, 3, 4 - ходьба/бег,
- 2, 4 - стойка,
- 5 - сидячее положение.
- Ряды (сверху вниз):
- {1, 2, 3, 4} - соответственно {на нас, налево, направо, от нас}.
- Кадры (слева на право):
-
rpg_name
- имя персонажа в пути к RPG-спрайту (вроде me, dv, mt и т. д.), -
start_dress
- начальная одежда.
Целый путь до картинки вычисляется как directory + rpg_name + '_' + dress + '.png'
,
где dress
- одежда на персонаже ('pioneer'
, 'swim'
и т. д.), задаваемая методом set_dress
(см. отдельный абзац далее).
$ register_character_animation(character, "anim_name", "path", xoffset, yoffset,
count_frames, start_frame, end_frame, time = 1.0)
Где
-
character
- персонаж (не имя персонажа), у которого регистрируется анимация, -
anim_name
- название регистрируемой анимации, -
path
- путь к изображению (без расширения) анимации (кадры в ряд), -
xoffset
,yoffset
- отступ относительно обычного состояния (целые числа), -
count_frames
- количество кадров в изображении, -
start_frame
- начальный кадр анимации, -
end_frame
- последний кадр анимации (включительно), -
time
- время, за которое анимация будет закончена.
$ character.start_animation("anim_name", repeat = 0, wait_time = -1)
Где
-
character
- персонаж, -
anim_name
- имя зарегистрированной анимации, -
repeat
определяет кол-во повторов после первого воспроизведения:- если
repeat == 0
, повторов не будет, - если
repeat < 0
, повторы будут длиться до тех пор, пока анимация не будет удалена или заменена.
- если
-
wait_time
- время (в сек.), на которое выполнение сценария ставится на паузу:- Если
wait_time < 0
(по умолчанию), то пауза продлится до тех пор, пока не пройдёт нужное кол-во повторов (если они бесконечны, то ожидания нет). - Иначе пауза продлится указанное время. Эту анимацию можно "перемотать", нажав Пробел/Enter или кликнув по фону или кнопке "Далее".
- Если
$ character.remove_animation()
Смена одежды на "need_dress"
:
$ character.set_dress("need_dress")
Показать персонажа character
в локации location
в месте place_name
:
$ show_character(character, place_name = None, location = None)
Если локация не указывается (None
, по умолчанию), то она принимается за текущую.
Если место не указано, то координаты объекта не меняются (удобно использовать после скрытия, см. далее).
$ hide_character(character)
$ forget_character(character)
Создаваемые персонажи кладутся в список, который содержит всех созданных персонажей.
Во время обновления обновляются все персонажи из этого списка, даже если они не находятся на какой-либо локации.
Эта функция удаляет персонажа из этого списка и из локации (если она есть).
Рекомендуется использовать при удалении (окончательном, не просто при скрытии) персонажа для отсутствия обновлений этого персонажа.
Разрешить или запретить игроку управлять персонажем me
:
$ set_rpg_control(value)
Здесь value
- True
(чтобы разрешить) или False
(запретить).
Получить текущее значение можно функцией get_rpg_control()
.
Разрешить/Запретить игроку бег (при управлении с клавиатуры, не касается команд сценария):
set_run_allow(value)
Здесь value
определяет, нужно ли разрешить (True
) бег или же запретить (False
).
Узнать, разрешён ли бег: get_run_allow()
.
$ character.move_to_place("place_name", is_run = False, wait_time = -1, brute_force = False)
Все аргументы передаются в метод move_to_places
(см. далее),
place_name
же передаётся в качестве единственного элемента списка мест.
Возвращает значение вызова этого метода.
$ character.move_to_places("place_names", is_run = False, wait_time = -1, brute_force = False)
Где
-
character
- персонаж, -
place_names
- список мест, которые надо посетить, имеет вид[("location1", "place1", (-20, 0)), ("location2", "place2"), ...]
:- Если его элемент является кортежом размера 3, то в конце указан отступ от места (в пикселях),
- Если вместо локации указан
None
, то используется последняя (или текущая) локация, - Если элемент является строкой (а не кортежом), то она считается местом предыдущей локации (а если это первый элемент, то это место текущей локации персонажа),
- Последний элемент может быть числом - номером места в списке, куда нужно перейти, чтобы ходить "по кругу" (может быть меньше 0, например,
-1
укажет на элемент до этого числа).
-
is_run
-True
(бежать) илиFalse
(идти), -
wait_time
- время (в сек.), на которое выполнение сценария ставится на паузу:- Если
wait_time < 0
(по умолчанию), то пауза продлится до тех пор, пока персонаж не дойдёт до нужного места. - Иначе пауза продлится указанное время:
- Если время уже вышло, а персонаж ещё не дошёл, то происходит переход к следующей команде,
- Если время ещё не вышло, а персонаж уже дошёл до конца, то пауза всё равно продлится указанное время. Это передвижение можно "перемотать", нажав Пробел/Enter или кликнув по фону или кнопке "Далее",
- Если
-
brute_force
- следует ли при поиске пути между точками одной локации искать более короткий путь через выход из этой локации (False
- нет, быстрый поиск только внутри 1 локации).
Метод возвращает True
, если удалось найти пути между всеми точками, иначе - False
.
Однако, если какой-то из путей не удалось найти, то персонаж всё равно будет передвигаться напрямую,
сквозь все преграды (если точка, до которой не найден путь, на текущей локации) или сразу окажется в конечной точке.
Если это поведение нежелательно, то персонажа можно оставить на месте: character.move_to_place(None)
.
$ character.rotate_after_moving = to_left
Эта переменная обнуляется в None
при каждом вызове функции движения и после каждого "дохождения".
$ character.remove_path_end(dist)
Где dist
- расстояние (в пикселях), на котором нужно остановиться, не доходя до финальной точки пути
(сама эта точка указывается в 2 предыдущих функциях).
$ character.set_direction(direction)
Где
-
character
- персонаж, -
direction
- направление:-
to_forward
(от нас), -
to_back
(на нас), -
to_left
(влево), -
to_right
(вправо). На самом делеdirection
- число, аto_forward, to_back, to_left, to_right
- переменные, равные3, 0, 1, 2
соответственно. Однако использовать напрямую числа вместо переменных - плохая идея.
-
С помощью character.get_direction()
можно получить текущую сторону поворота.
Предполагается, что полученное значение будет сравниваться с переменными to_forward, to_back, to_left, to_right
.
$ character.rotate_to(obj)
Где
-
character
- персонаж, которого следует повернуть, -
obj
- объект, в сторону которого ему нужно повернуться, может быть следующих типов:-
Character
(персонаж), -
RpgPlace
(место из локации, не путать с названием места), -
dict
с параметрамиx
иy
, - Любой другой тип, у которого функция
get_place_center
может извлечь координаты.
-
Поворот является однократным, т. е. при движении объекта персонаж не будет за ним следить.
$ character.rotate_in_place(place = None)
Здесь place
- место или имя места, в котором указано, куда повернуть персонажа.
Например, "washbasin_backward-1"
.
По умолчанию берётся текущее место персонажа.
Если название содержит части "_left"
, "_right"
, "_forward"
или "_backward"
,
то персонаж поворачивается влево, вправо, вперёд (от нас) и назад (на нас) соответственно.
$ character.set_pose("pose")
Где
-
character
- персонаж, -
pose
- поза, допустимы:-
"sit"
- сидеть, -
"stay"
- стоять, -
"walk"
- идти, -
"run"
- бежать.
-
Узнать текущую позу можно с помощью character.get_pose()
.
$ character.sit_down(obj, place_index = -1)
Где
-
obj
- объект, тип которого является сиденьем, -
place_index
- индекс места, куда можно сесть на этом объекте (если меньше0
- взять ближайшее).
Сам объект можно получить, например, с помощью этого.
В качестве результата возвращается True
, если всё прошло успешно, или False
, если все места уже заняты другими
персонажами или объект не является сиденьем.
$ character.stand_up()
Вызов этого метода для несидящего персонажа не считается ошибкой.
Для "декоративных" целей можно наложить на изображение спрайта персонажа дополнительные изображения.
Это может использоваться, например, для перекрашивания волос и глаз или для добавления шляпы.
Добавление наложения:
$ character.add_over(images)
Где images
- изображение (строка), список изображений, либо функция
(принимающая character
и возвращающая изображение или их список).
Если используется функция, то рекомендуется кэшировать результат, а не вычислять его каждый кадр для каждого отображаемого персонажа заново.
Удаление наложения:
$ character.remove_over(images)
Здесь images
является тем, что добавляли с помощью add_over
выше.
Попытка удалить то, что не добавлялось, не считается ошибкой (игнорируется).