Starling精灵内部空白区域的触摸事件

6

我有一个Starling的Sprite,想要获取它的触摸事件。我正在使用

content.addEventListener(TouchEvent.TOUCH, onTouch); 

function onTouch(e:TouchEvent) {

    var touch:Touch = e.getTouch(content) as Touch;
    if (touch) {
        //do something
    }
}

然而,这仅在触摸Sprite的子元素时有效,而不是它们之间的空间。 我认为,如果我创建一个透明度较低的图像并将其粘贴在下面,它应该会接收到触摸事件,但是否有更好的方法呢?

我还考虑监听舞台上的触摸事件,并执行hitTestPoint()的等效操作。

我想到了

var hitTest = (touch && content.hitTest(this.globalToLocal(new Point(touch.globalX, touch.globalY))));

但是这似乎也不起作用,只有当触摸到内容Sprite的子元素时,触摸事件才会起作用。

解决方案:

最终,我使用了一个带alpha通道的Quad,正如Cherniv所建议的。

bg = new Quad(width, height);
bg.alpha = 0;
addChildAt(bg, 0);

你尝试过使用 isTouching() 吗:http://doc.starling-framework.org/core/starling/events/Touch.html#isTouching()? - Ivan Chernykh
2个回答

3

尝试在您的 Sprite 中使用轻量级透明的 Quad(不需要 Image)。


最终我选择了这个方案。如果没有人提供更好的解决方案,我会接受你的答案。谢谢。 - Tom
@Tom 这种touch行为中有一些逻辑,但可惜的是它没有像你所指出的那样的可选行为。我尝试过使用isTouching,但在这里并没有帮助。 - Ivan Chernykh
这是Starling的创建者Daniel Sperl通常在Starling论坛中向人们推荐的方法。在本地显示列表中,许多人使用的通常方法是使用graphics.drawRect()和不可见填充,因此Starling的方法大致相同。在Starling中有一种替代方法:在子类中覆盖hitTest()并提供自己的自定义行为。 - Josh Tynjala
@joshtynjala 谢谢你 Josh!(是的,我们知道谁是 Daniel 和谁是你,因为 Starling 社区并不是很大,很容易记住谁实际上创建了这个框架 ;) ) - Ivan Chernykh

0

希望对你有所帮助。

content.addEventListener(TouchEvent.TOUCH, onTouch); 

    function onTouch(e:TouchEvent) {

        var touch:Touch = e.getTouch(stage) as Touch;
        if(touch && touch.phase == TouchPhase.BEGAN){
            //do something
        }
    }

    or 
    addEventListener(TouchEvent.TOUCH, onTouch); 

    function onTouch(e:TouchEvent) {
       var touch:Touch = e.getTouch(sprite(eve.target)) as Touch;
        if(touch && touch.phase == TouchPhase.BEGAN){
            //do something
        }
    }

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