我正在与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
}
答案 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;
};