Android围绕另一个旋转一个位图

时间:2012-09-12 20:06:57

标签: android canvas bitmap rotation 2d

我正在制作一个2D游戏,我的角色由操纵杆控制,我使用canvas.rotate(angel, x, y)旋转他。我的角色朝着他前进的方向射击,现在我想在射击时从他的步枪射出火焰。问题是,如何在我的角色周围旋转这个火焰图像?

我如何旋转我的角色:

    canvas.save();
    canvas.rotate((float) controls.getAngle(), controls.charPosition.x + charBitmap.getWidth() / 2, controls.charPosition.y + charBitmap.getHeight() / 2);
    character.draw(canvas, controls.charPosition.x,controls.charPosition.y);
    canvas.restore();

我如何旋转火焰:

        canvas.save();
        canvas.rotate((float) controls.getAngle(), controls.charPosition.x + (fireBitmap.getWidth()) / 2, controls.charPosition.y + (fireBitmap.getHeight() / 2));
        fire.draw(canvas, controls.charPosition.x, controls.charPosition.y);
        canvas.restore();

正如你可能知道的那样,像这样抽出火将使它围绕自己的中心旋转,就像我的角色一样。但是我希望它能够围绕旋转我的角色,这样看起来火焰就会从他的枪中出来。

有什么想法吗?如果有任何不清楚的地方,请在评论中告诉我。谢谢!

2 个答案:

答案 0 :(得分:2)

我会尝试定制这个答案,以便更具体,但如果我理解正确,你可能不想旋转画布来创建火焰的旋转。相反,您可能希望使用相对于角色位置的trig函数来描述它。所以我觉得它看起来就像是你画的角色。

canvas.save();
canvas.rotate((float) controls.getAngle(), controls.charPosition.x + charBitmap.getWidth() / 2, controls.charPosition.y + charBitmap.getHeight() / 2);
fire.draw(canvas, controls.charPosition.x+(fireRadius*cos(fireAngle)),controls.charPosition.y+(fireRadius*sin(fireAngle));
canvas.restore();

在此代码中,fireRadius是您想要绘制火焰的角色绘图中心的距离,而fireAngle是角色中心的火焰角度。这不太对,因为它会跟踪火图像的角落,而不是中心。我认为这可以很容易地修复。如果没有,我会尽快改变。

答案 1 :(得分:1)

您可以使用Canvas.translate(dx, dy)。想法是将火移离枪一定距离,可以直接沿x轴,然后围绕枪中心旋转画布。这导致在距离枪的给定距离处给定角度旋转。

canvas.save();
canvas.rotate((float) controls.getAngle(), controls.charPosition.x + (fireBitmap.getWidth()) / 2, controls.charPosition.y + (fireBitmap.getHeight() / 2));
canvas.translate(distanceFromGun, 0);
fire.draw(canvas, controls.charPosition.x, controls.charPosition.y);
canvas.restore();

请注意订单。画布矩阵运算是预乘的,虽然稍后在代码中进行翻译。