Qt:如何让QGraphicsPixmapItem自动在重复路线

时间:2018-06-03 08:03:20

标签: c++ qt qgraphicspixmapitem

我正在制作游戏,我希望我的QGraphicsPixmapItem在我的视图之间在同一路径中自动从左到右,从右到左自动移动。

更具体一点:

  

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

到目前为止,结果是我的项目只停留在最右边,永远不会移动。

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

  

libpng警告:iCCP:已知错误的sRGB配置文件

我用这种方式编码,这些是我的想法:

  • 使用"而"为了反复这样做。

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

主窗口

#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

enemy.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());

          }
     }
}

enemy.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 个答案:

答案 0 :(得分:0)

我突然想到了自己!!

- &gt;取出&#34; while&#34;在enemy.cpp然后它可以运行。

我们不需要同时进行重复动作,因为计时器已经重复调用此功能。