簡體   English   中英

在另一個類中使用對象特定的變量

[英]Using a object specific variable in another class

我一直在尋找所有其他問題,但我似乎找不到問題的答案:我需要使用一個非靜態字段(對於我創建的每個對象都是獨立的),並且需要在另一個字段中訪問該變量類。 代碼片段:(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);
    }
}

和我需要在其中變量variableStage的 :(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();
        }
    }

我現在從仇敵坦克1.getEnemyStage()得到的值是0,因為我相信我用敵人坦克制造了一個新物體敵人坦克1 =新敵人坦克(mygame); 如何引用現有對象並獲得特定值? evilStage用於檢查怪物是否死亡或幾乎死亡。

提前Thx :)火焰

您需要利用多態性。 GameItem類中聲明方法getEnemyStage (或者是接口?),然后您可以詢問collidedItem.getEnemyStage()並從該對象中獲取數據。 可替代地,所述向下轉換 collidedItemEnemyTank並調用該方法: ((EnemyTank)collidedItem).getEnemyStage()

另外,將enemyStage private ,無需public ,因為可以通過調用getter方法間接訪問它。

if (collidedItem instanceof Enemytank && playerShields > 0 && 
    ((Enemytank)collidedItem).getEnemyStage() != 3) {
  ....
}

當您調用沖突對象時,您將給對象傳遞一個引用。 因此,將沖突更改為:

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(collidedItem, this); //where this refrence to this object (which is a EnemyTank)

有了這個答案,我假設您是從EnemyTank類中調用collisonOccured的,因為您沒有在該調用的位置發帖。 如果沒有,你需要一個refrence到EnemyTank的對象,當你調用collisionOccured(並因此改變this在調用refrence到正確的對象)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM