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

2024-04-08

根据我目前的设置,感谢答案here https://stackoverflow.com/questions/15116158/andengine-drawing-a-line-between-level-objects-entites-using-matching-ids。如何根据父按钮是否被按下来禁用子按钮?例如,Button2 当前处于禁用状态,但是当我按 Button1 时,我现在可以按 Button2,如果我按 Button2,则 Button3 和 Button4 会变为启用状态,现在可以按下。 到目前为止,我的做法如下: 声明一个布尔值:

boolean Enable = false;

单击按钮时将启用从 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);

}

最后,如果子级的 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);
        }
    });
}

如果按下另一个按钮,并且我按下的某些按钮不是该按钮的子按钮或父按钮,则会发生奇怪的事情,只有一个按钮/级别对象受到影响。


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

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)

在子例程Enable ChildButtons之前,我对你的level Object UserData做了修改,我替换了你的int数组的子ID,

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

            }
        }

     });
}

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AndEngine - 根据父按钮是否被按下启用禁用的子按钮 的相关文章

  • 定期更新 SWT 会导致 GUI 冻结

    Problem 当 GUI 字段定期更新时 SWT 会冻结 我想要一个基于 SWT 的 GUI 其中文本字段的值会定期递增 最初我从单独的线程访问 textField 导致抛出异常 线程 Thread 0 org eclipse swt S
  • android中listview显示数据库中的数据

    我是安卓新手 我想知道如何在列表视图中显示数据库中的数据 它不会向数据库添加数据 我只是显示我们存储在数据库中的任何内容 请帮助我实现这一目标 提前致谢 使用这些课程可能会对您有所帮助 用于数据库创建 package com example
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • TextInputLayout 对于在 EditText 中以编程方式给出提示没有效果

    我有一个 EditText 它的父级是 TextInputLayout 我试图以编程方式为 EditText 提供提示 不在布局中 在这种情况下 文本输入提示动画不起作用 它像简单的 EditText 一样工作 有人可以建议如何处理它吗 下
  • 即使 Android M 上的移动数据已打开(有连接),也可以通过 WiFi(无连接)发送请求

    我必须在没有互联网连接的情况下将 UDP 数据包发送到 WiFi 模块 配有自己的 AP 但是当我将手机连接到 AP 时 Android 会在移动数据接口上重定向我的数据包 因为它有互联网连接 我使用下面的代码来完成我的工作 但它似乎不适用
  • 我想在java中使用XQuery进行Xml处理

    我想用XQuery用于从 java 中的 Xml 获取数据 但我没有得到需要为此添加哪个 Jar 我在谷歌上搜索了很多 但没有得到任何有用的例子 例如我得到以下链接 https docs oracle com database 121 AD
  • 当您在数组列表上调用remove(object o)时,它如何比较对象?

    当您在 java 中的数组列表上调用remove object o 时 它如何比较对象以找到要删除的正确对象 它使用指针吗 或者它使用 Comparable 接口来比较对象吗 ArrayList remove 依赖于对象的实现Equal方法
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 屏幕开/关检测

    在这里 我试图确定屏幕是否打开 但按下电源锁定 解锁按钮时它似乎不起作用 应用程序运行没有错误 但 if else 中的代码似乎没有效果 Edited现在代码可以工作了 谢谢Olgun 但媒体播放器播放不会停止 并且每次在屏幕上 离屏时都会
  • 创建正则表达式匹配数组

    在Java中 我试图将所有正则表达式匹配返回到一个数组 但似乎您只能检查模式是否匹配某些内容 布尔值 如何使用正则表达式匹配来形成与给定字符串中的正则表达式匹配的所有字符串的数组 4城堡的回答 https stackoverflow com
  • 我在 PopupMenu 中使用 ShareActionProvider,但显示两个 PopupMenu?

    我在 PopupMenu 中使用 ShareActionProvider 但是当我单击共享菜单项时 它会在屏幕上显示两个 PopupMenus 一个被另一个覆盖 一个显示应用程序图标和名称 另一个仅显示应用程序名称 除了这个问题之外 它工作
  • JSch中如何设置文件类型和文件传输模式?

    我使用 Apache Common NetFTPClient并设置了我的ftpClient在上传文件之前使用如下所示的方法 ftpClient setFileType FTP BINARY FILE TYPE ftpClient setFi
  • 改变for循环的顺序?

    我遇到一种情况 我需要根据用户输入以不同的顺序循环遍历 xyz 坐标 所以我是 3D 空间中的一个区域 然后是一组像这样的 for 循环 for int x 0 x lt build getWidth x for int y 0 y lt
  • 由于“进程崩溃”,仪器运行失败。

    我想运行以下测试 package com xxx yyy import android content Context import androidx test InstrumentationRegistry import androidx
  • Hibernate HQL:将对值作为 IN 子句中的参数传递

    我面临一个问题 如何使用 IN 子句将查询中的成对值的参数传递给 HQL 例如 select id name from ABC where id reg date in x y 并且参数是不同的数据类型string id 和reg date
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr
  • 对于当前月份和日期但年份不同的日期,经过的月份计算未给出正确的结果

    我正在尝试计算自特定日期以来经过的月份 该函数工作正常 尽管如果我将今天的日期与过去的不同年份放在一起 它会给我一个月的差异 不到一个月 假设对于所有日期 该函数都运行良好 除了 如果今天是 2014 03 06 YYYY MM DD 并且
  • 防止Java实例化的正确方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么范围为“provided”的依赖项会隐藏 Maven 中的传递依赖项?

    我的 Maven 项目中有三个模块 这稍微简化了 model包含JPA注释的实体类 坚持实例化一个实体管理器并调用它的方法 应用创建类的实例model 设置一些值并将它们传递给坚持 model and 坚持显然取决于javax persis
  • Java、Spring、Hibernate找不到org.springframework.orm.hibernate3.LocalSessionFactoryBean

    我正在尝试制作 spring hibernate ant 项目 目前我收到此错误 HTTP Status 500 type Exception report message description The server encountere

随机推荐