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