Система лестниц для OpenBOR В стандартном OpenBOR нет встроенной поддержки лазания по лестницам, как в классических beat'em up. Однако с помощью скриптов можно реализовать полноценную механику, позволяющую игроку хвататься за лестницу, двигаться вверх/вниз (и даже влево/вправо), а также спрыгивать в любой момент.
Я разработал компактную, готовую к использованию систему лестниц, которая:
- Работает без указателей и оператора & — полностью совместима с OpenBOR.
- Поддерживает до 5 лестниц на уровень (можно легко расширить).
- Имеет два типа лестниц: вертикальные (только движение по Y) и HV (движение по X и Y).
- Настраивается прямо из файла уровня через глобальные переменные.
- Не мешает другим скриптам и не создаёт утечек памяти.
Архитектура системыХранение параметров лестниц
Все параметры лестниц хранятся в глобальных переменных. Для каждой лестницы сохраняются координаты центра (x, y, z), ширина зоны захвата (w), высота (h) и тип (type). Максимальное количество — 5, но легко можно добавить новые.
float ladd_x0, ladd_y0, ladd_z0, ladd_w0, ladd_h0; int ladd_type0;
float ladd_x1, ladd_y1, ladd_z1, ladd_w1, ladd_h1; int ladd_type1;
// ... до ladd_x4
int ladd_count = 0;
Основные функцииadd_ladder(x, y, z, w, h, type) – добавляет лестницу в список.
init_ladders() – считывает глобальные переменные уровня (ladder_count, ladder0_x, …) и заполняет внутренний список.
set_current_ladder(idx) – заполняет вспомогательные переменные cur_lx, cur_ly, ... параметрами лестницы с индексом idx. Это сделано для того, чтобы избежать указателей.
process_ladders() – главная функция, которую нужно вызывать в update.c внутри блока уровня. Она обрабатывает всех игроков (0 и 1), проверяет нахождение в зоне лестницы, управляет захватом, движением и отпусканием.
Как работает обработкаПри смене уровня (current_level не равен предыдущему) вызывается init_ladders(), которая загружает параметры из глобальных переменных.
1 - Для каждого игрока проверяется, находится ли он уже на лестнице (по переменной ladder_idx).
2 - Если игрок на лестнице — обрабатывается движение (вверх/вниз, для HV-типа ещё и влево/вправо), проверяется выход за границы (верх/низ), и при нажатии прыжка — спрыгивание.
3 - Если игрок не на лестнице — проверяется, не находится ли он внутри зоны захвата какой-либо лестницы. Если да и нажата кнопка «Вверх» — происходит захват.
Пример для одной вертикальной лестницы:updatescript @script
void main()
{
setglobalvar("ladder_count", 1);
setglobalvar("ladder0_x", 100);
setglobalvar("ladder0_y", 95);
setglobalvar("ladder0_z", 0);
setglobalvar("ladder0_w", 40);
setglobalvar("ladder0_h", 190);
setglobalvar("ladder0_type", 0);
}
@end_script
Параметры:x, y, z – центр лестницы.
w – ширина зоны захвата по оси X.
h – высота лестницы по оси Y.
type – 0 (вертикальная, только движение вверх/вниз) или 1 (HV, дополнительно движение влево/вправо).
Для добавления второй лестницы использую переменные ladder1_x, ladder1_y и т.д.
Вообщем работы над ней предстоит много ещё.