Qt:如何使 QGraphicsPixmapItem 在重复路线中自动移动

Posted

技术标签:

【中文标题】Qt:如何使 QGraphicsPixmapItem 在重复路线中自动移动【英文标题】:Qt: how to make QGraphicsPixmapItem automatically move in a repeating route 【发布时间】:2018-06-03 08:03:20 【问题描述】:

我现在正在制作一个游戏,我希望我的 QGraphicsPixmapItem 在同一条路线上重复地在我的视图之间从左到右和从右到左移动。

更具体一点:

我的敌人从 (0,0) 开始,它从向右 (x()+3) 开始。当它碰到最右边(800,0)时,它会转向左边并继续移动(x()-3)直到 它击中最左边(0,0)。同样,它向右行驶并继续移动 (x()+3) 直到它碰到最右边的 (800,0),它向左转,依此类推,以此类推 同一条路线。

到目前为止,结果是我的物品只停留在最右边,从不移动。

我唯一的线索是它在我的“应用程序输出”中有这个警告,但我想这可能不是这个错误的重点。

libpng 警告:iCCP:已知不正确的 sRGB 配置文件


我是这样编码的,这些是我的想法:

使用“while”来重复移动。

使用 bool 判断在我的物品击中时转动它的移动方向 视图的最右边或最左边。

我的 pixmapitem 的宽度是 100,所以我写 x()+100 以达到 当点击视图的最右侧时它的右侧。(我的视图的宽度是 800)

我有什么遗漏吗?非常感谢任何想法分享或逻辑调试,谢谢!

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent):
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    scene(new QGraphicsScene(0,0,800,600)),
    enemyMoveTimer(new QTimer)

    ui->setupUi(this);
    ui->graphicsView->setScene(scene);

    //enemy
    Enemy * enemy = new Enemy();
    enemy->setPixmap(QPixmap(QPixmap(":/img/ghost.gif").scaled(100,100)));
    enemy->setPos(0,0);
    scene->addItem(static_cast<QGraphicsPixmapItem*>(enemy));

    enemyMoveTimer->start(100);
    enemy->connect(enemyMoveTimer, SIGNAL(timeout()), enemy, SLOT(enemyMove()));

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QTimer>

#include "enemy.h"


namespace Ui 
class MainWindow;


class MainWindow : public QMainWindow

    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QGraphicsScene *scene;
    QTimer *enemyMoveTimer;
;

#endif // MAINWINDOW_H

敌人.cpp

#include "enemy.h"

Enemy::Enemy()




void Enemy::enemyMove()

     while(x()>=0 && x()+100<=800)
     
         if(judge==0)
         
             if (x()+100==800)
                 judge=1;

             else
                 setPos(x() +3,y());
          

         else if(judge==1)
          
             if (x()==0)
                 judge=0;

             else
                 setPos(x() -3,y());

          
     

敌人.h

#ifndef ENEMY_H
#define ENEMY_H

#include <QObject>
#include <QGraphicsPixmapItem>
#include <QTimer>

class Enemy: public QObject,public QGraphicsPixmapItem

    Q_OBJECT

public:
    Enemy();


public slots:
    void enemyMove();

private:
      bool judge = 0;
;

#endif // ENEMY_H

【问题讨论】:

【参考方案1】:

我自己突然想通了!!

-->将enemy.cpp中的“while”去掉就可以运行了。

我们不需要while来做重复动作,因为定时器已经重复调用了这个函数。

【讨论】:

以上是关于Qt:如何使 QGraphicsPixmapItem 在重复路线中自动移动的主要内容,如果未能解决你的问题,请参考以下文章

如何使Qt小部件可调整大小[重复]

如何使 Qt 小部件淡入或淡出?

如何使 Qt5.13.1 中的 QSerialPort 工作?

如何在 Qt 设计器中使控件自动调整大小?

如何使布局填充qt选项卡小部件内的所有内容?

如何使用qt在mac中使标签窗口从顶部滑动?