Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2012, 17:43   #1
SiNoNoto
Новичок
Джуниор
 
Регистрация: 23.08.2012
Сообщений: 1
Вопрос обработка нажатий клавиш в Qt

//Если ошибся с веткой форума, пожалуйста перенесите.

Пишу на С++ с испльзованием QGLWidget.
При обработке нажатых клавиш клавиатуры возникает следующая проблема:
Когдя я зажимаю клавишу, камера перемещается на один шаг, затем замирает где-то на полсекундыи начинает двигаться уже без пауз, до следующего нажатия.

Код:
    bool event(QEvent *event){
        if (event->type() == QEvent::KeyPress) {
            QKeyEvent *keyEvent = (QKeyEvent *)event;
            if (keyEvent->nativeVirtualKey() == Qt::Key_W) {
                type=1;
                updateGL();
                return 1;
            }
        }
        if (event->type() == QEvent::KeyRelease) {
            type=0;
        }
        return QWidget::event(event);
    }
тут type это тип движения. Он передается в другую функцию и там обрабатывается. Функция обработчик в полном порядке, т.к. в связке с обработчиками клавиш библиотеки GLFW она работала отлично.
keyPressEvent дает такой-же глюк. Хотя может это замаскированная фича.

В целом нужно какая-то фича, чтобы реакция на клавиши была как в шутерах(быстро, решительно)

Последний раз редактировалось SiNoNoto; 23.08.2012 в 18:29.
SiNoNoto вне форума Ответить с цитированием
Старый 25.08.2012, 09:50   #2
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Все работает верно! =) При вводе текста, зажми клавишу(например буквы) и сам воочую увидишь. Это сделано для удобства набора текста.

А теперь по порядку. У тебя должен быть где-то основной цикл игры(будь то таймер или while(true){} ). Вот как раз в нем и нужно обрабатывать нажатые клавиши.
Заведи массив bool KeyboardState[255] = {0}; и при событии нажатия клавиши устанавливаешь соответствующему элементу массива true, а когда отпущена false;

Код:
bool event(QEvent *event){
        if (event->type() == QEvent::KeyPress) {
            QKeyEvent *keyEvent = (QKeyEvent *)event;
            KeyboardState[keyEvent->key()] = true;
        }
        if (event->type() == QEvent::KeyRelease) {
            QKeyEvent *keyEvent = (QKeyEvent *)event;
            KeyboardState[keyEvent->key()] = false;
        }
        return QWidget::event(event);
    }
Kostia вне форума Ответить с цитированием
Старый 01.05.2014, 17:18   #3
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию

Десятый раз натыкаюсь на эту тему. Надо решить один спорный вопрос. В QT4,5 Метод key() класса QKeyEvent нынче не возращает ASCII код. например для клавиши ESC это 16777216. Делать такой здоровенный массив глупо. Как из этого достать ASCII? Остановился на QKeyEvent::text.toAscii.toHex(), а это не есть хорошо, т.к. нужен int.

-----
Все проще простого.
Код:
QKeyEvent::text().at(0).toAscii()
Только непонятно, зачем надо было убирать метод ascii() из QKeyEvent?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 01.05.2014 в 17:27.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 01.05.2014, 17:42   #4
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Сообщение от _PROGRAMM_ Посмотреть сообщение
Только непонятно, зачем надо было убирать метод ascii() из QKeyEvent?
Ну очевидно - ascii впринцыпе не должен корректно обрабатывать не латиницу (т.е. ситуацию, когда у вас включена русская раскладка клавиатуры).


К стати, а зачем вам массив из 255 элементов под всю таблицу ASCII ? У вас что, все этик лавиши (половины из которых даже на клавиатуре нет, лол) задействованы в игре? Есть смысл делать массив только под используемые в игре клавиши управления.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 01.05.2014, 18:21   #5
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию

Цитата:
К стати, а зачем вам массив из 255 элементов под всю таблицу ASCII ? У вас что, все этик лавиши (половины из которых даже на клавиатуре нет, лол) задействованы в игре? Есть смысл делать массив только под используемые в игре клавиши управления.
Если мы касаемся игр, то должны обеспечить пользователю возможность сменить стандартную клавишу, на любую другую. Я делаю программу для управления летающим аппаратом, поэтому не принципиально, просто спросил.
Цитата:
Ну очевидно - ascii впринцыпе не должен корректно обрабатывать не латиницу (т.е. ситуацию, когда у вас включена русская раскладка клавиатуры).
Вот это уже аргумент. Я как-то привык делать условия для четырех символов сразу W,w,Ц,ц. Колитесь, что там за способ упростить мои страдания? Сегодня придумал делать enum{W,A,S,D}, но опять же... кириллицу QKeyEvent->key не обрабатывает одной константой.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 02.05.2014, 01:43   #6
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Цитата:
W,w,Ц,ц
Т.е. я на французской раскладке не поиграю? Впрочем в ubuntu именно так и сделали xD
попробуйте этот вариант:
Код:
event->nativeScanCode()
В Qt 5 методы toAscii исчезли отовсюду =(
Kostia вне форума Ответить с цитированием
Старый 02.05.2014, 15:11   #7
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию

Цитата:
Т.е. я на французской раскладке не поиграю?
Если Вы убедительно меня попросите, то я с радостью добавлю реализацию для французской раскладки.
Цитата:
Впрочем в ubuntu именно так и сделали xD
Там косяк в другом. Криво реализовано взаимодействие с X11.
Цитата:
В Qt 5 методы toAscii исчезли отовсюду =(
Все, что не делается ...
Цитата:
попробуйте этот вариант:
Спасибо, гляну.

Цитата:
event->nativeScanCode()
Зато таким методом я откидываю всех яблочных пользователей.(Трубы не горят. Просто, как факт)

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 02.05.2014 в 15:29.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 03.05.2014, 11:19   #8
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Там косяк в другом. Криво реализовано взаимодействие с X11.
Не знаю как именно они там накосячили, но все хоткеи типа "Ctrl+Alt+T" или "Ctrl+Alt+L" работают только на английской раскладке (ну если точнее, то на русской они не работают).
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 28.06.2017, 11:39   #9
Fabeldyr
Пользователь
 
Аватар для Fabeldyr
 
Регистрация: 25.10.2011
Сообщений: 14
По умолчанию

я может чего-то не понимаю, но коды клавиш
влево - 75, вправо - 77

qDebug() << event->key() выдаёт
влево - 16777234, вправо - 16777236

qDebug() << event->nativeScanCode() выдаёт
влево - 331, вправо - 333

клавиша ввода - 13, но
16777220 key
28 native

Последний раз редактировалось Fabeldyr; 28.06.2017 в 12:35.
Fabeldyr вне форума Ответить с цитированием
Старый 28.06.2017, 16:42   #10
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Fabeldyr Посмотреть сообщение
я может чего-то не понимаю, но коды клавиш
влево - 75, вправо - 77

qDebug() << event->key() выдаёт
влево - 16777234, вправо - 16777236

qDebug() << event->nativeScanCode() выдаёт
влево - 331, вправо - 333

клавиша ввода - 13, но
16777220 key
28 native
Key() - коды берутся от сюда
http://doc.qt.io/qt-5/qt.html#Key-enum

nativeScanCode() см исходный код
Для виндоуса
https://code.woboq.org/qt5/qtbase/sr...r.cpp.html#636
Для линукса
https://code.woboq.org/qt5/include/S...cancode.h.html
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка нажатий клавиш во время паузы iov Microsoft Office Excel 4 04.05.2012 18:59
Эмуляция нажатий клавиш в играх Boris-Britva Общие вопросы Delphi 6 24.06.2011 15:20
Эмуляция нажатий клавиш BorisBritva Общие вопросы Delphi 1 01.11.2010 13:09
симуляция нажатий клавиш 4321 Общие вопросы Delphi 14 23.10.2008 23:18
отслеживание нажатий клавиш Артэс Win Api 6 14.06.2008 20:02