我从这个论坛搜索并实现了一些东西,它没有出来。
我想要实现的是为玩家子弹计算相对于spawnPoint
和position
的{{1}}。
rotation
应该和他的spawnPoint
(播放器默认设置为指向右侧)和X + his width
(从y + height/2
的中心产生轴)。
这是我从这个论坛得到的:
Y
this.bulletSpawn.x = (float)(this.position.x + this.width/2 + this.width * Math.cos(rotation));
this.bulletSpawn.y = (float)(this.position.y + this.height/2 + this.height/2 * Math.sin(rotation));
位于Radians中。 rotation
是this
类。
图片展示了我期望发生的事情:
红点是我想知道玩家Player
和spawnPoint
的{{1}}。
玩家Sprite是旋转的,它旋转与他的中心x和y相关,这是用lib完成的,我没有这些变量。整个箭头是玩家,箭头方向是玩家指向的位置,红点是bulletSpawn点(或预期的点)
使用我发布的代码,子弹似乎是从其他地方产生的。即使在开始时他们也有一个偏移量,当我旋转玩家时,position
似乎与我所期望的不同来源相关。
这是子弹位置代码:
rotation
这是在spawnPoint
课程内。 position.x = holder.bulletSpawn.x - (float)(this.width/2 * holder.rotation);
position.y = holder.bulletSpawn.y - (float)(this.height/2 * holder.rotation);
变量是Bullet
position
,Vector2
是播放器实例。此代码仅用于为子弹在其自身大小的中心生成一个偏移量
我添加了一些与注释相关的修正,但子弹仍然有一个微小的偏移,在某些角度看起来不对。 基本上我想要的距离是玩家的宽度,他的中心y是身高/ 2。
答案 0 :(得分:0)
我们的初始位置是X0, Y0
,旋转大约是中心点CX, CY
,旋转角度是Theta
。所以轮换后的新位置是:
NX = CX + (X0-CX) * Cos(Theta) - (Y0-CY) * Sin(Theta)
NY = CY + (X0-CX) * Sin(Theta) + (Y0-CY) * Cos(Theta)
该方程描述了关于中心点的任意点旋转的仿射变换,仿射矩阵是平移,旋转和反向平移矩阵的组合。
关于中心CX,CY - 您写的
它与左下角的x和y原点相关地旋转
关于初始点坐标 - 对于子弹似乎是
X + Width, Y + Height/2
答案 1 :(得分:0)
快捷扩展名:
extension CGSize {
static func offsetFrom(angle:CGFloat, distance:CGFloat) -> CGSize {
let rad = angle * CGFloat.pi / 180
return CGSize(width: sin(rad) * distance, height: cos(rad) * distance)
}
}