C# 如何访问子对象中的高级变量/对象?

C# 如何访问子对象中的高级变量/对象?,c#,function,oop,xna,C#,Function,Oop,Xna,下面是我在C#中从未想到的方法: 假设我有两个类:Game.cs和Player.cs 我发现属于Game.cs的任何内容都必须通过属于Player.cs的任何函数的参数传递。例如,如果我在游戏中加载了一个声音效果,并且玩家是游戏的孩子,并且玩家有一个函数“PlaySoundEffect()”,那么玩家可以访问该声音的唯一方法是通过参数:“PlaySoundEffect(SoundEffect sound)” 我想知道的是: 如何访问对象而不将其作为参数 为什么我不能像这样访问它们:“游戏。声音”

下面是我在C#中从未想到的方法:

假设我有两个类:Game.cs和Player.cs

我发现属于Game.cs的任何内容都必须通过属于Player.cs的任何函数的参数传递。例如,如果我在游戏中加载了一个声音效果,并且玩家是游戏的孩子,并且玩家有一个函数“PlaySoundEffect()”,那么玩家可以访问该声音的唯一方法是通过参数:“PlaySoundEffect(SoundEffect sound)”

我想知道的是:

  • 如何访问对象而不将其作为参数
  • 为什么我不能像这样访问它们:“游戏。声音”,即使声音在游戏中

  • 声音
    游戏
    的任何特定实例的属性

    您只能从特定实例获取它


    相反,您可以添加一个
    游戏
    实例作为
    玩家
    的属性,这样每个玩家都有一个对其游戏的引用。

    您无法访问它们,因为它们不是静态的

    但是,

    你可以把它们包起来,传给球员。大概是这样的:

    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.
    }
    

    只需在游戏类中设置任何全局变量
    静态
    ——也就是说,它们不是游戏实例的一部分,而是全局可访问的

    例如,在游戏中.cs
    SoundEffect声音
    变成
    静态音效声音

    现在,您的玩家类只需执行
    Game.sound.Play()

    或者它需要的任何东西。

    谢谢您的回复!目前我不确定XNA如何处理主游戏类,但我不认为它是静态的,我也不知道这个游戏是否是一个实例。有人能澄清一下吗?@user2593449:我从未使用过XNA,但static和instance是对立的。要么它是一个静态类,并且它的所有成员都是静态的,您的代码可以工作,要么它是一个至少具有实例的常规类。后者更有可能。谢谢!这就成功了。我需要把音效变成一个公共静态效果。