0

ユーザーが近接攻撃と遠隔攻撃を選択できるようにする戦闘システムをセットアップしようとしています (2 つのラジオ ボタンのいずれかを選択します)。変数に基づいて、ボタンが「範囲外」、「近接攻撃」、「攻撃範囲」、「リロード範囲」などのアクションを言うことができます。onresume radioButtons には正しいテキストがあります。初めて遠隔武器を発射した後 (遠隔武器が既にリロードされた状態で戦闘が開始されます) 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(); を呼び出します。2か所で。preCombat() -> layoutcombat() 経由の onresume で

@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(); と呼ぶ 2 番目の場所。戦闘ターンの最後に実行して画面を更新し、ロールを介して何が起こったかをユーザーに表示する 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()へのすべての呼び出しをカプセル化しようとします。

on Activity 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 に答える