سؤال

I'm trying to create a game on Qt where the player can go diagonally. So when I press W and D, the player can go to the upper right hand corner. However, when I press W first, then D, then release D, the player does not go in the W direction. In fact, the holding of the W key isn't even being signaled to call the keypressevent() function. However, when I press W, then D, and then release W, the character goes in the D direction.

Here are my codes:

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;
    }
}

I'm not sure how to proceed through this problem. Any ideas or links to help me would be great. Thank you in advance.

هل كانت مفيدة؟

المحلول

You would need something like this:

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();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top