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

时间:2011-09-06 01:29:39

标签: android math path android-canvas

几乎得到了它,但是有一些问题。

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

{//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();
}

要提供一些上下文,用户是位于屏幕中心的播放器。 oEnemies 是玩家在屏幕上和屏幕外都可以击落的物体。

我试图做的是在玩家周围创造一种雷达。微小的小箭头显示出去摧毁所有物体并完成任务的方式。

正如我在之前的帖子中所提到的,我很擅长逻辑,但在数学方面非常糟糕。感谢上帝,你们可以在这里找到人,因为这些路障是杀手锏,我可能会早点放弃。感谢您的帮助到目前为止!

无论如何,回到这个问题。翻译20,20真的用于调试。我试图找出它的作用。现在,我看到箭头,但它们看起来像是围绕屏幕左上角的轴旋转,半径为20像素。它们对物体坐标作出反应,但看起来却是错误的。

我会继续摆弄,但我的问题是,如何让旋转枢轴位于屏幕的中心,让箭头指向飞来飞去的物体?确切地说,箭头不仅需要指向物体,还需要围绕玩家在屏幕中心的化身的半径移动。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

作为角度计算的一部分,您需要将您的玩家和其他所有内容翻译为0,0然后旋转并翻译回来。

想象一下,你总是在0左右旋转,否则旋转不准确(因为你总是相对于0,0旋转,如果你不在0,0,你只需围绕它旋转),所以如果你需要将物体旋转10,20度20度,你首先减去两个轴的差异(在这种情况下是10和20),然后你将物体旋转20度(这样你就可以有效地旋转物体了尊重0,0)然后你加上你减去的10和20。这会导致旋转正确。

在你的例子中,你需要抵消整个世界(这实际上是一个世界翻译,我认为它被称为)所以你想要计算你的球员与0,0的差异,并从所有对象中减去有效的0,0您的播放器的中心并保留与此相关的所有其他对象。然后进行旋转计算以将箭头放在0,0附近。然后通过重新添加偏移量来反转所有内容(包括新创建的箭头)。

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

我只在OpenGL中完成此操作,因此您只需使用翻译矩阵将其应用于整个世界。我不确定在andriod canvas中有类似的东西,但我认为这种方法仍然是相同的。

这个Link有一个这个概念的图解说明。我相信这会让你走上正轨。