3

昨晚,当我遇到 ButtonSprite 的问题时,我很兴奋。我本可以发誓我以前做过这个 - 看起来很简单 - 但是使用 AndEngineExamples 提供的代码并没有真正意义并且会出现错误(例如 - 为什么一个模糊的“run()”方法会创建响应每一个触摸事件?)。

所以我做了一些似乎有意义的事情。

private void loadScenes()
{
    mainScene = new Scene();
    menu = new Sprite(0, 0, menuTextureRegion, mEngine.getVertexBufferObjectManager()){
        @Override
        protected void preDraw(GLState pGLState, Camera pCamera) 
        {
            super.preDraw(pGLState, pCamera);
            pGLState.enableDither();
        }
    };

    newgamebutton = new ButtonSprite(25, 200, newgameTextureRegion, mEngine.getVertexBufferObjectManager());
    multiplayerbutton = new ButtonSprite(25, 310, multiplayerTextureRegion, mEngine.getVertexBufferObjectManager());

    menu.setScale(1.65f);
    menu.setPosition((CAMERA_WIDTH - menu.getWidth()) * 0.5f, (CAMERA_HEIGHT - menu.getHeight()) * 0.5f);

    mainScene.attachChild(menu);
    mainScene.attachChild(newgamebutton);
    mainScene.attachChild(multiplayerbutton);

    mainScene.registerTouchArea(multiplayerbutton);
    mainScene.setTouchAreaBindingOnActionDownEnabled(true);

    multiplayerbutton.onAreaTouched(mButtonTouched, multiplayerbutton.getWidth(), multiplayerbutton.getHeight());

    if(mButtonTouched.isActionDown()) {
        mainScene.detachChild(menu);
        mainScene.detachChild(multiplayerbutton);
    }

}

这似乎很有道理。当按下“多人游戏按钮”时,它会给你 mButtonTouched,当按下它时......它会分离菜单和多人游戏按钮。这显然只是我测试的东西,而不是任何实际项目的一部分,因为我只是在学习,但是我得到一个空指针异常,并且应用程序在显示“菜单场景”之前就关闭了,这显然是正常工作的。此外,在各个站点上,它说我应该在多人按钮之前放置“公共布尔值”,但 Eclipse 不会这样做。

我相信你们已经想通了,但我对 AndEngine 很陌生。感谢您的帮助,伙计们!

4

1 回答 1

4

查看代码后,我相信您想做这样的事情:

ButtonSprite button = new ButtonSprite(25, 310, multiplayerTextureRegion, mEngine.getVertexBufferObjectManager()) {
       @Override
       public boolean onAreaTouched(TouchEvent pTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) {
           if(pTouchEvent.isActionDown()) {
               mainScene.detachChild(menu);
               mainScene.detachChild(multiplayerbutton);
           }
           return super.onAreaTouched(pTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY);
       }
};

您的代码不起作用,因为最后一个 if 语句实际上没有意义 - 它正在检查方法 loadScenes() 执行时是否按下按钮。我建议您阅读匿名内部类,我花了很长时间才弄清楚在 AndEngine 中使用它们是一种有效且有用的方法。

这是管理按钮的不同方式的原始示例:

mScene.setOnAreaTouchListener(new IOnAreaTouchListener() {
    @Override
    public boolean onAreaTouched(TouchEvent pSceneTouchEvent, ITouchArea pTouchArea, float pTouchAreaLocalX, float pTouchAreaLocalY) {
        if (pTouchArea.equals(button) {
            doSomething();
            return true;
        }
        return false;
    }
});

请注意,这仅在触摸 Shapes 时有效,如果您想检测 Shapes 之外的触摸事件,则需要使用 IOnSceneTouchListener 代替。

于 2012-08-14T08:52:38.063 回答