Qt: как заставить QGraphicsPixmapItem автоматически перемещаться по повторяющемуся маршруту

Сейчас я делаю игру, и я хочу, чтобы мой 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

0

Решение

Я просто понял это сам!

—> Убери «while» в враге.cpp, тогда оно может запуститься.

нам не нужно время, чтобы сделать повторное движение, потому что таймер уже вызывал эту функцию несколько раз.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]