我正在制作游戏,我希望我的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
答案 0 :(得分:0)
我突然想到了自己!!
- &gt;取出&#34; while&#34;在enemy.cpp然后它可以运行。
我们不需要同时进行重复动作,因为计时器已经重复调用此功能。