Другие языки программирования и технологии

qt обработка нескольких клавиш.

Пишу простенькую игру - вертикальный скроллер. Нужно, чтобы при одновременном нажатии стрелок вверх и вправо (например) самолет летел по диагонали. А когда отпускаешь вверх - то летел только вправо. Как это реализовать? Код нынешней функции обработчика. Нужно ли для этого отказаться от keyPressEvent? void GameField::keyPressEvent(QKeyEvent *k) { QMessageBox *qBox= new QMessageBox(QMessageBox::Question, "Huzzah!", "Key is pressed!", QMessageBox::Ok); switch ( tolower(k->key()) ) { case Qt::Key_Left: // reload ui->RunButton->move(ui->RunButton->x()-5, ui->RunButton->y()); break; case Qt::Key_Right: // reload ui->RunButton->move(ui->RunButton->x()+5, ui->RunButton->y()); break; case Qt::Key_Up: // reload ui->RunButton->move(ui->RunButton->x(), ui->RunButton->y()-5); break; case Qt::Key_Down: // reload ui->RunButton->move(ui->RunButton->x(), ui->RunButton->y()+5); break; case ((Qt::Key_Down)&&(Qt::Key_Left)): // reload ui->RunButton->move(ui->RunButton->x()-15, ui->RunButton->y()+15); break; } }
Владимир Калю
Владимир Калю
2 101
Логика под поставленную задачу уже не правильная. По крайней мере, если Вы не хотите использовать платформозависимые функции.. .
Если так, то делать надо примерно следующее: все смещения объекта производить в отдельной функции, вызываемой по итерациям некоторого безконечного цикла. при этом, функция ДОЛЖНА быть асинхронной (хотя тут по другому и не напишешь) . Делаем карту состояний кнопок, либо массив на 4 байтовых элемента, либо делаем битовую маску из байтовой переменной и установками/сбросами бит управляем состояниями.. . Дальше.. . Допустим, приходит keyPressEvent на Qt::Key_Left... устанавливаем 0 элемент карты состояний в 1 (или нулевой бит маски, смотря как реализуем) . В функции, реализующей движение, проверяем, если 0 элемент установлен в 1 - двигаем влево. Точно так же надо поступись и с остальными кнопками. По событию keyReleaseEvent - скидываем флаги в 0.
И еще. В функции, реализующей движение, сначала надо проверять диагональные смешения - допустим ЕСЛИ (установлен 0 элемент и установлен елемент номер 1) - двигаемся по диагонали вверх/влево.
И так далее.
Естественно, цикл будет бесконечным, и крутиться будет постоянно. Однако из-за того, что не всегда кнопки будут нажаты, объект и двигаться не всегда будет.
Так же обращаю внимание, что ядро, которое будет обрабатывать поток с этой функцией, будет все время загружено. Но это нормально, и обусловлено той же причиной, что и загрузка в обычных играх - постоянный игровой фрейм цикл...
Юрик Пузырев
Юрик Пузырев
1 204
Лучший ответ
ИМХО, нужно и keyPressEvent и keyReleaseEvent обрабатывать