【问题标题】:AndEngine - How to create a button?AndEngine - 如何创建一个按钮?
【发布时间】:2012-08-11 14:02:17
【问题描述】:

昨晚,当我遇到 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 非常陌生。感谢您的帮助,伙计们!

【问题讨论】:

  • 请添加堆栈跟踪或至少告诉我们哪一行代码导致问题。
  • 基本上最后四行 - 按钮拒绝工作。

标签: android andengine


【解决方案1】:

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

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2014-02-24
    • 2010-09-23
    相关资源
    最近更新 更多