Как включить прыжки непосредственно перед тем, как игрок коснется земли в Phaser?

С Phaser (и последующими инструкциями) прыгать очень легко благодаря предоставленному физическому модулю Arcade. Однако меня раздражает тот факт, что игрок может прыгать только тогда, когда он находится «на» земле из-за использования логики «игрок-касание».

Код, который я использую, основан на Game Mechanic Explorer, Platformer #4 и следует за ним;

var canJump = this.player.body.touching.down;

if (canJump && this.upInputIsActive()) {
    this.player.body.velocity.y = this.JUMP_SPEED;
}

Я хотел бы, чтобы игрок мог прыгать, когда он очень близко к земле, но еще не касается, чтобы повторный прыжок/прыжок при приземлении является более текучим. Таким образом, и наблюдение, что ограничение вызвано touching.down игрока, мои вопросы;

  1. Можно ли определить расстояние («насколько высоко») игрок от земли (которая может быть платформой) непосредственно под ним? Тогда canJump — это просто функция расстояния, верная только для очень малых значений.

  2. Можно ли расширить виртуальный хит-бокс вокруг игрока (который будет путешествовать вместе с игроком), чтобы его собственный touching.down можно было использовать для обнаружения этого случая? Этот подход лучше? Сам спрайт игрока не должен подниматься над землей или подвергаться каким-либо другим воздействиям.

Цель здесь состоит в том, чтобы позволить игроку прыгать как раз перед тем, как он должен быть в состоянии, поэтому запоминание нажатия клавиши вверх в течение короткого промежутка времени, что может быть жизнеспособным, не является решением. Я ищу в этом конкретном случае.


person user2864740    schedule 03.09.2014    source источник
comment
Вы должны создать таймер wantToJump и установить его на определенное время или количество шагов, когда пользователь пытается прыгнуть, все еще находясь в воздухе, а затем отсчитывать его во время обновления. Пока WantToJump больше 0, игрок должен прыгать мгновенно при обнаружении касания земли.   -  person LearnCocos2D    schedule 03.09.2014
comment
@LearnCocos2D Это текущее поведение, если удерживать кнопку «вверх» нажатой (и такой подход действительно воспроизвел бы его для одного нажатия с небольшой погрешностью), но моя цель — фактически позволить игроку обманывать / играть в систему с помощью несколько пикселей. В моей текущей игре игрок немного подпрыгивает (и падает медленнее), чем в связанном примере.   -  person user2864740    schedule 03.09.2014
comment
Я бы не пошел по этому пути, если вы это сделаете, это означает, что обычный прыжок может достигать высоты 100 пикселей, но если вы делаете непрерывный прыжок, второй прыжок может достигать высоты 105 пикселей, что, возможно, позволяет игроку перейти к места, где она не должна. Кроме того, это, вероятно, не будет выглядеть/чувствовать себя лучше. Игроки будут ожидать, что игрок снова прыгнет, когда коснется земли, а не немного выше ее. Возможно, у вас есть задержка в 1 кадр между регистрацией касания земли и повторным прыжком, что вызывает небольшую задержку перед повторным прыжком?   -  person LearnCocos2D    schedule 03.09.2014
comment
@LearnCocos2D Если игрок может туда добраться, то он должен быть в состоянии туда добраться :D На данный момент я все еще ищу хорошие решения для двух вопросов (чтобы иметь возможность выполнять эти простые задачи) и не обязательно заканчивать отполированную игру. Мне удалось создать хакерский вариант № 2, вручную переместив еще один крошечный спрайт под игрока и проверив его наложение с объектами мира, но это похоже на халтуру. Спасибо за отзыв о возможных проблемах, я буду иметь это в виду.   -  person user2864740    schedule 03.09.2014


Ответы (1)


  1. Не "родной". Здесь нет CCD или упреждающего просмотра, тело интересует только направление, в котором оно движется. То, чего вы пытаетесь достичь, широко известно как использование датчика. В P2 есть поддержка сенсоров, а в Arcade Physics нет, поэтому вам придется имитировать ее — либо путем создания второго тела (на которое вы ссылались в пункте 2), либо с помощью маркера. Это может быть простой объект Point, который «сбрасывается» при прыжке, и затем вы можете использовать встроенные проверки расстояния между точкой и телом, чтобы учесть ваше требование «ближнего прыжка».

  2. Да, это возможно, но тогда ваш спрайт будет «парить» в воздухе. Так что смотрите пункт 1 :)

person PhotonStorm    schedule 03.09.2014
comment
В итоге я решил эту задачу, создав маленькое тело (перемещенное вручную вместе с основным спрайтом, а не с помощью физики) и используя тест наложения. - person user2864740; 04.09.2014