при одновременном нажатии двух кнопок персонаж быстрее двигается

SFML и C++ Уроки \ Разработка игр Форумы SFML System, Window и другие вопросы при одновременном нажатии двух кнопок персонаж быстрее двигается

В этой теме 10 ответов, 5 участников, последнее обновление Heisenberg Heisenberg 3 года/лет назад.

Просмотр 11 сообщений - с 1 по 11 (из 11 всего)
  • Автор
    Сообщения
  • #162
    Павел Букреев
    Павел Букреев
    Хранитель
    Сообщений:586

    Зарегистрирован:
    04.01.2015

    Репутация:104

    Урок 8
    Кто заметил, что при одновременном нажатии кнопок (например вверх+влево) персонаж лев быстрее двигается? Или это не баг , это фича такая?)
    Какие предложения по исправлению? Я знаю одно, рассмотрю и ваши :)

    #330
    eL_FaRMaZoN
    eL_FaRMaZoN
    Участник
    Сообщений:1

    Зарегистрирован:
    09.04.2015

    Репутация:1

    Дополнительная проверка нажатия клавиш движения, правда с анимацией нужно что делать, а то она глючит.

     

    #593
    MicroSDA
    MicroSDA
    Участник
    Сообщений:64

    Зарегистрирован:
    24.04.2015

    Репутация:22

    Скорость персонажа у нас динамическая относительно времени а время в свою очередь динамическое относительно скорости процессора. Скорость меняется в зависимости от нашего времени прошедшего цикла и потом эта скорость прибавляется  к координатам то ли посредством 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.

    #594
    MicroSDA
    MicroSDA
    Участник
    Сообщений:64

    Зарегистрирован:
    24.04.2015

    Репутация:22

    Хотя скорой всего я не прав

    #597
    Павел Букреев
    Павел Букреев
    Хранитель
    Сообщений:586

    Зарегистрирован:
    04.01.2015

    Репутация:104

    прав) через switch лучше всего делать, а направление движения сделать enum’ом

    #1825

    saxartom
    Участник
    Сообщений:22

    Зарегистрирован:
    17.09.2015

    Репутация:4

    А если нужно реализовать ходьбу по диагонали, то как избавится от ускорения? Делал по примеру одного из ваших уроков, и каждую из диагоналей отобразил отдельным  enum’ом. Реализовать получилось, но присутствует ускорение. Не подскажете как избавится?

    #1826
    Павел Букреев
    Павел Букреев
    Хранитель
    Сообщений:586

    Зарегистрирован:
    04.01.2015

    Репутация:104

    ну, например, если будет направление вправо-вверх и прописана скорость для него, то ускорения не будет

    #1828

    saxartom
    Участник
    Сообщений:22

    Зарегистрирован:
    17.09.2015

    Репутация:4

    к сожалению, почему то есть(  даже если брать очень маленькое значение.

    Ниже привожу код в пример:

    #1829
    Heisenberg
    Heisenberg
    Участник
    Сообщений:323

    Зарегистрирован:
    01.04.2015

    Репутация:145

    Двигай спрайт по векторному направлению
    Дабы не вникать в весь код, оставлю только функцию, которая несёт смысл данного поста.

    #1840

    saxartom
    Участник
    Сообщений:22

    Зарегистрирован:
    17.09.2015

    Репутация:4

    Спасибо. А можете уточнить от чего зависит значение heroSpeed и почему так вычисляется координаты смещения.

    #1842
    +2
    Heisenberg
    Heisenberg
    Участник
    Сообщений:323

    Зарегистрирован:
    01.04.2015

    Репутация:145

    Считай что heroSpeed это константа.
    А скорость вычисляется в угловом направлении.

Просмотр 11 сообщений - с 1 по 11 (из 11 всего)

Для ответа в этой теме необходимо авторизоваться.