0

我正在尝试设置一个战斗系统,允许用户在近战攻击和远程攻击之间进行选择(选择两个单选按钮之一)。基于变量按钮可以说什么动作,“超出范围”,“攻击近战”,“攻击范围”,“重新加载范围”。onresume 单选按钮具有正确的文本。在第一次射击远程武器后(战斗开始时远程武器已经重新加载) rangeRadio 的文本变为“重新加载范围”但不会从“重新加载范围”变回“攻击范围”,即使武器“重新加载”并且当我结束回合(和预置动作)时会开火造成伤害。如果武器需要 2 回合才能重新装填。我花了 2 轮重新加载,单击主页按钮然后返回活动它会正确设置文本并说“

找到radioButtons,if语句首先检查是否有远程武器装备(rangeId == 50表示没有武器)然后检查武器是否已加载(int rangeReload = 100),然后最后检查是否在攻击范围内/火。

    private void setActions(){
         RadioButton meleeRadio = (RadioButton) findViewById(R.id.meleeRadio);
         RadioButton rangeRadio = (RadioButton) findViewById(R.id.rangeRadio);
            if (meleeRange >= distance){meleeRadio.setText(meleeString);}else{meleeRadio.setText(oorString);}
            if (rangeId == 50){rangeRadio.setText(norangeString);}else{if(rangeReload<=99){rangeRadio.setText(reloadString);}else{
            if (rangeRange >= distance){rangeRadio.setText(rangeString); Log.e(rangeString, "Range Attack called");}else{rangeRadio.setText(oorString);}}}
    }

我调用 setActions(); 在两个地方。在 onresume 通过 preCombat() -> layoutcombat()

@Override
protected void onResume() {     
    new pullCombatActions().execute();
    new prepCombat().execute();
    super.onResume();}


    private class prepCombat extends AsyncTask<String, Void, String>{

        @Override
        protected String doInBackground(String... params) {
            playerBattlePrep();
            findNPC();
            return null;}
        @Override
        protected void onPostExecute(String result) {
            new layoutCombat().execute();
        }
     }

    private class layoutCombat extends AsyncTask<String, Void, String>{

        @Override
        protected String doInBackground(String... params) {
            startCombat();
            pullCombatText();
            return null;}
        @Override
        protected void onPostExecute(String result) {
            setActions();
            popStats();
            refreshStats();
            combatStartText();}
     }

第二个地方我叫 setActions(); 在我的 AsyncTask 中,我在战斗回合结束时运行以刷新屏幕并通过滚动向用户展示发生了什么。

private class replaceScreen extends AsyncTask<String, Void, String>{

    @Override
    protected String doInBackground(String... params) {
        pullCombatStory();
        return null;
    }
    @Override
    protected void onPostExecute(String result) {
        refreshStats();
        refreshCombatStory();
        highLightPlayerActions();
        highLightNpcActions();
        setActions();
        }
    }

我不明白为什么在设置 rangeRadio 时它似乎在我的 if 语句中途停止,但 onResume 让它一直完成并为 rangeRadio 显示正确的文本。

4

2 回答 2

0

只是一个建议,尝试移动

     RadioButton meleeRadio = (RadioButton) findViewById(R.id.meleeRadio);
     RadioButton rangeRadio = (RadioButton) findViewById(R.id.rangeRadio);

在您的 onResume 方法之外,并将其放在您的 onCreate(或 onActivityCreated,如果它是一个片段)方法上,并将 rangeRadio 和 meleeRadio 作为私有变量放在您的活动(或片段)中

然后,由于您使用的是链式 AsyncTasks,因此我不确定您的所有 onPostExecute 是否都在您的 UI 线程上运行,因此我会尝试将您对 rangeRadio.setText() 的所有调用封装在这样的处理程序上:

在您的活动 onCreate 上:

handler =  new Handler();

然后在设置文本时:

handler.post(new Runnable() {

            public void run() {
                rangeRadio.setText("...");

            }
        });
于 2012-04-13T08:58:18.610 回答
0

TY 的帮助。在我匆忙寻找一个好的停车地点时,我忘记了在角色重新加载时设置 AsyncTask。因此,当玩家因为超出范围或玩家重新加载而没有攻击时,不会调用 setActions()。

于 2012-04-13T19:51:17.013 回答