将一个Path对象(箭头)朝向屏幕上的另一个对象(位图)



我已经接近了,但是还有一些问题。

这是我绘制箭头的当前代码。路径创建包含。

{//gets done just once to create the arrow
oBlipPath.moveTo(0, -5);
oBlipPath.lineTo(5, 0);
oBlipPath.lineTo(0, 5);
}
{//run in a for loop for every enemy (i)    
canvas.save();
canvas.translate(iWidth / 2, iHeight / 2);
canvas.rotate((float)Math.toDegrees(Math.atan2((oEnemies[i].getEnemyCenterY()-worldY)-user.getShipCenterY(), (oEnemies[i].getEnemyCenterX()-worldX)-user.getShipCenterX())));
canvas.drawPath(oBlipPath, oBlipPaint);
canvas.restore();
}

为了提供一点上下文,user是位于屏幕中央的玩家。敌人是供玩家在屏幕上和屏幕外射击的对象。

我想做的是在玩家周围创造一种雷达。微小的小箭头显示的方式去摧毁所有的对象和完成任务。

正如我在之前的帖子中提到的,我很擅长逻辑,但在数学上绝对糟糕。感谢上帝你们都有空,因为这些路障是一个杀手,我可能迟早会放弃。谢谢你的帮助到目前为止!

不管怎样,回到问题上来。翻译20,20是用来调试的。我想弄清楚它的作用。现在,我看到了箭头,但它们看起来像是在绕着屏幕左上角的一个轴以20像素的半径旋转。它们对物体坐标作出反应,但似乎是以错误的方式。

我会继续摆弄,但我的问题是,我如何让旋转枢轴在屏幕的中心,并让箭头指向周围飞行的物体?准确地说,箭头不仅要指向目标,还要围绕屏幕中心的玩家角色半径移动。

谢谢!

(我的数学不是很好,但我知道这个问题)。

作为角度计算的一部分,你需要将你的播放器和其他所有东西转换成0,0,然后旋转并转换回来。

这样认为,你总是旋转0,0,否则旋转不准确(因为你总是旋转对0,0,如果你不是0,0你会旋转),所以如果你需要旋转物体在10,20,你第一次减去20度的差异在两个轴(在本例中10和20)然后你旋转20度的对象(所以你实际上是旋转物体对0,0)然后你加回你减去10到20。这使得旋转是正确的。

在你的例子中,你需要抵消整个世界(我认为这实际上是一个世界翻译),所以你想要计算出玩家与0,0的差异,并从所有物体中减去它,有效地使0,0成为玩家的中心,并保持所有其他物体与此相关。然后进行旋转计算,将箭头放置在0,0附近。然后通过添加偏移量将所有内容(包括新创建的箭头)转换回来。

(更有效的方法是计算移动,旋转和移动所需的矩阵[参见矩阵乘法],并将其应用于所有同时旋转所有物体的对象)

我只在OpenGL中做过这个,你只需要使用一个翻译矩阵将它应用到整个世界。我不确定在android canvas中是否有类似的东西,但我认为这个方法仍然是相同的。

这个链接有这个概念的图形说明。我相信这会让你走上正确的道路。

相关内容

最新更新