首页 > 解决方案 > 在 Qt 中移动 Snake 时遇到问题

问题描述

我正在与 Qt creator 一起做我的第一个蛇游戏,我在一个问题上被困了很长时间。我在 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
}

标签: c++qt

解决方案


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

使用 aQGraphicsGroupItem创建你的蛇,处理部件会更简单。

例如:

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

推荐阅读