Android 如果两个精灵被放置在AndEngine中的同一位置,我如何识别和利用TouchEvents?

Android 如果两个精灵被放置在AndEngine中的同一位置,我如何识别和利用TouchEvents?,android,touch,andengine,Android,Touch,Andengine,我正在安德林做一个幻想游戏。我已经动态创建了瓷砖(矩阵格式),并在其中一个瓷砖上放置了一个精灵。我使用onAreatouchlistener来识别精灵,我给瓷砖和精灵1一个Z值0,但onAreatouchlistener不识别精灵,它只识别瓷砖。当用户触摸到特定位置时,我想知道这两个值。请提出解决办法 下面是一些正在使用的示例代码: public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final ITouchArea p

我正在安德林做一个幻想游戏。我已经动态创建了瓷砖(矩阵格式),并在其中一个瓷砖上放置了一个精灵。我使用onAreatouchlistener来识别精灵,我给瓷砖和精灵1一个Z值0,但onAreatouchlistener不识别精灵,它只识别瓷砖。当用户触摸到特定位置时,我想知道这两个值。请提出解决办法

下面是一些正在使用的示例代码:

public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final ITouchArea pTouchArea,
        final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
    if (pSceneTouchEvent.isActionDown()) {
        final Sprite face = (Sprite) pTouchArea;

        String mrc = (String) face.getUserData();

        if (mrc.equals("48")) {
            selectedtlie = true;
            inittileLevel(level1);
        } else
            Toast.makeText(this, "" + mrc, Toast.LENGTH_SHORT).show();

        i++;

        if (i == 2)
            return true;
        else
            return false;
    }
    if (pSceneTouchEvent.isActionUp()) {
        i = 0;
        return true;
    }
    return true;
}

你可能会问一些不同的问题。你的问题有点难理解,但我会尽力一个接一个地解释

检查精灵是否位于同一位置 我如何识别两个精灵是否放置在同一位置 它们的zindex值在AndEngine中不同

那是你的主题。我认为你的要求有点不同,但如果这就是你所要求的,你可以比较X和Y,忽略Z,如下所示:

if (sprite1.getX() == sprite2.getX() && sprite1.getX() == sprit2.getY()) return true;
检查精灵是否重叠 当然,“同一位置”的含义可能与左上角是否位于同一点不同。例如,您可能想知道两个精灵是否完全重叠,而不管它们是否精确地放置在同一XY上。在这种情况下,您希望进入碰撞检测,并且有不止一种方法来处理碰撞(例如,您想要像素完美的碰撞测试吗?)。在任何情况下,检测像素完美碰撞的方法。如果您想做一些更简单的事情,您可以为每个精灵获取边界框Rect,并使用android.graphics.Rect中的intersect()方法

处理触摸事件 你的问题主体问了以下问题,你似乎从哪里得到了一些不同的东西:

我用了一个感应监视器来识别精灵,我给了一个 对于平铺和精灵1,Z值为0,但onAreaTouchListener没有 识别精灵,它只识别瓷砖。我想知道两者 值,当用户触摸特定位置时

现在我很困惑,因为onAreaTouchListener不会“识别精灵”,它会监听触摸事件。我的猜测是,你所要求的是一种使用touchEvents的方法来同时对一个精灵和它下面的另一个精灵进行操作

登记接触区 第一:确保您正在为两个精灵注册处理程序。也就是说,类似于:

this.mScene.registerTouchArea(sprite);
使用OnTouch()返回的布尔值 如果touchevent没有被传播,那么另一个需要注意的是onTouch()返回的布尔值。该布尔值用于指示处理程序是否已使用该事件,或者是否应传递该事件

检查触摸遍历顺序 您还可以使用scene.setonareatuchtraversalfrontoback()和scene.setonareatuchtraversalbacktofront()来查看它们是否都在接收触摸事件,问题是否正在传播,或者问题是否是您尚未在其中一个精灵上注册处理程序

检查区域绑定
最后,看看scene.setTouchAreaBindingEnabled(true)。你在评论中提到,你对“修补”活动特别有意见。这可能是将touchareabinding设置为false的结果。本质上,toucharea绑定的作用是允许触摸区域查看和接收其触摸区域之外的触摸事件。因此,如果手指在该区域内向下,在该区域外向上(并且绑定已关闭),它将不会收到润色事件。如果绑定已打开,它仍将接收触摸事件。

设置z值后是否对其进行排序?类似于
yoursecene.sortChildren()谢谢丢失。我已经尝试过scene.SetonareatuchtReversalfrontToBack()它可以工作,但我想访问sprite和tile的用户数据。实际上,游戏类似于国际象棋。请建议我。onTouch()方法是否像我描述的那样返回false,因此,如果我使用return flase,touchevent可以通过检测sprite和tile userdata值传播,但isActionUp()方法不起作用。但我也需要使用actionup方法。请建议我..公共布尔值OnRealTouched(final TouchEvent pSceneTouchEvent、final ITouchArea pTouchArea、final float pTouchAreaLocalX、final float pTouchAreaLocalY){if(pSceneTouchEvent.isActionDown()){final Sprite face=(Sprite)pTouchArea;String mrc=(String)face.getUserData();if(mrc.equals(“48”){selectedtrie=true;inittilevel(level1);}else Toast.makeText(this,“+mrc,Toast.LENGTH_SHORT).show();i++;if(i==2)返回true;elsereturn false;}if(pSceneTouchEvent.isActionUp()){i=0;返回true;}返回true;}我将代码移到了问题的主体。当你说“isActionUp()方法不起作用”时你的意思是在一个动作启动时没有调用该方法,还是说“i=0”(你的代码)没有做你想做的事情?