如何将到达图形视图右侧(末端)的 QGraphicsPixmapItem 移动到左侧(开始)侧(就像蛇游戏中发生的事情)

Posted

技术标签:

【中文标题】如何将到达图形视图右侧(末端)的 QGraphicsPixmapItem 移动到左侧(开始)侧(就像蛇游戏中发生的事情)【英文标题】:How can I move a QGraphicsPixmapItem that reachs the right (end) of graphicView to the left (begining) side(like what is happening in the snake game) 【发布时间】:2018-09-25 03:11:22 【问题描述】:

我有一个显示像素图项目的 QGraphicsView 小部件。用户可以移动项目。当项目到达图形视图的右(或左)端时,我希望项目从另一侧进入(具有相同的 X 和 Y 坐标(就像蛇游戏中发生的那样)

【问题讨论】:

您需要在像素图项目上调用 setPos() 并使用您要将其移动到的坐标。 抱歉,我的意思不是移动 pixmapItem! 【参考方案1】:

解决方案

在设置像素图的位置时,检查它是否小于scene rectangle的宽度 - 像素图的宽度,如果是not,将位置设置为zero

注意:如果您朝相反方向移动,请进行类似的检查,即将像素图的位置设置为场景矩形的宽度 - 像素图的宽度,如果它不大于像素图的宽度

示例

这是我为您准备的一个最小示例,用于演示如何实施建议的解决方案:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)

    QPixmap pixmap(64, 64);
    auto *view = new QGraphicsView(this);
    auto *item = new QGraphicsPixmapItem(pixmap);
    auto *animation = new QVariantAnimation(this);

    view->setScene(new QGraphicsScene(this));
    view->setAlignment(Qt::AlignLeft | Qt::AlignTop);
    view->setSceneRect(0, 0, 300, 200);
    view->scene()->addItem(item);

    setCentralWidget(view);
    resize(302, 202);

    connect(animation, &QVariantAnimation::valueChanged, [view, item]()
        int x = item->x();

        if (x < (view->sceneRect().width() - item->pixmap().width()))
            item->setX(x + 1);
        else
            item->setX(0);
    );

    animation->setStartValue(0);
    animation->setEndValue(1000);
    animation->setDuration(10000);
    animation->start();

我准备的更全面的贪吃蛇游戏示例的代码可在GitHub 上找到。

【讨论】:

@Abalfazl Moridi,你试过这个吗? 我想把从左边到右边的部分图像只输入到左边的一部分。

以上是关于如何将到达图形视图右侧(末端)的 QGraphicsPixmapItem 移动到左侧(开始)侧(就像蛇游戏中发生的事情)的主要内容,如果未能解决你的问题,请参考以下文章

如何在卡片标题html中将下拉列表移动到右侧末端

使用jquery的无限响应轮播/滑块

iOS:容器视图中的 3 个动态对象之间具有相等的空间

X-CODE IDE显示错误:“控制到达末端非void函数中”

居中:在边界到容器末端之后? [复制]

如何以编程方式将 UIView 粘贴到其超级视图的右侧