2014-04-18 46 views
0

在我的遊戲中,我想從火箭發射器發射火箭。玩家持有火箭發射器作爲兒童物品。火箭必須是無人的。我想定位的火箭,以便其背臺詞了火箭發射器的背面(玩家朝北的截圖),並在其水平居中:在另一個場景項目下放置無父母場景項目

correct

相反,我「m到處是:

incorrect

旋轉也是不正確的(運行例子,移動鼠標光標移動到明白我的意思)。我的代碼在哪裏出錯?

#include <QtWidgets> 

QPointF moveBy(const QPointF &pos, qreal rotation, float distance) 
{ 
    return pos - QTransform().rotate(rotation).map(QPointF(0, distance)); 
} 

float directionTo(const QPointF &source, const QPointF &target) { 
    QPointF toTarget(target.x() - source.x(), target.y() - source.y()); 
    float facingTarget = qRadiansToDegrees(atan2(toTarget.y(), toTarget.x())) + 90.0f; 
    facingTarget = fmod(facingTarget, 360.0f); 
    if(facingTarget < 0) 
     facingTarget += 360.0f; 
    return facingTarget; 
} 

class Controller : public QObject 
{ 
public: 
    Controller(QGraphicsScene *scene) : 
     mScene(scene) 
    { 
     mPlayer = scene->addRect(0, 0, 25, 25, QPen(Qt::blue)); 
     mPlayer->setTransformOriginPoint(mPlayer->boundingRect().width()/2, mPlayer->boundingRect().height()/2); 

     mRocketLauncher = scene->addRect(0, 0, 16, 40, QPen(Qt::green)); 
     mRocketLauncher->setParentItem(mPlayer); 
     mRocketLauncher->setPos(mPlayer->boundingRect().width() * 0.9 - mRocketLauncher->boundingRect().width()/2, 
      -mRocketLauncher->boundingRect().height() * 0.3); 

     mRocket = scene->addRect(0, 0, 16, 20, QPen(Qt::red)); 
     scene->installEventFilter(this); 

     QGraphicsTextItem *playerText = scene->addText("Player"); 
     playerText->setPos(0, 100); 
     playerText->setDefaultTextColor(Qt::blue); 
     QGraphicsTextItem *rocketLauncherText = scene->addText("Rocket launcher"); 
     rocketLauncherText->setPos(0, 120); 
     rocketLauncherText->setDefaultTextColor(Qt::green); 
     QGraphicsTextItem *rocketText = scene->addText("Rocket"); 
     rocketText->setPos(0, 140); 
     rocketText->setDefaultTextColor(Qt::red); 
    } 

    bool eventFilter(QObject *, QEvent *event) { 
     if (event->type() == QEvent::GraphicsSceneMouseMove) { 
      const QGraphicsSceneMouseEvent *mouseEvent = static_cast<QGraphicsSceneMouseEvent*>(event); 
      mPlayer->setRotation(directionTo(mPlayer->sceneBoundingRect().center(), mouseEvent->scenePos())); 

      qreal rocketX = mRocketLauncher->sceneBoundingRect().center().x() - mRocket->boundingRect().width()/2; 
      QPointF rocketPos(rocketX, 0); 
      rocketPos = moveBy(rocketPos, mPlayer->rotation(), mRocketLauncher->boundingRect().height() - mRocket->boundingRect().height()); 
      mRocket->setPos(rocketPos); 
      mRocket->setRotation(mPlayer->rotation()); 

      return true; 
     } 
     return false; 
    } 
private: 
    QGraphicsScene *mScene; 
    QGraphicsRectItem *mPlayer; 
    QGraphicsRectItem *mRocketLauncher; 
    QGraphicsRectItem *mRocket; 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    QGraphicsView view; 
    view.setMouseTracking(true); 
    QGraphicsScene *scene = new QGraphicsScene; 
    view.setScene(scene); 

    Controller controller(scene); 

    view.resize(300, 300); 
    view.show(); 

    return app.exec(); 
} 

回答

1

的想法是:這兩個項目的

  1. 設定的旋轉;
  2. 在全局(場景)座標中獲取發射器和火箭左下角的位置;
  3. 移動火箭使positinos平等。

代碼:

mPlayer->setRotation(directionTo(mPlayer->sceneBoundingRect().center(), 
           mouseEvent->scenePos())); 
mRocket->setRotation(mPlayer->rotation()); 
QPointF launcherPos = mRocketLauncher->mapToScene(
    mRocketLauncher->boundingRect().bottomLeft()); 
QPointF currentRocketPos = mRocket->mapToScene(
    mRocket->boundingRect().bottomLeft()); 
mRocket->setPos(mRocket->pos() - currentRocketPos + launcherPos); 
+0

偉大的答案,謝謝!我已經澄清了我注意到我沒有提及的一部分問題,那就是:我怎樣才能將火箭水平放置在發射器中?例如,如果你將火箭的寬度減半:'mRocket = scene-> addRect(0,0,8,20,QPen(Qt :: red));' – Mitch

+0

使用'QPointF(mRocketLauncher-> boundingRect()。 center()。x(),mRocketLauncher-> boundingRect()。bottom())'(對於發射器和火箭)似乎都有效。 :) – Mitch

相關問題