将触摸区域限制为libgdx中的纹理区域

时间:2017-09-19 05:36:45

标签: android opengl-es libgdx

我加载纹理并将它们转换为精灵。下图显示了精灵的典型外观。形状从精灵到精灵不等。当用户触摸表面区域时,我不会移动这些精灵。目前我正在使用矩形边界来检测用户是否触摸过它。这种方法不干净,因为纹理不是矩形。因此,用户可以拖动它而不需要精确地触摸它。问题是如何创建一个触摸区域来表示纹理区域(即非透明像素区域或排除下图中的灰色区域)。

enter image description here

1 个答案:

答案 0 :(得分:2)

我会采用颜色挑选来解决这个问题。首先确定精灵上的哪个像素被触摸,然后检查触摸的像素是否透明。代码取自this question并稍作修改(未经测试):

Color pickedColor = null;
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();
    pickedColor = new Color(pixmap.getPixel(textureLocalX, textureLocalY));
}

//Check for transparency
if (pickedColor != null && pickedColor.a != 0) {
    //The picked pixel is not transparent, the nontransparent texture shape was touched
}

请记住,这尚未经过测试,可能会进行优化。