【问题标题】:How to rotate sprite via draw method如何通过draw方法旋转精灵
【发布时间】:2015-10-02 06:50:16
【问题描述】:

我在任何地方都没有找到这个问题的答案,所以我们走吧。

  1. 我的期望:

我想渲染火箭。火箭从给定的起点以评估的角度飞行。我正在评估这样的角度:

getVelocity().angle() - 90f

我的问题是在火箭顶部校准火箭位置。下图显示了它应该如何工作:

上图是 libgdx 如何渲染未旋转的纹理区域。在底部图片中是我所期望的:我想以给定的角度移动和旋转纹理区域,以便在火箭顶部具有 (x,y) 坐标。

  1. 我有什么:

我厌倦了编写方法来绘制我期望的精灵,但我失败了。我认为这是由于我不了解此方法的文档造成的。

以下手册:

void com.badlogic.gdx.graphics.g2d.SpriteBatch.draw(TextureRegion region, float x, float y, float originX, float originY, float width, float height, float scaleX, float scaleY, float rotation )

在 x,y 处绘制一个左下角的矩形,并拉伸该区域以覆盖给定的宽度和高度。矩形相对于原点偏移 originX、originY。 Scale 指定矩形应围绕 originX、originY 缩放的缩放因子。 Rotation 指定矩形围绕 originX、originY 逆时针旋转的角度。

我的代码:

public static void drawRotatedTex(SpriteBatch pmRenderer, TextureRegion pmTex, float pmPosX, float pmPosY, float pmAngle)
{
    pmRenderer.begin();     
    pmRenderer.draw(
            pmTex, pmPosX, pmPosY, -pmTex.getRegionWidth()/2, pmTex.getRegionHeight(), pmTex.getRegionWidth(), pmTex.getRegionHeight(), 1f, 1f, pmAngle);
    pmRenderer.end();
}

结果:

这是碰撞的时刻。正如我们所看到的,坐标相对于火箭是偏移的。

我不问完整的解决方案。如果有人向我解释(在绘图或其他方面)像这种方法一样有效,对我来说就足够了。

编辑

审核建议此问题与以下问题重复:

libgdx: Rotate a texture when drawing it with spritebatch

我阅读了这个主题,但这不是我的解决方案。我知道如何旋转我的精灵,因为我不知道为什么火箭的坐标相对于火箭顶部会发生偏移。

编辑

从火箭类调用我的 drawRotatedTex:

@Override
public void render(Renderer pmRenderer, float pmX, float pmY) {
    SpriteBatch lvSpritebatch = pmRenderer.getSpriteBatch();
    Sprite lvSprite = null;

    if(mIsExploding)
    {
        if((lvSprite = mExplosion.getTexture()) != null)
        {
            lvSpritebatch.begin();
            lvSpritebatch.draw(lvSprite, pmX + lvSprite.getWidth()/2, pmY - lvSprite.getHeight()/2);
            lvSpritebatch.end();
        }
    }
    else
    {
        lvSprite = mAnimation.getTexture();
        RendererTools.drawRotatedTex(lvSpritebatch,lvSprite,pmX,pmY,getVelocity().angle() - 90f);
    }
}

【问题讨论】:

  • 我不确定您的结果中发生了什么 - 绿线是否表示爆炸火箭的坐标?那么火爆精灵应该发生在它们交叉的地方吗?仅仅是爆炸与坐标不匹配 - 还是爆炸发生在与火箭相比正确的位置 - 还是绿线坐标对应于我看到的三枚火箭之一。
  • @DoubleDouble 我会解释的。结果图片上是碰撞时刻(火箭与地面)。黑场是gorund(我没有纹理它,因为它是游戏的早期版本)。绿线与示例无关,它们只是鼠标位置。爆炸精灵具有正确的坐标,因为它们靠近地面。火箭和爆炸具有共享坐标(相同的对象 - 请参阅我的编辑我将粘贴代码)。我问为什么火箭精灵位置相对于自己的坐标偏移。

标签: java libgdx


【解决方案1】:

你问的不是很清楚,如果只是移动原点,你不需要那么多文本。无论如何,我会尝试一下。

如果你想完成图片中的内容,你可以像这样设置你的精灵:

sprite.setOrigin(s.getWidth()/2, s.getHeight()); //Centers sprite on top of image.

如果我现在在 draw 方法中旋转它,它会围绕顶部中心旋转。

sprite.rotate(5);
sprite.draw(batch);

尽管围绕自身的中心顶部旋转,但它的位置保持不变。如果我将原点设置为远离图像并旋转它,那么图像会移动很远但位置保持不变。尽管如此,如果您将其位置向右移动 10 个像素,图像(无论它可能在哪里)都会向右移动。

希望这会有所帮助。

【讨论】:

  • 如果我在许多对象中使用相同的精灵怎么办?使用后是否需要旋转回去?
  • 如果您再次使用该精灵,它将具有相同的状态。它与Integer 相同,如果将其设置为10,那么它将是10。因此,如果精灵旋转,它将被旋转。如果这对您有帮助,您可以随意创建任意数量的精灵。
  • 每个精灵都是额外的内存。我为什么要这样做。每次使用后最好将精灵旋转回来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 2015-12-26
相关资源
最近更新 更多