2016-04-28 192 views
0

我从这个论坛搜索和实施的东西,它不出来的权利。 我想要实现的是计算玩家子弹相对于他的positionrotationspawnPoint如何从角度和距离中计算出一个点?

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)); 

rotation为弧度。 thisPlayer类。

图像,显示了我所期望的发生:

红点是spawnPoint我想知道计算玩家positionrotation。 玩家Sprite是旋转的东西,它旋转与他的中心x和y有关,这是用lib完成的,我没有这些变量。整个箭头将是玩家,箭头方向是玩家指向的地方,红点将是子弹点(或预期点)

使用我贴的代码,子弹似乎是产卵从别的地方。即使在开始时他们有一个偏移量,当我旋转播放器时,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,并且holder是玩家实例。此代码仅仅是为了让子弹在其自身尺寸的中心产生偏移

我添加了一些与注释相关的修复,但子弹仍然有一个微小的偏移,在某些角度看起来不对。 基本上我想得到的距离是玩家的宽度,他的中心y是高度/ 2。

+0

他旋转哪个点?箭头的开始?第二张图片的旋转会是什么? – Keiwan

+1

跳到我头上的第一件事是,第一个代码段使用'this.width',但第二个使用'this.width/2'。似乎你有一个不同的参考点。 – andand

+0

此外,确切了解其对于给定角度和位置的行为将会很有用。 – andand

回答

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 
+0

请添加一些解释,我不喜欢复制粘贴。当你说初始位置时,谁的初始位置?玩家? bulletspawn?如果你指的是你指的是他的抽签点, (意思是他在精灵矩形上的0,0)。更重要的是,如果你可以将它与我发布的代码联系起来,它会更好。 – rufoDev

+0

实际上,Sprite在矩形的中心旋转,但我没有这个变量,它从库中这样做。我所拥有的是从左下角坐标绘制的原点。所以我现在需要的是计算矩形的中心,包括它的旋转,所以我可以在你的CX和CY中使用它。我有精灵左边,底部coorindate在屏幕上,旋转角度,我有它的宽度和高度 – rufoDev

+0

基本上与您的解决方案我需要计算CX和CY,我也需要帮助,如果你可以借我一只手 – rufoDev