Android将一个位图旋转到另一个位图

Android将一个位图旋转到另一个位图,android,canvas,bitmap,rotation,2d,Android,Canvas,Bitmap,Rotation,2d,我正在制作一个2d游戏,其中我的角色由一个操纵杆控制,我使用画布旋转他。旋转(天使,x,y)。我的角色朝着他正朝着的方向射击,现在我想在他射击的时候增加他的步枪射出的火焰。问题是,如何围绕角色旋转此火焰图像 如何旋转角色: canvas.save(); canvas.rotate((float) controls.getAngle(), controls.charPosition.x + charBitmap.getWidth() / 2, controls.charPositi

我正在制作一个2d游戏,其中我的角色由一个操纵杆控制,我使用画布旋转他。旋转(天使,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();
你可能知道,像这样画我的火会使它围绕自己的中心旋转,就像我的角色一样。但是我想让它围绕我的角色旋转,这样看起来就像是从他的枪里射出来的火


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

我将尝试调整此答案,使其更具体,但如果我理解正确,您可能不希望旋转画布来创建火的旋转。相反,您可能希望使用相对于角色位置的触发函数来描述它。所以我认为它看起来像你画的人物

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是火与角色中心的角度。这不太正确,因为它将跟踪火焰图像的一角,而不是中心。我认为这个问题很容易解决。如果没有,我将很快改变。

您可以使用
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();

请注意订单。画布矩阵操作是预乘的,虽然代码后面会进行转换。

这就成功了!非常简单易懂的解决方案。谢谢你,好先生!