2013-07-17 57 views
0

我從來沒有想出如何在C#中做的事情如下:如何訪問子對象中更高級別的變量/對象?

說我有兩個類:Game.cs和Player.cs。

我發現屬於Game.cs的任何東西都必須通過屬於Player.cs的任何函數的參數傳遞。例如,如果我在Game中加載了聲音效果,並且Player是Game的子項,並且Player具有「PlaySoundEffect()」函數,則Player可以訪問該聲音的唯一方法是如果將它傳遞給參數: 「PlaySoundEffect(SoundEffect中的聲音)」

我想知道的是:

  1. 我怎樣才能不包括他們作爲一個參數訪問對象(S)?
  2. 爲什麼我不能像這樣訪問他們:「Game.sound」,即使聲音在遊戲中?

回答

0

只要能使你的遊戲類static任何全局變量 - 這意味着,他們不是遊戲實例的一部分,而是在全球範圍內訪問。

EG,在Game.cs
SoundEffect sound;
成爲
static SoundEffect sound;

現在您的播放器類可以做
Game.sound.Play();
或任何需要。

+0

謝謝!這個伎倆。我需要使SoundEffect成爲公共靜態。 – user2593449

0

sound任何特定實例Game的屬性。

您只能從特定實例中獲取它。

相反,您可以添加一個Game實例作爲Player的屬性,以便每個玩家都可以參考其遊戲。

+0

感謝您的迴應!目前我不確定XNA是如何處理主要的遊戲類的,但我不認爲它是靜態的,我不知道遊戲是否是一個實例。任何人都可以澄清? – user2593449

+0

@ user2593449:我從來沒有使用XNA,但靜態和實例是相反的。要麼它是一個靜態類,並且它的所有成員都是靜態的,並且您的代碼可以工作,或者它是一個至少具有實例的常規類。後者更可能。 – SLaks

0

您不能訪問它們,因爲它們不是static

但是,

你可以包裝它們,並將它們傳遞給玩家。事情是這樣的:

class GameSoundManager { 
    public SoundEffect PlayerDie { get; set; } 
} 

class Game { 
    private GameSoundManager _soundManager; 
    private Player _player; 

    public Game() { 
     _soundManager = new GameSoundManager() { 
      PlayerDie = // load the sound 
     }; 

     _player = new Player(_soundManager); 
    } 
} 

class Player { 
    private GameSoundManager _soundManager; 

    public Player(GameSoundManager soundManager) { 
     _soundManager = soundManager; 
    } 

    // use _soundManager.PlayerDie anywhere in your player class. 
}