我有一个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);
可能的错误和修复
- 请确保角度格式正确。Java Math类将radiens用于三角方法
- 可能会有一个恒定的旋转偏差,这取决于你想要的结果。这是一个相当简单的修复方法,因为您只需要将这个常量添加到
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));
}