SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Еденичное нажатие клавиши
В этой теме 8 ответов, 5 участников, последнее обновление 1nquisitor 8 года/лет, 4 мес. назад.
-
АвторСообщения
-
Как известно, во время нажатия клавиши, событие в лупе возникает несколько раз. Вычитал в справочнике, что для того чтобы это обойти, существует метод
C++1window.setKeyRepeatEnabled(false);только он у меня чего то не срабатывает, я что то делаю не так?
вот мой код-C++1234567891011121314151617181920212223242526272829303132int main(){RenderWindow window(sf::VideoMode(640, 480), "game");window.setKeyRepeatEnabled(false);//это должно спасти ситуацию..но не работаетwhile (window.isOpen()){sf::Event event;while (window.pollEvent(event)){if (event.type == sf::Event::Closed)window.close();}if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Down){std::cout << "one time" << std::endl;//печатает кучу раз в зависимости от процессора и длительности нажатия клавиши}window.clear();window.draw(sprite);window.display();}return 0;}Как я понял, это работает в зависимости от кадров в секунду
То есть, клавиша и срабатывает всего раз, но это за кадр
И так за каждый кадр по разу
Это я понял, ограничив кадры методомC++1window.setVerticalSyncEnabled(1);Попробуй создать переменную, проверяющую единоразовое выполнение действия
Быть может стоит создать bool переменную, которая будет false сразу после нажатия и позволит нажать на клавишу если она true.
Как пример может быть стоит посмотреть вот здесь: sfml урок вывод инфы по нажатию клавиши , возможно поможет
Попробовал- не катит, зараза ;(
Павел, пробовал твоим методом- работает, но клавиши нужно ООчень кратковременно нажимать, иначе определяет как два нажатия
Странно. Ну крайний случай – можно использовать таймер.
Когда мне нужно было вводить информацию, я искал читал и пришел к выводу что Sfml не предоставляет формы для ввода. После долгих раздумий как реализовать ввод информации так чтоб это ещё и отображалось на экране придумал вод что (это очень глупо но всё же мне помогло ):
Создал главную строковую переменную типа String input;
Для каждой кнопки я создал отдельную переменную string Q =”Q”;// и так для каждой буквы
Потом цикл Ifфов по поводу нажатия той или иной кнопки и к главной переменной input я прибавлял переменную то что ввел, и сразу отрисовывал на экран в виде текста .
Возникла такая же проблема а именно при нажатии одной кнопки мне печатало их сразу по 20-50.
Я добавил в If(Keyboard::isKeyPressed(Keyboard::Q){input=input+Q; while Keyboard::isKeyPressed(Keyboard::Q){// оставил тело пустым }}
Получается что после нажатия кнопки у меня запускается пустой цикл пока я держу эту кнопку. Само собой это глупое решение та как программа зависает пока я держу кнопку и выполняется цикл ничего, но если у вас на экране один фон и вы вводите например своё имя после прохождения для записи рекорда( так как было у меня ) то в принципе это не заметно даже если на фоне играет музыка (она к примеру не виснет ). Пока я не знаю другого решения пользуюсь этим.
MicroSDA, как ты BackSpace реализовал ?
//name -это std::string;
if (Keyboard::isKeyPressed(Keyboard::BackSpace))
{
if (!name.empty())//если не пустая строка
{
name.erase(name.end() – 1);//в конец строки и минус 1 знак
}}
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.