如何在(libgdx)阶段检测对图像透明区域的触摸?

Posted

技术标签:

【中文标题】如何在(libgdx)阶段检测对图像透明区域的触摸?【英文标题】:How to detect a touch on transparent area of an image in a (libgdx) stage? 【发布时间】:2012-11-17 22:18:22 【问题描述】:

有人可以帮助检测我在舞台上作为演员使用的图像上的触摸吗?图像实际上是一个长的斜刷,有很多透明区域。问题是当我触摸画笔图像的透明区域时,它也会触发图像的ClickListener。我只希望在触摸可见图像时调用ClickListener,而不是图像的透明部分。

我正在使用 libgdx-0.9.4 库。这是我的简单代码。

import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.ClickListener;


Image brushImg = new Image(ImageCache.getTexture("brush"));
brushImg.width = mStage.width()*0.75f;
brushImg.height = mStage.height()*0.75f;

brushImg.setClickListener(new ClickListener() 
    @Override
    public void click(Actor actor, float x, float y)           
        SoundFactory.play("brush");   
    

【问题讨论】:

为此搜索了很多。可能有一个简单的解决方案。抱歉,我是 libgdx 的新手。请帮帮我!! 【参考方案1】:

我认为 libGDX Stage 代码对于为 Actor 设置不同的边界框/边界区域没有任何特定的支持。但是,您可以采取其他一些措施来解决此问题。

首先,在ClickListener 中,如果触摸“无效”,您可以丢弃它们。例如,如果您有一个简化的边界区域(在对角笔刷的情况下,您可能会使用有角度的矩形)。或者,如果你想要超精确,你可以将触摸区域映射回底层纹理,并检查像素是否清晰。

从 libGDX API 文档看来,您可以覆盖 Actor 上的 hit 方法来更改触摸的计算方式(并且大概只有在点击成功时才会调用 ClickListener)。这可以让您在调用 ClickListener 之前测试交叉点(这可以允许将触摸转发到舞台上的其他对象)。

【讨论】:

感谢您的建议。我想我可以绑定图像的诊断矩形。但是如果成功的话,像素检测会很棒。

以上是关于如何在(libgdx)阶段检测对图像透明区域的触摸?的主要内容,如果未能解决你的问题,请参考以下文章

重新填充画布擦除区域的区域

Libgdx/Opengl alpha blending(结果 alpha 被源 alpha 替换)

LibGDX 按钮在触摸时没有响应

uiscrollview 和 uibutton 对触摸事件透明

带有检测触摸的图像视图的 UIScrollView

检测 SpriteKit 中节点特定区域的触摸