-
Notifications
You must be signed in to change notification settings - Fork 0
Персонажи
Для этого сначала регистрируются "обычные" персонажи (см. Простейшие примеры), которым затем добавляется 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
выше.
Попытка удалить то, что не добавлялось, не считается ошибкой (игнорируется).
Основы
Если вы новичок, то будет достаточно прочитать лишь это, пока ваш энтузиазм не исчерпан.
Остальное можно будет прочесть по мере надобности.
Документация по RPG-части находится здесь.
Более сложные вещи
Через некоторое время вам, возможно, потребуются более продвинутые возможности.
- Функции для изображений (im-функции).
- Эффекты.
- Времена суток.
- ATL (анимации и трансформации).
- Ввод с клавиатуры.
- Введение в ScreenLang (GUI, интерфейс).
- Конфигурирование игры.
Дополнительно
- Некоторые полезные функции.
- Сигналы и таймауты.
- Технические подробности работы с изображениями.
- Технические подробности ВН-спрайтов.
- Система переводов.
- Воспроизведение видео.
- Скрин помощи.
- Прерываемые циклы.
- https.
- Система обновлений.
Перед самым началом
Советы для новичков и не только.
Оффтоп.