我正在进行塔防游戏并试图从炮塔射击弹丸。炮塔的精灵我看起来像这样
我想做的是让炮塔击中子弹到某一点(例如attackDestination = QPointF(1000, 500);
为此,我有一个类Bullet,插槽move
:
void Bullet::move()
{
int stepSize = 20; // how fast the bullet moves
double angle = rotation();
double dy = stepSize * qSin(qDegreesToRadians(angle)); // The X that needs to be moved
double dx = stepSize * qCos(qDegreesToRadians(angle)); // The Y that needs to be moved
setPos(x() + dx, y() + dy);
}
由QTimer触发。
我在Tower类中也有一个插槽(代表炮塔)
void Tower::attackTarget()
{
Bullet *bullet = new Bullet();
//getWidthMap() returns the width of the tower
//getHeightMap() returns the height of the tower
bullet->setPos(x() + getWidthMap() /2, y());
QLineF line(QPointF(x() + getWidthMap() /2, y()), attackDestination);
double angle =(-1) * line.angle();
bullet->setRotation(angle);
this->setRotation(90 + angle);
game->scene->addItem(bullet);
}
我将炮塔旋转了+90度,因为它的初始位置是垂直的,它需要与子弹一样形成一个角度(与oX一致的角度)。顺时针旋转。
问题在于攻击时子弹相对于炮塔的位置。
没有行this->setRotation(90 + angle);
(第一张图片),有了它(第二张图片)
如您所见,子弹从炮塔的初始位置开始(当它没有旋转时),因为pos()函数保持初始X和Y.我该如何解决?