当前位置: 首页 > 知识库问答 >
问题:

AndEngine-根据是否按下父按钮启用禁用的子按钮

简宏义
2023-03-14

由于这里的答案,我拥有了当前的设置。如何根据是否按下父按钮禁用子按钮?例如,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;
    }
});

}

禁用除第一个按钮外的所有其他按钮,并且在按下按钮之前,由于“启用”仍然为false,因此应禁用其他按钮:

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

}

最后,如果子项的id与父项的子项id匹配,则在按下按钮时应启用该按钮,因为此时应将Enable设置为true:

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

我在运行代码时没有遇到错误,但似乎没有一个像我预期的那样工作。所以任何帮助都会很好。

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,但我不确定我将如何实现它。

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

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

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);
                }
            }   
        }
    });
}

还是不行,需要帮忙吗?拜托?

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循环中。

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);

        }
    });
}

还是不行。

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);
        }
    });
}

奇怪的事情发生了只有一个按钮/水平对象是有效的,如果按另一个按钮,我按的一些按钮不是该按钮的子或父。

共有1个答案

凤扬
2023-03-14

在您创建按钮的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);
                    }
                }

            }
        }

     });
}

希望这有帮助。

 类似资料:
  • 我以编程方式生成了许多按钮(一些按钮用于增加值,而另一些按钮用于减少值),当它们调整的值达到最大值或最小值时,我会禁用这些按钮。(即,当达到最大值时,“增加”按钮被禁用,而当达到最小值时,“减少”按钮被禁用。)除了禁用,我还将按钮状态设置为“按下”,以直观地指示已达到极限值,并且按钮不再工作。 我的按钮onClickListener的'增加'按钮看起来像这样: ClickListeners上相应的

  • 问题内容: 单击后,我想在iOS上禁用按钮()。我是开发iOS的新手,但我认为目标上的等效代码-C是这样的: 但是我不能迅速做到这一点。 问题答案: Swift中的布尔值是。 应该做。 这是的属性的Swift文档。

  • 问题内容: 我有这个HTML: 我该如何做这样的事情: 当文本字段为空时,应禁用提交(disabled =“ disabled”)。 在文本字段中键入内容以删除禁用的属性时。 如果文本字段再次变为空(删除了文本),则应再次禁用提交按钮。 我尝试过这样的事情: …但这不起作用。有任何想法吗? 问题答案: 问题在于,仅当焦点从输入移开(例如,有人单击输入或将选项卡移出输入)时,更改事件才会触发。尝试改

  • 这是一个很奇怪的问题,因为我很确定逻辑是正确的,但它仍然不起作用。因此,当GUI启动时,在启动函数中,我对每个按钮、Kbutton、Bbutton等使用以下代码行将大多数按钮设置为灭活:

  • 问题内容: 我想启用/禁用没有jQuery的按钮。这是我的代码: 作品。但这不是-按钮保持禁用状态: 问题答案: 是一个布尔属性,仅它的存在就会导致元素被禁用,无论该属性的值实际是多少。这就是为什么您可以通过将属性设置为来禁用JavaScript中的元素的原因,您可以将其设置为任何值(这就是为什么将其设置为禁用状态的原因)。 在HTML中,您甚至根本不需要为属性设置一个值: 但是,建议使用布尔属性

  • 我正在用javaFX在netbeans中编写一个程序视图中有几个按钮和一些坏按钮(比如炸弹是扫雷舰),我试图在按下坏按钮时冻结程序,但我找不到如何操作 谢谢