![]() |
Комбинация клавиш
Всем привет! Подскажите пожайлуста, как можно в блитце задавать комбинации клавиш? Например вперед, впред+пробел или А, A+D, S. То есть как в файтингах. Заранее спасибо.
|
Ответ: Комбинация клавиш
If KeyDown(KEYFWD1) And KeyDown(KEYDWN1) Then...
|
Ответ: Комбинация клавиш
Нет, не просто 2 клавиши вместе, а последовательность, например для удара ножницами игрок нажмёт вперёд, а потом вперёд+А.
|
Ответ: Комбинация клавиш
Необходимо запоминать ASCII код нескольких последних нажатых клавиш и выполнять проверку в цикле
Пример Код:
if (key(0)=57 and key(1)=31 and key(2)=33) then... |
Ответ: Комбинация клавиш
Цитата:
|
Ответ: Комбинация клавиш
Я бы сделал немного иначе. А именно, есть стандартные клавиши, к примеру Лево, Вверх, Вправо, Вниз, А, Б.
Далее, сделал бы маленький скриптик, где прописанны какие нада клавиши и т.п. Затем список (правдо это на БМ просто, на б3д, массивом можно). Далее что вносится в список, изначально все приёмы, производя некое действие, все приёмы где позиция(к примеру первое действие в приёме) и действие не совпадает, то удаляем из списка указатель на приём. Остаются естественно те которые возможны в реализации, далее если не истекло время, и сделано следующее действие, запускаем опять этот же процесс, уже проверяя на второе действие, и опять же отсекаем всё остальное. Но тут возникает в драках 2 моммента, первое, это какраз приёмы быстрые, либо это серия ударов, это 2 разницы, т.к. приёмы быстрые, могут быть максимум из 3 последовательных действий, такой приём всегда начинается с направлений (движений), и заканчивается уже на кнопки ударов. Нужно это учитывать. А также есть моммент такой, что приёмы идут как серия ударов, поэтому нужно также продумывать их, дабы они правильно пересикались и небыли с одинаковыми началами, но разными приёмами.. :) Короче говоря, применение действий уже будет происходить сразу по началу выполнения комбинации (если это не быстрый приём). Да и использовать в данном случае And, Or и сами прямые функции получения нажатия\зажатия кнопок, я настоятельно не рекомендую. Тут как никогда, нужно изначально привязывать всё к переменным, и использовать затем их, либо как обычно будут баги и т.п. с инпутом, которые в подобных ситуациях частенько всплывают, сбивая с толку. |
Ответ: Комбинация клавиш
Цитата:
|
Ответ: Комбинация клавиш
2MoKa Спасибо, твой способ обдумаю. Пока использую такой код (просто для понятия принципа)
If KeyHit(RP) And AnimSeq(player)=stoyka Animate (player,3,1.3,punch1,transition) combo1=1 combo1_time=MilliSecs() EndIf If combo1=1 And MilliSecs()-combo1_time<300 And KeyDown(RS) And Keyhit(RP) Then combo1=2 If combo1=2 And AnimTime(player)>25 combo1=0 Animate(player,3,0.5,punch2,transition) If MilliSecs()-combo1_time>600 Then combo1=0, где RP(Right Punch)=76 - кнопка Num5, и RS(Right Step)=32 - кнопка D. То есть, при нажатии клавиши RP идёт удар рукой(punch1) и если после неё в течении 300 мс нажато RS+RP идёт сильный удар с выпадом(punch2). Но вот в чём беда, второе событие KeyHit(RP) не срабатывает, а если вместо него написать keyDown: If combo1=1 And MilliSecs()-combo1_time<300 And KeyDown(RS) And KeyDown(RP) Then combo1=2, то комбо срабатывает сразу при нажатии RS+RP(combo1 сразу становится равное 2). У кого то есть соображения на этот счёт? |
Ответ: Комбинация клавиш
Цитата:
|
Ответ: Комбинация клавиш
Цитата:
|
Ответ: Комбинация клавиш
viper86, нелюблю хлебом кормить, а когда ленятся - нужно отсекать..
Код:
IKhA=KeyHit(..) |
Ответ: Комбинация клавиш
Хм, не судите строго, но первое что пришло в голову: создаем эталоны типа
(код клавиши_1),(допуск времени до след. нажатия_1),(код клавиши_2),(допуск времени до след. нажатия_2)... и помещаем их в массивы, далее создаем кеш(например типом, но может и массив покатит) и заносим туда каждое нажатие со сдвигом, после каждого сдвига сверяем с эталонами. Задержки можно поставить и константой если для джойстика. Ток насколько тормозно выйдет на Блитце незнаю..:dontknow: |
Ответ: Комбинация клавиш
Цитата:
А вообще, большое спасибо всем, что помогаете. Я читаю много форумов про блиц, этот самый хороший. |
Ответ: Комбинация клавиш
viper86, респект тебе за то что реально сам учишся - это лучший метод!
Задавай ещё вопросы, такие как этот, потому что если честно этот вопрос интерестен тем что он не глупый, и имеет несколько реализаций. Драки пишешь? |
Ответ: Комбинация клавиш
Вложений: 1
Цитата:
|
Ответ: Комбинация клавиш
Вложений: 1
Задам ещё один вопрос. Мне тяжело будет его обьяснить, но я попытаюсь.
Когда мы экспортируем анимацию через b3dPipeline, все обьекты являются детями Scene Root. И когда мы используем команды предвижения, вращения и тд, то они применяются к Scene Root. Поэтому, если у нас анимация ходьбы (не на месте, как родной блицевский робот, а с премещением в пространстве), то когда мы запустим анимацию в Блитце, персонаж тоже будет перемещатся в пространстве. Но Scene Root нет, он останется в точке 0,0,0 (естественно, если мы не двигали обьект). И вот что получается: когда анимация заканчивается и мы запускаем другую (или опять эту), то персонаж опять начинает движение с центра, а не там, где закончилась предыдущая анимация. Это потому, что все обьекты привязаны к Scene Root и анимация тоже. Вот и получается, что если зациклить ходьбу, то персонаж будет всё время доходить до определённого места и опять перемещатся в центр. Конешно вы скажете, что нужно сделать анимацию без перемещения в пространстве (как робот блитцевский), и использовать MoveEntity. Но скорость движения тогда будет линейная, а шагают персонажи не линейно. Вы скажете, что можно задать движение по синусоиде (точнее его скорость). Да можно, но это только для ритмичных движений. А для остальных? Особенно со сложной и меняющейся траекторией. В итоге я хочу, чтобы SCENE ROOT двигался вместе с обьектом, согласно анимации. Тогда и анимация будет нормальная, где законилась предыдущая, там же и следующая начинается. Тогда можно к Scene Root связывать обьекты для коллизий и физики. Для большей наглядности прикрепляю пример. |
Ответ: Комбинация клавиш
Хм, вообще это изврат, и всёже придётся делать програмное перемещение, но есть небольшая идея:
Если SceneRoot в анимации двигается, ты можешь каждый цикл, двигать сам Entity на ту локальную координату как сместился SceneRoot и двигать SceneRoot обратно в нуль, таким образом ты будешь двигать объект програмно, получая скорость и т.п. из анимации. Но минусы в этом, то что ты не контролируешь определённую скорость перемещения, и такой варриант полностью зависит от анимации, а этом имхо нехорошо.. Можно сделать чисто программно, а ходьбу сделать на месте, с небольшими перемещениями, эмитируя нелинейность. :) |
Ответ: Комбинация клавиш
Нет, SceneRoot при анимации на месте. Я тоже сначала хотел каждый цикл ставить SceneRoot на то место, куда сместился персонаж. Но тогда амплитуда движений с каждым циклом увеличивается. Я решил сделать вообще изврат ))). Экспортирую главную кость с анимацией, а потом из анимации с перемещением получаю статическую анимацию. Использую статическую, то есть персонаж ходит на месте. Затем загружаю главную кость с такое же анимацией, одновременно анимирую и персонажа и кость, но задаю каждый цикл, чтоб SceneRoot персонажа следовал координатам главной кости, а по завершению анимации SceneRoot кости ставлю на то место, где находиться SceneRoot персонажа. То есть у меня двигаются всё время 2 обьекта:персонаж и главная кость. И загружаю тоже 2 анимации:статическую для персонажа и с премещением для главной кости. Таким образом я могу использовать и програмную анимацию, и заданную. Я понимаю, этот способ дикий изврат, но по другому не знаю как и анимация получается красивая и с плавными переходами.
2MoKa Спасибо, что делишься идеями и помогаешь ;) |
Часовой пояс GMT +4, время: 14:46. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot