Я столкнулся с проблемой многократного прыжка персонажа, то есть при нажатии одной клавиши игрок прыгает, и при повторном нажатии игрок прыгает не с земли, а с воздуха. Я считаю, что для решения этой проблемы нужна проверка на нахождение игрока на земли. Другими словами: игрок может прыгать только тогда, когда он на земле, и когда нажата клавиша для прыжка. Сделать это легко, если у твоего персонажа нет анимации (текущего кадра, переключения спрайтов). Но в моей игре я уже добавил анимацию... Возможно ли реализовать прыжок при таких условиях? Буду рад помощи!
Вот код моего удара в прыжке(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;
Как связано нахождение на земле и анимация? На мой взгляд это нелогичная связь
Короче проблема, сделать однократный прыжок с сохранением анимации. Чтобы нельзя было прыгать в воздухе.
matrixoidr
Ну так вы уже решили эту проблему. Флаг на земле, не на земле.
Этот флаг не должен зависеть от анимации, он должен зависеть от положения игрока на земле не на земле.
Контроллер движения работает с параллепипид/прямоугольник передвигаемый внутри физического движка, у него в любой момент времени есть точки контактов с окружающим миром, он всегда знает касается он его и каким местом. Анимация и визуализация это просто отображение этого физического объекта.
Проблема в том, что анимация выполняется не за один if, не за два, а за очень много. И если в начале поставить условие на onGround, то if выполнится один раз. Анимация останется на первом кадре и закончится на нем.
matrixoidr
Анимация и визуализация персонажа это такая абстракция которая в зависимости от положения физического контроллера пытается все красиво нарисовать.
Для решения таких задач нужно научиться смешивать анимации между собой и играть их с нужной скоростью ускорять и замедлять.
Ваша ошибка что вы пытаетесь во главу поставить визуализацию, и от неё все считать, это неправильно. Главным в контроллере движения должен быть физический объект.
Кодом поможете, или хоть статья есть какая по этому поводу? По вашим словам вроде все понятно, а куда дальше двигаться - не совсем...
matrixoidr
https://gamedev.stackexchange.com/questions/88012/implementing-ch… -real-physics
https://vvvv.org/sites/default/files/uploads/node10-box2d-workhop.pdf
Тема в архиве.