当项目的坐标改变时如何更新QGraphicsScene

时间:2019-05-04 20:04:55

标签: c++ qt

我正在QT上制作一个简单的GUI蛇游戏。头部和身体部位只是颜色不同的圆圈(头部:红色,身体:绿色)。这是我创建初始蛇的一些代码:

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

移动蛇时,其坐标也会改变,我在moveSnake()函数末尾调用locateSnake(),如下所示:

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 :(得分:0)

您应将body_QGraphicsEllipseItem*更改为QList<QGraphicsEllipseItem*>

然后,在您的locateSnake()中:

  • 只要z是列表body_中的有效索引,请使用->setPos(...)
  • ,对于(body_.size() - dots),在body_的末尾添加新的ellipseItems。