gpt4 book ai didi

c++ - 在 Qt 中移动 Snake 时遇到问题

转载 作者:行者123 更新时间:2023-11-30 04:48:33 25 4
gpt4 key购买 nike

我正在用 Qt creator 做我的第一个贪吃蛇游戏,我在一个问题上被困了很长时间。我在 QGraphicsScene 中使用 QGraphicsPixmapItem。

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

我想如何在不需要一直删除 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
}

最佳答案

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

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

关于c++ - 在 Qt 中移动 Snake 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55766179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com