2

当我旋转发射子弹的飞船时,我在更新子弹的位置时遇到了问题。目前,代码几乎可以工作,只是在大多数角度,子弹不是从我想要的地方发射的。有时它会比它应该在的中心稍微向上发射,有时会向下发射。我很确定这与三角函数有关,但我很难找到问题所在。

这段代码在构造函数中;它根据船的位置 ( sp.position) 和旋转 ( Controls.rotation) 设置子弹的初始位置和旋转:

this.backgroundRect = new RotatedRectangle(Rectangle.Empty, Controls.rotation);
//get centre of ship
this.position = new Vector2(sp.getPosition().X + sp.getTexture().Width/2, 
(sp.getPosition().Y + sp.getTexture().Height / 2));

//get blast pos
this.position = new Vector2((float)(this.position.X + (sp.getTexture().Width / 2 * 
Math.Cos(this.backgroundRect.Rotation))), (float)(this.position.Y + 
(sp.getTexture().Width / 2 * Math.Sin(this.backgroundRect.Rotation))));

//get blast pos + texture height / 2
this.position = new Vector2((float)(this.position.X + (this.texture.Height / 2 * 
Math.Cos(this.backgroundRect.Rotation))), (float)(this.position.Y + 
(this.texture.Height / 2 * Math.Sin(this.backgroundRect.Rotation))));
        
this.backgroundRect = new RotatedRectangle(new Rectangle((int)this.position.X, 
(int)this.position.Y, this.texture.Width, this.texture.Height), Controls.rotation);
speed = defSpeed;

然后在更新方法中我使用以下代码;我很确定这可以正常工作:

this.position.X = this.position.X + defSpeed * 
(float)Math.Cos(this.getRectangle().Rotation);
this.position.Y = this.position.Y + defSpeed * 
(float)Math.Sin(this.getRectangle().Rotation);
this.getRectangle().CollisionRectangle.X = (int)(position.X + defSpeed * 
(float)Math.Cos(this.getRectangle().Rotation));
this.getRectangle().CollisionRectangle.Y = (int)(position.Y + defSpeed * 
(float)Math.Sin(this.getRectangle().Rotation));
    

另外我应该提到,当我旋转它时,我的船没有正常工作,因为原点(旋转中心)是(0,0)。为了解决这个问题,我将原点更改为船的中心(宽度/2,高度/2),并将这些值添加到绘图矩形中,以便精灵可以正确绘制。我想这可能是问题所在,并认为有更好的方法来解决这个问题。顺便说一下,游戏是2D的。

4

1 回答 1

1

问题是精灵没有绘制在它们应该在的位置上。在计算中心位置时,您假设精灵没有旋转。这会引起一些麻烦。此外,旋转任意向量并不像您做的那么容易。当向量在 x 轴上时,您只能通过将其分量乘以 sin/cos 来旋转向量。

以下是旋转任意向量的方法:

Vector2 vecRotate(Vector2 vec, double phi)
{
    double length = vec.Length(); //Save length of vector
    vec.Normalize();
    double alpha = Math.Acos(vec.X); //Angle of vector against x-axis
    if(vec.Y < 0)
        alpha = 2 * Math.PI - alpha
    alpha += phi;
    vec.X = Math.Cos(alpha) * length;
    vec.Y = Math.Sin(alpha) * length;
    return vec;
}

确保角度以弧度为单位。有了它,您可以计算船的正确位置:

Vector2 ShipCenter = sp.Position() + vecRotate(new Vector2(sp.getTexture().Width/2, sp.getTexture().Height/2), Controls.Rotation);

您可以使用相同的函数来确定子弹中心的位置。我不完全知道,你想把子弹放在哪里。我假设它位于右边缘的中心:

Vector2 offset = new Vector2(sp.getTexture.Width/2, 0);
this.position = ShipCenter + vecRotate(offset, Controls.Rotation);

如果你再需要子弹左上角的位置,你可以更进一步:

this.position -= vecRotate(new Vector2(this.texture.Width/2, this.texture.Height/2), Controls.Rotation)

但是,正如我所说,将船和子弹的位置作为中心位置可能更容易处理。这样做,您需要的三角函数要少得多。

于 2012-04-17T07:54:19.583 回答