当前位置: 首页 > 知识库问答 >
问题:

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

梅玉堂
2023-03-14

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

共有1个答案

拓拔意
2023-03-14

我会用颜色选择来解决这个问题。首先确定触摸子画面上的哪个像素,然后检查触摸的像素是否透明。使用从此问题中获取的代码并进行了一些更改(未经过测试):

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
}

请记住,这还没有经过测试,也许可以优化。

 类似资料:
  • 我有一个主页按钮图标,它只是一个普通的精灵,里面有一个图像。我想在触摸这个按钮时执行一些操作。如何将触摸式监听器添加到此按钮,或者有其他更简单的方法来实现此目的吗?

  • 我有一个使用纹理打包器应用程序创建的纹理表,它删除了所有不必要的透明像素,以节省最终纹理表中的空间。问题是我的动画是一个拿着剑的人,所以当他攻击时,他会把剑举过头顶,这意味着它会改变精灵的宽度和高度。例子… 如您所见,第一帧是152x149,但到第八帧时,它现在是340x256。因此,当我在我的角色类中使用正常的 getWidth() getHeight() 方法时,动画运行时,角色会随着攻击而缩

  • 问题内容: 我正在寻找可以限制行数的JavaScript(用户指的是某些文本由用户按键盘上的Enter键结束),该用户可以在textarea中输入内容。我找到了一些解决方案,但它们根本无法正常工作或表现得很奇怪。最好的解决方案是可以完成这项工作的jquery插件- 类似CharLimit,但是它应该能够限制文本行数而不是字符数。 问题答案: 这 可能会 有所帮助(可能最好使用jQuery,onDo

  • 我目前正在研究一个模型,其中代理移动到地理信息系统地图上海洋中的随机点。然而,我希望它们的路径不会与地图上的任何岛屿发生碰撞。我正在考虑使用岛屿的周长创建地理信息系统区域,并希望为地理信息系统区域提供一些访问限制选项。然而,这似乎还不是一个功能。 有人知道如何让代理在向GIS地图上的某个点移动时避免进入某些区域吗?谢谢

  • 如果我创建一个.png 1024 x 1024的纹理,并在中间画一个124 x 124的圆,它的周围将是空的,它使用的RAM是否与我在124x124空间上画一个124 x 124的圆相同?

  • 描述 (Description) Touch Ripple是仅在Framework7材质主题中受支持的效果。 默认情况下,它在材质主题中启用,您可以使用materialRipple:false参数禁用它。 波纹元素 您可以启用ripple元素以匹配某些CSS选择器,例如 - ripple a.link a.item-link .button .tab-link .label-radio .labe