SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › при одновременном нажатии двух кнопок персонаж быстрее двигается
В этой теме 10 ответов, 5 участников, последнее обновление Heisenberg 8 года/лет, 1 месяц назад.
-
АвторСообщения
-
Урок 8
Кто заметил, что при одновременном нажатии кнопок (например вверх+влево) персонаж лев быстрее двигается? Или это не баг , это фича такая?)
Какие предложения по исправлению? Я знаю одно, рассмотрю и вашиДополнительная проверка нажатия клавиш движения, правда с анимацией нужно что делать, а то она глючит.
C++1234567891011if (Keyboard::isKeyPressed(Keyboard::Left)){currentFrame += 0.005*time;if (currentFrame > 3) currentFrame -= 3;heroSprite.setTextureRect(IntRect(96 * int(currentFrame), 96, 96, 96));if ((Keyboard::isKeyPressed(Keyboard::Up)) || (Keyboard::isKeyPressed(Keyboard::Down))){heroSprite.move(-0.08*time, 0);}else heroSprite.move(-0.1*time, 0);}Скорость персонажа у нас динамическая относительно времени а время в свою очередь динамическое относительно скорости процессора. Скорость меняется в зависимости от нашего времени прошедшего цикла и потом эта скорость прибавляется к координатам то ли посредством move(); то ли setPosition(); . Обработка нажатий клавиш у нас происходит посредством множеств
if (Keyboard::isKeyPressed(Keyboard::Кнопка){// и тут уже происходит смешение нашего персонажа и добавление к нему нашей скорости.}Мне кажется что проблема возникает потому что все происходит за один цикл.
Пример :
Наша функция обработки нажатий кнопок()
{
//пример смещения про х.
if (Keyboard::isKeyPressed(Keyboard::Up){ move(0.1*speed/*или сразу * на time*/,0)}
if (Keyboard::isKeyPressed(Keyboard::Down){ move(0.1*speed/*или сразу * на time*/,0)}
if (Keyboard::isKeyPressed(Keyboard::Left){ move(0.1*speed/*или сразу * на time*/,0)}
if (Keyboard::isKeyPressed(Keyboard::Right){ move(0.1*speed/*или сразу * на time*/,0)}
}Тут и возникает наша проблема потому что при нажатии любой кнопки не что не мешает проверке нажатия другой кнопки. И происходит дополнительное домножение скорости к нашим координатам.
Как мне кажется нужно сделать так что бы выполнялось одно условия за цикл. Или посредством if else или switch.
Возможны глюки похожие на зиг загное хождение!
Или же можно перемножать на скорость вконце циклов if keyboard is pressed.Хотя скорой всего я не прав
прав) через switch лучше всего делать, а направление движения сделать enum’ом
А если нужно реализовать ходьбу по диагонали, то как избавится от ускорения? Делал по примеру одного из ваших уроков, и каждую из диагоналей отобразил отдельным enum’ом. Реализовать получилось, но присутствует ускорение. Не подскажете как избавится?
ну, например, если будет направление вправо-вверх и прописана скорость для него, то ускорения не будет
к сожалению, почему то есть( даже если брать очень маленькое значение.
Ниже привожу код в пример:
C++12345678910111213141516if (Keyboard::isKeyPressed(Keyboard::W) && Keyboard::isKeyPressed(Keyboard::A) && this->binoculars == false){state = lup;if (onGround == false){speed = 0.15;CurrentFrame += 0.001*time;if (CurrentFrame > 10) CurrentFrame -= 10;this->sprite.setTextureRect(IntRect(75 * int(CurrentFrame), 735, 70, 50));}else {speed = 0.05;CurrentFrame += 0.001*time;if (CurrentFrame > 7) CurrentFrame -= 7;this->sprite.setTextureRect(IntRect(77 * int(CurrentFrame), 276, 75, 137));}}Двигай спрайт по векторному направлению
Дабы не вникать в весь код, оставлю только функцию, которая несёт смысл данного поста.C++123456void Hero::Movement(float& time){float s = heroSpeed*time, sx = sin((poly.getRotation()) * PI/180.f)*s, sy = cos((-poly.getRotation()) * PI/180.f)*s;if(isHeroMoveUp || isHeroMoveDown) poly.move(0, sy);if(isHeroMoveLeft || isHeroMoveRight) poly.move(sx, 0);}Спасибо. А можете уточнить от чего зависит значение heroSpeed и почему так вычисляется координаты смещения.
Считай что heroSpeed это константа.
А скорость вычисляется в угловом направлении. -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.