【问题标题】:AndEngine - Enable a disabled child button based on whether the parent button has been pressedAndEngine - 根据是否按下父按钮启用禁用的子按钮
【发布时间】:2013-03-09 23:03:24
【问题描述】:

感谢here 的回答,我拥有当前的设置。如何根据是否按下父按钮来禁用子按钮?例如 Button2 当前被禁用,但是当我按下 Button1 时,我现在可以按下 Button2,如果我按下 Button2,Button3 和 Button4 就会启用并且现在可以按下。 到目前为止,我这样做的方式如下: 声明一个布尔值:

boolean Enable = false;

单击按钮时将 Enable 从 false 更改为 true:

if (type.equals(TAG_ENTITY_ATTRIBUTE_VALUE_GAMEBUTTON1)) {
levelObject = new ButtonSprite(x, y, resourcesManager.gamebutton1_region, resourcesManager.gamebuttonpressed_region, vbom, new OnClickListener() {
    @Override
    public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX, float pTouchAreaLocalY) {                           
        Enable = true;
    }
});

}

禁用除第一个按钮之外的所有其他按钮,并且在按下按钮之前看到 Enable 仍然为 false,其他按钮应该被禁用:

if (ButtonSpriteID != 1) {
levelObject.setEnabled(Enable);
levelObject.setColor(Color.BLACK);

}

然后 final 如果子的 id 与父的 child_id 匹配,则按钮应在按下按钮时启用,因为 Enable 应设置为 true:

for (int k = 0; k < ButtonSpriteChild.length; k++){
if (ButtonSpriteChild[k] == ButtonSpriteID){
    levelObject.setEnabled(Enable);
    levelObject.setColor(Color.WHITE);
}                               
}

运行代码时我没有收到任何错误,但似乎都没有按我的预期工作。所以任何帮助都会很棒。


更新 1:所以我尝试并删除了 Enable boolean 并尝试了这个:

if (ButtonSpriteID != 1) {
levelObject.setEnabled(false);
levelObject.setColor(Color.BLACK);
}

levelObject.setOnClickListener(new OnClickListener() {
@Override
public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX, float pTouchAreaLocalY) {
    for (int k = 0; k < ButtonSpriteChild.length; k++){
        if (ButtonSpriteChild[k] == ButtonSpriteID){
            levelObject.setEnabled(true);
            levelObject.setColor(Color.WHITE);
        }                               
    }
}
});

还是不行。有人建议我覆盖 onTouchedArea,但我不确定如何实现。


更新 2:我现在已经尝试过:

if (levelObjects.get(j).isPressed()) {
    levelObjects.get(i).setEnabled(true);
    levelObjects.get(i).setColor(Color.WHITE);
}

还是不行。仍在寻求帮助。


更新 3:我现在已经尝试过:

for (final ButtonSprite buttonSprite : levelObjects) {
    if (ButtonSpriteID != 1) {
        buttonSprite.setEnabled(false);
        buttonSprite.setColor(Color.BLACK);
    }
    buttonSprite.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX,
        float pTouchAreaLocalY) {
            for (int k = 0; k < ButtonSpriteChild.length; k++){

                if (ButtonSpriteChild[k] == ButtonSpriteID){
                    buttonSprite.setEnabled(true);
                    buttonSprite.setColor(Color.WHITE);
                }
            }   
        }
    });
}

仍然无法正常工作,有什么帮助吗?请问?


更新 4:我现在已经尝试过:

levelObjects.get(j).setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX,
    float pTouchAreaLocalY) {
        for (int k = 0; k < ButtonSpriteChild.length; k++){

            if (ButtonSpriteChild[k] == ButtonSpriteID){
                levelObjects.get(i).setEnabled(true);
                levelObjects.get(i).setColor(Color.WHITE);
            }
        }
    }
});

这不起作用,因为它给了我关于将“i”设置为 final 的错误,但不能这样做,因为“i”在 for 循环中。


更新 5:所以我试过了

if (ButtonSpriteChild[k] == ButtonSpriteID){
    levelObject.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX,
                float pTouchAreaLocalY) {
            levelObject.setEnabled(true);
            levelObject.setColor(Color.WHITE);

        }
    });
}

还是不行。


更新 6:所以我试过了

if (ButtonSpriteChild[k] == ButtonSpriteID){
    levelObject.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX,
            float pTouchAreaLocalY) {
            levelObject.setEnabled(true);
            levelObject.setColor(Color.WHITE);
        }
    });
}

如果按下另一个按钮并且我按下的某些按钮不是该按钮的子级或父级,则会发生一些奇怪的事情。

【问题讨论】:

  • 有人建议我覆盖 onTouchedArea 但我不确定如何实现。

标签: java android andengine


【解决方案1】:

在您创建按钮时的 XML 解析期间,我们将借此机会仅启用 GAMEBUTTON1,禁用所有其他按钮,并在按下按钮时调用一个函数以启用所有子按钮。即,

if (type.equals(TAG_ENTITY_ATTRIBUTE_VALUE_GAMEBUTTON1))
{
    final ButtonSprite levelObject = new ButtonSprite(x, y, resourcesManager.gamebutton1_region, vbom, new  OnClickListener()
    {

        @Override
        public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX, float pTouchAreaLocalY) 
        {       
            //This button sprite has been clicked so lets enable any child sprites

            EnableChildButtons(this); //See sub routine later

        }
     });
     //For game button 1, we will enable it,
     levelObject.setEnabled(true);
     levelObject.setColor(Color.WHITE);
     //Hereafter for further buttons, although the rest of the code will be the same
     //will be disabled after creation with the following two lines in place of the latter
     // levelObject.setEnabled(false);
     // levelObject.setColor(Color.BLACK);
}
//...(rest of your code in previous post)

在子例程 EnableChildButtons 之前,我对您的 levelObjectUserData 进行了修改,我替换了您的子 ID 的 int 数组,

public int[] ChildID = {-1};

有一个列表,

public List<Integer> ChildIDs = new ArrayList<Integer>();

调用存储您的孩子 ID 的代码时,只需将以下代码与您的代码一起使用,

for (int i = 0;i<childString_id.length;i++)
{
    MyData.ChildIDs.add(Integer.parseInt(childString_id[i]));
}

然后我们只需要编写函数来启用孩子,

private void EnableChildButtons(final ButtonSprite mButtonSprite)
{
    //To cut down on syntax length get a pointer to the button user data
    final levelObjectUserData mUserData = ((levelObjectUserData) (mButtonSprite.getUserData()));

    //We will be careful and run this on the update so we do not alter states
    //while they are currently being processed by the update thread!
    mActivity.runOnUpdateThread(new Runnable()
    {
        @Override
        public void run()
        {
            //Go through all of the buttons child ids
            for (int i = 0;i<mUserData.ChildIDs.size();i++)
            {

                //Locate the button with that ID as will be refernced in our levelObjects
                //linked list
                for (int j = 0;j<levelObjects.size();j++)
                {
                    final int ButtonSpriteID = ((levelObjectUserData) (levelObjects.get(j).getUserData())).ID;

                    if (mUserData.ChildIDs.get(i) == ButtonSpriteID)
                    {
                        //We have found a child button, so enable it!
                        ((ButtonSprite) levelObjects.get(j)).setEnabled(true);
                        ((ButtonSprite) levelObjects.get(j)).setColor(Color.WHITE);
                    }
                }

            }
        }

     });
}

希望这会有所帮助。

【讨论】:

  • 另外,作为一个改进的想法,您可以考虑用指向子按钮精灵实例本身的指针列表替换您的 ChildIDs 整数列表。这意味着您可以在每次您希望找到它们并直接找到它们时,通过嵌套循环搜索子级对象,从而加快速度。
  • 当我将 ChildID 从数组更改为列表时,在绘制上一个问题的线条时,现在发生了一些奇怪的事情,有些线条没有被绘制,而那些线条没有被绘制正确
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 2021-12-13
  • 2019-02-27
  • 2019-02-18
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
相关资源
最近更新 更多