AndEngine - 如何创建按钮?

时间:2012-08-11 14:02:17

标签: android andengine

昨晚,当我遇到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,当按下它时...它会分离菜单和多人游戏按钮。这显然只是我测试的东西,而不是任何实际项目的一部分,因为我只是在学习,但我得到一个空指针异常,应用程序在显示“菜单场景”之前关闭,这显然通常有效。此外,在各种网站上,它表示我应该在multiplayerbutton之前放置“public boolean”,但是Eclipse不会那样。

我相信你们已经想到了这一点,但我对AndEngine来说是新手。谢谢你的帮助,伙计们!

1 个答案:

答案 0 :(得分: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。