2012-04-20 102 views
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,因爲我相信我用Enemytank enemyTank1 = new Enemytank(mygame)創造了一個新對象;。我怎樣才能引用現有的對象,並獲得具體的價值? enemyStage用於檢查怪物是否已經死亡或幾乎死亡。

提前THX :) 火焰

+1

你是什麼意思?「我如何引用現有對象,獲得具體的價值?「。你感興趣的現有對象是什麼?您可能想要顯示更多的代碼。 enemyStage如何以及在哪裏設置? – Raam 2012-04-20 11:26:08

回答

0

您需要利用多態。在GameItem類中聲明方法getEnemyStage(或者它是接口?),然後您將能夠詢問collidedItem.getEnemyStage()並從該對象中獲取數據。另外,低垂collidedItemEnemyTank並調用該方法:((EnemyTank)collidedItem).getEnemyStage()

此外,還要enemyStageprivate,沒必要public,因爲它會間接訪問,通過調用getter方法。

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

-MoveableGameItem.java是一個抽象類,它擴展了GameItem -GameItem.java也是一個抽象類 – Flame 2012-04-20 11:37:10

+0

也GameItem.java延伸到沒有。我不能在那裏做getEnemyStage(),因爲它沒有看到Enemytank.java的任何東西嗎?我試圖擴展battlefield.Enemytank(它在另一個包中),但它說一些superconstructor是undefined – Flame 2012-04-20 11:58:48

+0

嘗試更新的答案中的代碼。我就是這個意思。 – 2012-04-20 12:04:18

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時(因此在改變this以引用正確的對象時),你需要參考EnemyTank的一個對象。

+0

我不能這樣做,因爲方法collisionOccured在MoveableGameItem.java中,它擴展到GameItem.java。我不能指向'Enemytank enemyTank' – Flame 2012-04-20 11:51:00

相關問題