从矩形所面对的方向射出子弹



我有一个Rectangle对象,它被放置在屏幕上并使用paintComponent进行渲染。我还有一个rotation变量,它确定对象的旋转(使用左右键旋转(,并使用仿射变换在屏幕上重新绘制对象。

在按键方法中,我有这个可以让我发射子弹:

else if(key == KeyEvent.VK_SPACE) {
Bullet b = new Bullet(handler, player.x + 10, player.y - 10, ID.Bullet);
handler.addObject(b);
b.setDY(-3*Math.cos(player.rotation));
b.setDX(3*Math.sin(player.rotation));
}

如果您看到我在哪里创建新项目符号,在第二行中,新项目符号((中的第二个和第三个参数决定了项目符号的创建位置。目前,他们只是从矩形上的同一位置拍摄,而不考虑旋转。

我没能让球员从他们面对的方向开枪,所以如果有人有任何建议,那将非常有帮助。

所以基本上你是在试图从玩家的位置找到偏移向量。

让我们假设,当您没有旋转对象时,您有偏移向量。然后,您的任务将是通过rotation变量旋转给定的Vector。


要做到这一点,我们首先需要稍微研究一下几何体。让我们把一个二维向量想象成一个三角形,我们可以把它分成x和y分量。我们知道,旋转后的向量应该具有与原始偏移相同的假设长度,或者换句话说,具有相同的大小。

这意味着:

x₀²+y₀²=x₁²+y₁²

自:

x²+y²=矢量幅度

您的rotation变量跟踪";三角形矢量";因此我们可以将长度描述为:

x=sin(rotation(*矢量幅度

y=cos(rotation(*矢量幅值


现在唯一要做的就是评估这些值。要做到这一点,让我们进入代码,好吗?

float magnitude = offset.x*offset.x + offset.y*offset.y;
float x = Math.sin(rotation) * magnitude;
float y = Math.cos(rotation) * magnitude;
Bullet b = new Bullet(handler, player.x + x, player.y + y, ID.Bullet);

可能的错误和修复

  1. 请确保角度格式正确。Java Math类将radiens用于三角方法
  2. 可能会有一个恒定的旋转偏差,这取决于你想要的结果。这是一个相当简单的修复方法,因为您只需要将这个常量添加到rotation变量中。在不太可能的情况下,您可能还需要在代码中使用rotation的地方使用-rotation来否定rotation变量

如果您知道矩形的旋转角度和宽度,那么也可以使用此信息来旋转项目符号的起始位置。例如,让起始位置在右侧:

x=rectMiddleX+宽度/2*cos(角度(
y=rectMiddle y+宽度/2*sin(角度(

如果角度为0,它将从右侧开始

else if(key == KeyEvent.VK_SPACE) {
Bullet b = new Bullet(handler, player.x + width/2 * cos(player.rotation), player.y - width/2 * sin(player.rotation), ID.Bullet);
//if player.x/y is in corner, add width/2 / height/2
handler.addObject(b);
b.setDY(-3*Math.cos(player.rotation));
b.setDX(3*Math.sin(player.rotation));
}

相关内容

  • 没有找到相关文章

最新更新