【问题标题】:Limit touch area to Texture area in libgdx将触摸区域限制为 libgdx 中的纹理区域
【发布时间】:2017-09-19 14:54:10
【问题描述】:

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

【问题讨论】:

    标签: android opengl-es libgdx


    【解决方案1】:

    我会通过颜色选择来解决这个问题。首先确定精灵上的哪个像素被触摸,然后检查被触摸的像素是否透明。代码取自 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
    }
    

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

    【讨论】:

    • 感谢您的回复。我们不能创建一个多边形来表示该区域吗?如果我有将近 200 个怨恨,这看起来很昂贵。
    • 据我所知,没有简单的方法可以从纹理区域创建多边形,您的纹理仍然是矩形的,您仍然需要检查哪些像素是透明的,而不是创建多边形和由于曲线,最终形状会很复杂。请记住,仅当您实际触摸精灵矩形(第一个 if 语句)时才会计算像素颜色,并且您可以在击中一个精灵时立即终止(最上面的拼图)。因此,如果在某些情况下对超过 5 个精灵进行了计算,我会感到惊讶。
    • 优化它的一种方法是预先保存所有像素图(与精灵的某种名称/ID 连接),而不是每次都重新创建像素图。由于您可以移动精灵,因此无法避免计算 localX 和 localY。
    • 另一个选项,如果您的作品有一组固定的形状(比如说 10 种不同的形状),您可以随时为每个形状手动创建多边形,然后为每个形状创建一个不可见的模型实例/演员peice,将它与块一起移动并在该模型实例/演员上进行挑选。
    • 谢谢。我有代表这件作品的android android.graphics.Path对象,是否可以在libgdx中使用它?或者以某种方式将 android.graphics.Path 转换为多边形。
    猜你喜欢
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多