2

我正在 AndEngine 中开发一款奇幻游戏。我已经动态创建了图块(矩阵格式),并在其中一个图块上放置了一个精灵。我使用 onAreatouchlistener 来识别精灵,我给瓷砖和精灵 1 的 zvalue 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;
}
4

1 回答 1

1

您可能会问一些不同的问题。您的问题有点难以解释,但我会尝试通过可能的解释来进行可能的解释。

检查精灵是否在同一位置

当 AndEngine 中的 zindex 值不同时,如何识别两个精灵是否放置在同一位置?

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

if (sprite1.getX() == sprite2.getX() && sprite1.getX() == sprit2.getY()) return true;

检查精灵是否重叠

当然,“相同位置”的含义可能与左上角是否位于同一点不同。例如,您可能想知道两个精灵是否完全重叠,无论它们是否精确地放置在同一个 XY 上。在这种情况下,您想要进行碰撞检测,并且有不止一种方法可以处理碰撞(例如,您想要像素完美的碰撞测试吗?)。无论如何,这是检测像素完美碰撞的一个很好的例子。如果你想做一些更简单的事情,你可以为每个精灵获取边界框 Rect 并使用 android.graphics.Rect 中的 intersect() 方法。

处理触摸事件

您的问题主体提出以下问题,您似乎遇到了不同的问题:

我使用 onAreatouchlistener 来识别精灵,我给瓷砖和精灵 1 的 zvalue 0,但是 onAreaTouchListener 不识别精灵,它只识别瓷砖。当用户触摸特定位置时,我想知道这两个值

现在我很困惑,因为 onAreaTouchListener 不会“识别精灵”,它会监听触摸事件。我的猜测是,您要求的是一种将 touchEvents 用于精灵及其下方的另一个精灵的方法。

注册触控区域

首先:确保您为两个精灵注册了处理程序。即,类似:

this.mScene.registerTouchArea(sprite);

使用 OnTouch() 返回的布尔值

如果 touchevent 没有被传播,另一件事是 onTouch() 返回的布尔值。该布尔值用于指示处理程序是否已使用事件或是否应通过该事件。

检查触摸遍历顺序

您还可以使用 scene.setOnAreaTouchTraversalFrontToBack() 和 scene.setOnAreaTouchTraversalBackToFront() 来查看它们是否都在接收触摸事件并且问题正在传播,或者问题是您没有在其中一个精灵上注册处理程序.

检查区域绑定

最后看一下scene.setTouchAreaBindingEnabled(true)。您在评论中提到您对“TouchUp”事件特别有疑问。这可能是 touchareabinding 设置为 false 的结果。本质上,toucharea 绑定所做的是它允许触摸区域查看和接收其触摸区域之外的触摸事件。因此,如果手指在该区域内向下并在外面向上(并且绑定已关闭),它将不会接收到触摸事件。如果绑定打开,它仍然会接收到触摸事件。

于 2013-02-14T04:52:08.020 回答