Как продолжать стрелять пулями в игре QT

мой вопрос в том, как продолжать стрелять пулями в моей игре. Я могу выстрелить 1 пулей, а затем получаю сообщение QGraphicsScene::addItem: элемент уже добавлен в эту сцену. Я прочитал несколько сообщений на аналогичную тему, однако объяснение не решило мою проблему. Вот мои фрагменты кода. Я понимаю, что предмет уже добавлен, но как это обойти и продолжать стрелять пулями? Будем очень признательны за любую помощь или пример кода.

void LevelOne::keyPressEvent(QKeyEvent *event) {
    if (event->isAutoRepeat())
            return;

    switch (event->key()) {

    case Qt::Key_F:     
       addItem(bullet);          // Add the bullet
        break;
    case Qt::Key_Space:     

        break;
    default:
        break;
    }
}


void LevelOne::initPlayField() {

    bullet = new Bullet() ;
    bullet->setPos(m_player->pos().x(),  m_player->pos().y()
}

person equati0n    schedule 28.02.2017    source источник
comment
Если вы знаете, что пули имеют конечный срок службы и есть какое-то максимальное количество пуль, вы можете заранее выделить их столько (поле LevelOne Bullet bullets[MAX_BULLETS];, вероятно, будет работать с некоторыми std::bitset<MAX_BULLETS> firedBullets;), а затем повторно использовать запасные из массива. для стрельбы. Приведенный ниже ответ требует, чтобы вы удалили пулю после того, как это будет сделано со всеми, что окажет некоторое давление на управление динамической памятью (много небольших фрагментов памяти размером с пулю, которые часто выделяются и освобождаются). Это не проблема с простой игрой, но в играх ААА это было бы проблемой.   -  person Ped7g    schedule 08.08.2017


Ответы (1)


Я понимаю, что вы хотите выбрасывать пули, когда нажимаете клавишу F, каждая пуля новая, поэтому вы должны каждый раз создавать этот объект.

void LevelOne::keyPressEvent(QKeyEvent *event) {
    if (event->isAutoRepeat())
            return;

    switch (event->key()) {

    case Qt::Key_F:
       Bullet *obj = new Bullet();
       obj->setPos(m_player->pos().x(),  m_player->pos().y()
       addItem(obj);          // Add the bullet
       break;
    case Qt::Key_Space:     

        break;
    default:
        break;
    }
}
person eyllanesc    schedule 28.02.2017