Qt несколько ключей в keypressevent ()

Я пытаюсь создать игру на Qt, где игрок может идти по диагонали. Поэтому, когда я нажимаю W и D, игрок может перейти в верхний правый угол. Однако, когда я сначала нажимаю W, затем D, затем отпускаю D, игрок не идет в направлении W. На самом деле, нажатие клавиши W даже не сигнализирует о вызове функции keypressevent ().
Однако, когда я нажимаю W, затем D, а затем отпускаю W, персонаж идет в направлении D.

Вот мои коды:

void my_qscroll::keyPressEvent(QKeyEvent *event)
{
switch ( event->key() )
{
case Qt::Key_W:
key[0] = 1;
break;
case Qt::Key_A:
key[1] = 1;
break;
case Qt::Key_S:
key[2] = 1;
break;
case Qt::Key_D:
key[3] = 1;
break;
}

for(int i = 0; i != 4 ; i++)
{
if(key[i] == 1)
{
this->B = i;
emit Move();
}
}
}

void my_qscroll::keyReleaseEvent(QKeyEvent *event)
{
switch ( event->key() )
{
case Qt::Key_W:
key[0] = 0;
qDebug() << "released W";
break;
case Qt::Key_A:
key[1] = 0;
qDebug() << "released A";
break;
case Qt::Key_S:
key[2] = 0;
qDebug() << "released S";
break;
case Qt::Key_D:
key[3] = 0;
qDebug() << "released D";
break;
}
}

Я не уверен, как справиться с этой проблемой. Любые идеи или ссылки, чтобы помочь мне было бы здорово. Заранее спасибо.

1

Решение

Вам нужно что-то вроде этого:

void my_qscroll::keyPressEvent(QKeyEvent *event)
{
switch ( event->key() )
{
case Qt::Key_W:
key[0] = 1;
break;
case Qt::Key_A:
key[1] = 1;
break;
case Qt::Key_S:
key[2] = 1;
break;
case Qt::Key_D:
key[3] = 1;
break;
}

for(int i = 0; i != 4 ; i++)
{
if(key[i] == 1)
{
this->B = i;
emit Move();
}
}
}

void my_qscroll::keyReleaseEvent(QKeyEvent *event)
{
switch ( event->isAutoRepeat() )
{
case Qt::Key_W:
key[0] = 0;
qDebug() << "released W";
break;
case Qt::Key_A:
key[1] = 0;
qDebug() << "released A";
break;
case Qt::Key_S:
key[2] = 0;
qDebug() << "released S";
break;
case Qt::Key_D:
key[3] = 0;
qDebug() << "released D";
break;
}
}

void my_qscroll::movePlayer() {
if (key[1] && key[0]) {
left -= 2;
top -= 2;
} else if (key[3] && key[0]) {
left += 2;
top -= 2;
} else if (key[2] && key[1]) {
left -= 2;
top += 2;
} else if (key[2] && key[3]) {
left += 2;
top += 2;
} else if (key[3]) {
left += 2;
} else if (key[1]) {
left -= 2;
} else if (key[2]) {
top += 2;
} else if (key[0]) {
top -= 2;
}
}

void myCanvas::updateEnv() {
emit Move();
repaint();
}
1

Другие решения


По вопросам рекламы [email protected]