Как обновить QGraphicsScene при изменении координат элемента - PullRequest
0 голосов
/ 04 мая 2019

Я делаю простую игру со змеем с графическим интерфейсом на QT.Голова и части тела - это просто круги разного цвета (голова: красная, тело: зеленая).Вот некоторый код, который я создаю для начальной змеи:

void MainWindow::initialize() {
    dots = 3; //the initial snake will have 1 head, 2 body parts

    //This is just some random coordinates for the head and body
    for (int z = 0; z < dots; z++) {
         x[z] = 50 - z * STEP;
         y[z] = 50;
    }
    locateSnake();
    timerId = startTimer(DELAY);
}

void MainWindow::locateSnake()
{
    for (int z = 0; z < dots; z++) {
        if (z==0) {
            QBrush redBrush(Qt::red);
            QPen redPen(Qt::red);
            head_ = scene_->addEllipse(0, 0, STEP, STEP, redPen, redBrush);
            head_->setPos(x[z],y[z]);
        } else {
            QBrush greenBrush(Qt::green);
            QPen greenPen(Qt::green);
            body_ = scene_->addEllipse(0, 0, STEP, STEP, greenPen, greenBrush);
            body_->setPos(x[z],y[z]);
        }
     }
}

При перемещении змеи ее координаты также меняются, и я вызываю locateSnake () в конце функции moveSnake (), например:

void MainWindow::moveSnake() {
    for (int i = dots; i > 0; i--) {
        x[i] = x[(i - 1)];
        y[i] = y[(i - 1)];
    }

    if (left_) {
        x[0] -= STEP;
    }

    if (right_) {
        x[0] += STEP;
    }

    if (up_) {
        y[0] -= STEP;
    }

    if (down_) {
        y[0] += STEP;
    }
    locateSnake();
}

Проблема в том, что программа продолжает добавлять кружки, даже не съедая еду.Я хочу, чтобы оно каким-то образом сохраняло количество точек и изменялось только тогда, когда змея ест пищу. Это то, что моя программа запускает прямо сейчас, я хочу, чтобы она имела только 3 круга (1 красный, 2 зеленых).Есть намеки?

enter image description here

1 Ответ

0 голосов
/ 06 мая 2019

Вы должны изменить body_ с QGraphicsEllipseItem* на QList<QGraphicsEllipseItem*>.

Затем в вашем locateSnake():

  • , пока z является действительныминдекс в вашем списке body_, используйте ->setPos(...)
  • и для (body_.size() - dots) добавьте новые элементы эллипса в конец body_.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...