Ситуация: Игрок нажимает кнопку K, герой кидает крюк с веревкой относительно стороны в которую смотрит (если смотрит вправо - кидает вверх-влево, если влево - вверх-вправо, в общем на угол 45 градусов в лицевую сторону). Крюк цепляется за глыбу (абсолютно любую, будь то Solid или Platform). Затем прокручивается анимация как крюк вонзается в глыбу => герой хватается за канат, описывает радиус, согласно канату, и после совершает прыжок.
Вопрос 1:(пункт 2 в "моих действиях") При установки set gravity 0 герой все равно медленно, но съезжает вниз. Можно ли сделать так, чтобы он вообще повис в воздухе с канатом (с анимацией прыжок с канатом), или есть ли какая-нибудь этому альтернатива.
Вопрос 2: Как отследить высоту, с которой падает герой? К примеру если он упал с высоты, большей 500 пикселей - тратит 2 пункта здоровья, если с высоты большей 1000 пикселей - умирает.
Мои действия:(прошу проверить правильность и если возможно - привести альтернативы или что-то сократить данного варианта)
1. Событие: On key pressed K Действия: System: Enabled group "climb" (группа, в которой собрана анимация и некоторые действия при прыжке с канатом) Create object Kanat on layer 1 from Hero (создаю канатом отдельный спрайт, т.к. при использовании встроенного к герою - на твердые предметы канат не действует)
2. Событие: On collisium Kanat and Platform Действия: Hero set animation "climbing" (прыжок с канатом) set gravity to 0 (чтобы герой повис в воздухе и не падал вниз) Kanat destroy
3. Событие: Hero - animation "climbing" is finished Действия: Hero: set gravity to 1500 (чтобы герой не висел в воздухе после завершения анимации) Hero: set jump gravity to 800 (изначальный прыжок героя не велик и чтобы казалась значимость каната я увеличиваю силу прыжка) Hero: jump (собственно прыжок после завершения анимации) delay 1000 ms (жду, чтобы не спала пониженная гравитация от прыжка) Hero: set jump gravity to 1500; System: Disable group "climb" (чтобы при случайном соприкосновении с любой платформой герой не взлетал ввысь)
Пока писал этот текст в мыслях нашел ответы на 2 своих вопроса. Эти вопросы не удалил, а перенес сюда. Т.к. я сейчас не совсем имею доступ к программе, то прошу просто проверить правильность моих умозаключений =).
Вопрос: В пункте 2 получается, что канат уничтожается, а вместо него вступает канат, который уже встроен в главного героя (совершенно идентичен), но этот канат не проходит через твердые объекты, подчиняясь законам героя. Из-за этого образуется скачок в анимации и герой цепляется в одном положении, а на самом деле проходит путь, который гораздо ниже. Т.е. упирается в solid объект. Собственно вопрос: как можно исправить этот недостаток и какие ему есть альтернативы.
Мой ответ: Я привязывал канат к герою, но что если привязать героя к канату. Значит встроенный канат в герое не нужно будет создавать, а отдельный - удалять. Просто в одно мгновение воспроизводить анимации для каната и привязанного к нему героя.
Вопрос: У меня не доработана сама анимация. Т.е. после того, как канат вонзился в глыбу у меня идет 4 кадра анимации как герой движется по канату (см. рисунок), а когда радиус описан - включается обычная анимация прыжка. Получается так, что герой делает то, что нужно, а по завершению возвращается в начальное положение, как будто ничего не происходило. Как я понял, проблема в Hotspot. Все точки hotspot на анимации во время прыжка с канатом остаются в точке начального положения, т.к. если их прикреплять к персонажу в каждом кадре прыжка, то получается, что герой вообще стоит на месте с анимацией прыжка с канатом.
Мой ответ: Опять таки следую прошлому ответу отвечу: встроенный канат создавать не придется, поэтому и точки Hotspot будут отсутствовать.
Исходник бы:) Я с трудом представляю как все это работает.
Насчет гравитации: Может есть смысл пока играется анимация каната просто привязать героя каждый кадр к определенной точке каната?
Высоту прыжка можно считать так: В момент отрыва от земли начнает сохраняться координата Y героя (TempY = Hero.Y). Если в каждый кадр новая координата меньше предыдущей, то сохраняем(If Hero.Y < TempY then TempY = Hero.Y). Если нет, то не сохраняем. Так мы получим пиковую высоту прыжка. В момент касания земли сравниваем это сохраненное число с текущей координатой Y героя (FallHeight = Hero.Y-TempY). Получили высоту с которой упал герой.
Вот исходник, демонстрирующий передвижение при помощи каната. За авторством GeorgeThreeD. Любой дурак может написать программу, которую поймёт компилятор. Хорошие программисты пишут программы, которые смогут понять другие программисты.
Еще сразу вопрос: при атаке и наличии перед героем твердого предмета - героя отталкивает назад. Пытаюсь останавливать анимацию через on collisium with another object и еще тремя функциями из этого же раздела - получилось, что если герой стоит после препятствия - анимация останавливается, а если перед - то все равно воспроизводится. Как остановить анимацию при столкновении с твердым объектом?