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