c++ - 在 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
}
解决方案
移动蛇非常简单:将头部朝所需的方向移动。然后,将每个部分移动到前一个部分的位置。
使用 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;
};
推荐阅读
- python - 多处理管理器酸洗失败
- javascript - Typescript 通用函数类型文字
- mysql - SQL AVERAGE 查询 - 从列 city 中查找订单总值的平均值
- python - tf.nn.conv2d 和 keras.layers.Conv2D 的输出不相等
- pandas - 如何在读取 csv 文件时跳过偶数/奇数行?
- ios - SwiftUI 拖动手势跳转
- c - 附加 ADT 列表段错误
- sql-server - SQL Server 中处理 HMAC-SHA256 加密的函数?
- c++ - 为什么无限循环
- reactjs - 我的网络响应显示在控制台中,但不会保存到我的变量中