Сейчас я делаю игру и хочу, чтобы мой QGraphicsPixmapItem автоматически перемещался слева направо и справа налево между моим представлением неоднократно по одному и тому же маршруту.
Чтобы быть более конкретным:
мой враг начинает с (0,0), и он начинает движение вправо (x()+3). Когда он достигает крайнего правого угла (800,0), он поворачивает налево и продолжает двигаться (x()-3), пока не достигнет крайнего левого угла (0,0). Точно так же он направляется вправо и продолжает движение (x()+3), пока не достигнет крайней правой точки (800,0), поворачивает налево и так далее и так далее по прямому и тому же маршруту.
На данный момент результат таков, что мой элемент остается только в крайнем правом углу и никогда не перемещается.
И моя единственная подсказка заключается в том, что в моем «выводе приложения» есть это предупреждение, но я думаю, что это, вероятно, не причина этой ошибки.
Предупреждение libpng: iCCP: известен неверный профиль sRGB
Я кодирую таким образом, и вот мои мысли:
используйте «пока», чтобы повторять это движение.
используйте логическую оценку, чтобы изменить направление движения моего предмета, когда он попадает в крайний правый или крайний левый угол обзора.
ширина моего 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