Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
5 / 5 / 0
Регистрация: 14.11.2011
Сообщений: 25
1

Обработка одновременного нажатия клавиш клавиатуры

18.07.2012, 22:57. Показов 6049. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Мне необходимо написать примитивный "теннис" для двух игроков.
Для начала я отрисовал две платформы и организовал из передвижение по полю.
Код main.cpp:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include <QtGui/QApplication>
#include "base.h"
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    base w;
    w.show();
    
    return a.exec();
}
Код base.cpp:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include "base.h"
#include "ui_base.h"
#include <QKeyEvent>
#include <QPainter>
 
base::base(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::base)
{
    ui->setupUi(this);
}
 
int x1=10;
int x2=10;
 
base::~base()
{
    delete ui;
}
 
void base::keyPressEvent(QKeyEvent * keyEvent)
{
    if(keyEvent->key()==Qt::Key_Left)
    {
        x1-=10;
       // update();
    }else if(keyEvent->key()==Qt::Key_Right)
    {
        x1+=10;
       // update();
    }else if(keyEvent->key()==Qt::Key_Z)
    {
        x2-=10;
    }else if(keyEvent->key()==Qt::Key_X)
    {
        x2+=10;
    }
    update();
}
void base::paintEvent(QPaintEvent *event)
{
    QPainter DownAcr(this);
    DownAcr.setRenderHint(QPainter::Antialiasing, true);
    DownAcr.setPen(QPen(Qt::black, 2, Qt::SolidLine, Qt::RoundCap));
    DownAcr.setBrush(QBrush(Qt::green, Qt::SolidPattern));
    DownAcr.drawRect(x1, ui->centralWidget->height()-10, 100, 10);
    QPainter UpAcr(this);
    UpAcr.setRenderHint(QPainter::Antialiasing, true);
    UpAcr.setPen(QPen(Qt::black, 2, Qt::SolidLine, Qt::RoundCap));
    UpAcr.setBrush(QBrush(Qt::yellow, Qt::SolidPattern));
    UpAcr.drawRect(x2, 5, 100, 10);
    QPainter LineB(this);
    LineB.setRenderHint(QPainter::Antialiasing, true);
    LineB.setPen(QPen(Qt::red, 1, Qt::SolidLine, Qt::RoundCap));
    LineB.setBrush(QBrush(Qt::red, Qt::SolidPattern));
    LineB.drawLine(0, 15, ui->centralWidget->width()+1, 15);
    LineB.drawLine(0, ui->centralWidget->height()-10, ui->centralWidget->width()+1, ui->centralWidget->height()-10);
}
Код base.h:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#ifndef BASE_H
#define BASE_H
 
#include <QMainWindow>
 
namespace Ui {
class base;
}
 
class base : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit base(QWidget *parent = 0);
    ~base();
    
private:
    Ui::base *ui;
private slots:
    void keyPressEvent(QKeyEvent * keyEvent);
    void paintEvent(QPaintEvent *event);
 
};
 
#endif // BASE_H
В итоге все работает, платформы передвигаются, НО когда второй игрок нажимает на свои клавиши передвижения, первый игрок перестает двигаться и наоборот. Что мне необходимо сделать, что бы при нажатии клавиш двумя игроками обрабатывались оба нажатия, а не только последний?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2012, 22:57
Ответы с готовыми решениями:

Обработка нажатия клавиш
Необходимо не просто узнать какая клавиша нажата, а и знать нажата ли она в любой момент времени. ...

Имитация нажатия клавиш клавиатуры
Нужно сделать приложение эмуляции нажатия клавиш в любой программе, являющейся активной. Искал в...

Не работает обработка нажатия клавиш
Есть класс class GameApp : public QGraphicsView { Q_OBJECT private: const int winH,...

Обработка нажатия двух клавиш одновременно
нажатие одной какой то клавиши реализовал так bool MainWindow::event(QEvent *event){ if...

2
1354 / 315 / 6
Регистрация: 21.11.2009
Сообщений: 992
19.07.2012, 01:19 2
Обрабатывается только одно нажатия на клавишу, но учтите что если вы нажали на клавишу, а потом ваш сосед, то обработка вашей клавиши прекращается, а соседа начинается..

Для того чтобы запомнить какие клавиши были зажаты создайте флаги логического типа и при нажатии на клавишу меняйте их на истину.
Кроме того надо еще и обрабатывать события void keyReleasedEvent(QKeyEvent * keyEvent) где вы флаги будете менять на лож (false) когда клавишу отпустите..

Добавлено через 35 секунд
все изменения значений выполняйте в отдельной функции
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
19.07.2012, 09:12 3
или как вариант - написать своё событие, на базе KeyEvent-a и в нем хранить какие кнопки нажаты\отжаты и возвращать их в виде массива\листа\вектора...
0
19.07.2012, 09:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2012, 09:12
Помогаю со студенческими работами здесь

Обработка клавиш
Всем доброго времени суток. Нужна ваша помощь. Вообщем в кратце, чтобы была понятна идея...

Отлов нажатия клавиатуры в Linux
Здравствуйте, может ктото подсказать как сделать глобальный отлов нажатия клавиш клавиатуры? В...

QML обработка нажатия мыши
День добрый. Возникла задача работать с qml. До этого с ним не сталкивался. Задача простая как...

Обработка нажатия кнопки мыши
Друзья, начал разбираться с qt, нужна ваша помощь. Хочу обработать нажатие левой кнопки мыши на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru