1

私は他のすべての質問を調べてきましたが、私の問題に対する答えが見つからないようです:非静的フィールド(作成するオブジェクトごとに個別)を使用する必要があり、別の変数でその変数にアクセスする必要がありますクラス。コードの一部: (Enemytank.java)

public class Enemytank extends MoveableGameItem implements IStepListener, IAlarmListener
{
    private Battlefield mygame;

    private Enemytank enemyTank1;   
    private static int enemyWaveSize = 1;
    private static int remainingKills = enemyWaveSize;
    private static double startupEnemyHealth = 100.00;
    private double enemyHealth = startupEnemyHealth;
    public int enemyStage = 0;              


    /**
     * Constructor.
     */
    public Enemytank(Battlefield mg)
    {
        mygame = mg;
        setImage("/images/enemytank.png", 27, 33);
        setPosition(25, 35);
        // snelheid 5, naar rechts
        setDirectionSpeed(0, 4);
        startMoving();
        mygame.addStepListener(this);
    }
}

そして、変数enemyStageが必要なクラス:(Playertank.java)

public void collisionOccured(GameItem collidedItem)
    {
        Enemytank enemyTank1 = new Enemytank(mygame);
        System.out.println("pt= " + enemyTank1.getEnemyStage());
        if ((collidedItem instanceof Enemytank) && (playerShields > 0) && (enemyTank1.getEnemyStage() != 3))
        {
            this.playerShields--;
            mygame.setShieldsonDashboard(playerShields);

        }
        else if ((collidedItem instanceof Enemytank) && (playerShields <= 0) && (enemyTank1.getEnemyStage() != 3))
        {
            System.out.println("hit player!");
            this.playerLives--;
            mygame.setLivesonDashboard(playerLives);
        }
        if (collidedItem instanceof Shield)
        {
            this.playerShields++;
            mygame.setShieldsonDashboard(playerShields);
            mygame.deleteGameItem(collidedItem);
            this.playerUpgrades();
        }
    }

私が今、enemyTank1.getEnemyStage() から得た値は 0です。. 既存のオブジェクトを参照して、その特定の値を取得するにはどうすればよいですか? モンスターが死んでいるか、ほぼ死んでいるかどうかを確認するには、enemyStage を使用します。

事前にThx :)炎

4

2 に答える 2

0

collisionOccured を呼び出すときに、オブジェクトに参照を渡します。したがって、collisionOccured を次のように変更します。

public void collisionOccured(GameItem collidedItem, Enemytank enemyTank) //a change here
    {
        System.out.println("pt= " + enemyTank.getEnemyStage()); // now you can call enemyTank with the correct refrence
        if ((collidedItem instanceof Enemytank) && (playerShields > 0) && (enemyTank1.getEnemyStage() != 3))
        {
            this.playerShields--;
            mygame.setShieldsonDashboard(playerShields);

        }
        else if ((collidedItem instanceof Enemytank) && (playerShields <= 0) && (enemyTank.getEnemyStage() != 3))
        {
            System.out.println("hit player!");
            this.playerLives--;
            mygame.setLivesonDashboard(playerLives);
        }
        if (collidedItem instanceof Shield)
        {
            this.playerShields++;
            mygame.setShieldsonDashboard(playerShields);
            mygame.deleteGameItem(collidedItem);
            this.playerUpgrades();
        }
    }

そして、EnemyTank クラス内から collisionOccured を呼び出すと、次のようになります。

collisionOccured(collidedItem, this); //where this refrence to this object (which is a EnemyTank)

この回答では、呼び出しが行われている場所を投稿していないため、EnemyTank クラス内から collisonOccured を呼び出すと仮定します。そうでない場合は、collisionOccured を呼び出すときに EnemyTank のオブジェクトへの参照が必要です (したがってthis、正しいオブジェクトへの参照への呼び出しを変更します)。

于 2012-04-20T11:30:52.737 に答える
0

ポリモーフィズムを活用する必要があります。getEnemyStageクラスでメソッドを宣言するGameItem(またはインターフェイスですか?) と、collidedItem.getEnemyStage()正確にそのオブジェクトからデータを要求して取得できるようになります。または、 をダウンキャストcollidedItemEnemyTankメソッドを呼び出します。((EnemyTank)collidedItem).getEnemyStage()

また、getter メソッドを呼び出すことで間接的にアクセスするため、 makeenemyStage privateは必要ありません。public

if (collidedItem instanceof Enemytank && playerShields > 0 && 
    ((Enemytank)collidedItem).getEnemyStage() != 3) {
  ....
}
于 2012-04-20T11:27:43.383 に答える