Qt: как заставить QGraphicsPixmapItem автоматически перемещаться по повторяющемуся маршруту - PullRequest
0 голосов
/ 03 июня 2018

Сейчас я делаю игру, и я хочу, чтобы мой QGraphicsPixmapItem автоматически перемещался слева направо и справа налево между просмотром по одному и тому же маршруту.

Чтобы быть более точным:

мой враг начинает с (0,0) и начинает движение направо (x () + 3).Когда он попадает в крайнее правое положение (800,0), он поворачивает влево и продолжает движение (x () - 3), пока не достигнет крайнего левого (0,0).Точно так же он движется направо и продолжает двигаться (x () + 3), пока не достигнет крайнего правого угла (800,0), не повернет налево и т. Д. И т. Д. По прямому и тому же маршруту.

Пока что результат таков: мой предмет остается только в крайнем правом положении и никогда не двигается.

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

предупреждение libpng: iCCP: известен неправильный профиль sRGB


Я кодирую таким образом, и этомои мысли:

  • используйте «пока», чтобы сделать это движение многократно.

  • используйте bool судья, чтобы повернуть направление движения моего предметакогда он попадает в крайний правый или крайний левый угол обзора.

  • ширина моего пиксмэпитема равна 100, поэтому я пишу x () + 100, чтобы достичь его правой стороны при попадании вкрайний правый угол обзора (ширина моего вида 800)

Есть ли что-то, что я пропускаю?Буду очень признателен за любые мысли и отладку логики, спасибо!

main window.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()));
}

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

          }
     }
}

враг.ч

#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 голосов
/ 03 июня 2018

Я просто сам разбираюсь в этом внезапно !!

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

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

...