在Qt中移动Snake时遇到问题

时间:2019-04-19 18:26:14

标签: c++ qt

我正在与Qt创作者一起做我的第一个蛇游戏,而且我在一个问题上困扰了很长时间。我在QGraphicsScene中使用QGraphicsPixmapItem。

蛇头应该不同于其他身体。现在,我需要删除场景中的所有项以绘制蛇的新位置以使其正常工作,但是我认为这不是正确的编码方式。

我应该如何更新蛇而不需要一直删除QGraphicsPixmapItems?

标题

struct Point{
    int x;
    int y;
};

std::vector<Point> snakecore_;

QGraphicsPixmapItem* head_ = nullptr;
QGraphicsPixmapItem* core_ = nullptr;

cpp

delete head_

for(unsigned int i = 0; i < snakecore_.size(); ++i){
        if(i == 0){
            head_ = scene_.addPixmap(red_);
            head_->setPos(snakecore_[i].x, snakecore_[i].y);
        }
        //Add rest of the snake
}

2 个答案:

答案 0 :(得分:0)

您的问题尚不清楚,但是您无需从场景中删除项目即可移动图形项目。只需在每个项目上设置一个新位置即可。他们将自动移动并在新位置重新绘制。

首先创建head和body项目(必须已经做过),然后不需要“删除head_”或addPixmap。只需设置位置即可。

答案 1 :(得分:0)

移动蛇非常简单:将头部向所需方向移动。然后,将每个零件移到上一个零件的位置。

使用QGraphicsGroupItem来创建您的蛇,处理零件会更简单。

例如:

class Snake: public QGraphicsItemGroup
{
public:
    enum Direction
    {
        Left,
        Right
    };

    Snake(QGraphicsItem* parent=nullptr): QGraphicsItemGroup(parent), partCount(10)
    {
        int const partCount = 10;
        for( int i = 0; i != partCount; ++i)
        {
            QGraphicsRectItem* part = new QGraphicsRectItem(QRectF(0, 0, 10, 10), this);
            part->setPos((partCount - i) * 10, 0); // Create a snake from left to right
            parts << part;
        }
    }

    void move(Direction direction)
    {
        QPointF const offset = getOffset(direction);
        QPointF previousPartPosition = parts.first()->pos();
        parts.first()->setPos(parts.first()->pos() + offset);
        for( int i = 1; i != partCount; ++i)
        {
            QGraphicsRectItem* part = parts.at(i);
            QPointF const partPosition = part->pos();
            part->setPos(previousPartPosition);
            previousPartPosition = partPosition;
        }
    }

    QPointF getOffset(Direction direction)
    {
        switch (direction) {
        case Right:
            return QPointF(10, 0);
        case Left:
            return QPointF(-10, 0);
        }
    }
private:
    QList<QGraphicsRectItem*> parts;
    int partCount;
};