Box2DФорумОбщее

Проблема многократного прыжка персонажа

#0
20:03, 26 дек 2020

Я столкнулся с проблемой многократного прыжка персонажа, то есть при нажатии одной клавиши игрок прыгает, и при повторном нажатии игрок прыгает не с земли, а с воздуха. Я считаю, что для решения этой проблемы нужна проверка на нахождение игрока на земли. Другими словами: игрок может прыгать только тогда, когда он на земле, и когда нажата клавиша для прыжка. Сделать это легко, если у твоего персонажа нет анимации (текущего кадра, переключения спрайтов). Но в моей игре я уже добавил анимацию... Возможно ли реализовать прыжок при таких условиях? Буду рад помощи!

Вот код моего удара в прыжке(4 кадра анимации):

if (Keyboard::isKeyPressed(Keyboard::W) and Keyboard::isKeyPressed(Keyboard::Q)) //vertical jump + attack
    {
      if (position.y*SCALE >= 400)
      {
        if (CurrentJumpFrame > 3.5 or !(Keyboard::isKeyPressed(Keyboard::W)))
        {
          if (onGround)
          {
            std::cout << " На земле ";
            sprite_player_1_move.setTextureRect(IntRect(0, 480, 270, 480));
            velocity.y = 0;
            CurrentJumpFrame = 0;
          }
          else
          {
            std::cout << " Конец прыжка! ";
            sprite_player_1_move.setTextureRect(IntRect(270, 0, 270, 480));
            velocity.y = 0.4*time;
          }
        }
        else {
          std::cout << " Прыжок! ";
          CurrentJumpFrame += player_1_speed * time;
          sprite_player_1_move.setTextureRect(IntRect(int(CurrentJumpFrame) * 270, 0, 270, 480));
          velocity.y = -0.2*time;
          std::cout << CurrentJumpFrame << std::endl;
        }
        std::cout << sprite_player_1_move.getTextureRect().width << std::endl;
      }
    }

Вот код проверки, находится ли персонаж на земле (Но я его не использую, т.к. не знаю куда его впихнуть учитывая анимацию):

bool onGround = false;
    position = body_1->GetPosition();
    position.y += 161 / SCALE;
    for (b2Body* it = World.GetBodyList(); it != 0; it = it->GetNext())
      for (b2Fixture *f = it->GetFixtureList(); f != 0; f = f->GetNext())
        if (f->TestPoint(position))  onGround = true;
#1
21:44, 26 дек 2020

Как связано нахождение на земле и анимация? На мой взгляд это нелогичная связь

#2
21:50, 26 дек 2020

Короче проблема, сделать однократный прыжок с сохранением анимации. Чтобы нельзя было прыгать в воздухе.

#3
21:52, 26 дек 2020

matrixoidr
Ну так вы уже решили эту проблему. Флаг на земле, не на земле.
Этот флаг не должен зависеть от анимации, он должен зависеть от положения игрока на земле не на земле.

Контроллер движения работает с параллепипид/прямоугольник передвигаемый внутри физического движка, у него в любой момент времени есть точки контактов с окружающим миром, он всегда знает касается он его и каким местом. Анимация и визуализация это просто отображение этого физического объекта.

#4
21:56, 26 дек 2020

Проблема в том, что анимация выполняется не за один if, не за два, а за очень много. И если в начале поставить условие на onGround, то if выполнится один раз. Анимация останется на первом кадре и закончится на нем.

#5
22:02, 26 дек 2020

matrixoidr
Анимация и визуализация персонажа это такая абстракция которая в зависимости от положения физического контроллера пытается все красиво нарисовать.
Для решения таких задач нужно научиться смешивать анимации между собой и играть их с нужной скоростью ускорять и замедлять.

Ваша ошибка что вы пытаетесь во главу поставить визуализацию, и от неё все считать, это неправильно. Главным в контроллере движения должен быть физический объект.

#6
22:13, 26 дек 2020

Кодом поможете, или хоть статья есть какая по этому поводу? По вашим словам вроде все понятно, а куда дальше двигаться - не совсем...

#7
22:40, 26 дек 2020

matrixoidr
https://gamedev.stackexchange.com/questions/88012/implementing-ch… -real-physics

https://vvvv.org/sites/default/files/uploads/node10-box2d-workhop.pdf

https://dl.acm.org/doi/10.1145/3214834.3214849

Box2DФорумОбщее

Тема в архиве.