libGDX如何从精灵或纹理中获取像素颜色

4
我在网上搜索了它,但是我找不到任何解决方案。我有一个精灵或纹理,当我触摸它时,我想从触摸坐标获取像素颜色。
所以我有:
 if (Gdx.input.isTouched()) {
            Rectangle spriteBounds = sprite.getBoundingRectangle();
            if (sprite.contains(Gdx.input.getX(), Gdx.input.getY())) {
                //and here something like
                //Color color = sprite.getPixelColor(Gdx.input.getX(), Gdx.input.getY());
            }
        }

这是可能的吗?谢谢 :)

我看了这个问题,但是没有关于libgdx库的任何内容。 - miskohut
1个回答

8

以下代码可能适用,但未经过测试。您可以通过精灵纹理的 Pixmap 获取颜色。您需要确保将输入(屏幕)坐标正确转换为纹理的本地坐标。

if (Gdx.input.isTouched()) {
    Rectangle spriteBounds = sprite.getBoundingRectangle();
    if (spriteBounds.contains(Gdx.input.getX(), Gdx.input.getY())) {
        Texture texture = sprite.getTexture();

        int spriteLocalX = (int) (Gdx.input.getX() - sprite.getX());
        // we need to "invert" Y, because the screen coordinate origin is top-left
        int spriteLocalY = (int) ((Gdx.graphics.getHeight() - Gdx.input.getY()) - sprite.getY());

        int textureLocalX = sprite.getRegionX() + spriteLocalX;
        int textureLocalY = sprite.getRegionY() + spriteLocalY;

        if (!texture.getTextureData().isPrepared()) {
            texture.getTextureData().prepare();
        }
        Pixmap pixmap = texture.getTextureData().consumePixmap();
        return new Color(pixmap.getPixel(textureLocalX, textureLocalY));
    }
}

我不知道为什么会这样,但我不得不否定第二个if,因为精灵在绘制时以0,0左下角为起点,而输入却是以0,0左上角为起点。 - miskohut
@miskohut Libgdx接受其本地坐标作为输入,这与渲染坐标不同。要解决这个问题,您可以从y坐标中减去高度,或调用camera.unproject(Vector3 coords)函数。 - Jax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接