【问题标题】:How do I access higher level variables/objects in a child object?如何访问子对象中更高级别的变量/对象?
【发布时间】:2013-07-17 23:35:50
【问题描述】:

在 C# 中我还没有弄清楚如何做的事情如下:

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

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

我想知道的是:

  1. 如何在不将对象作为参数包含的情况下访问对象?
  2. 为什么我不能像这样访问它们:“Game.sound”,即使游戏中有声音?

【问题讨论】:

    标签: c# function oop xna


    【解决方案1】:

    只需在您的 Game 类中创建任何全局变量 static - 意思是,它们不是 Game 实例的一部分,而是可以全局访问。

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

    现在你的播放器类可以做到
    Game.sound.Play();
    或任何它需要的东西。

    【讨论】:

    • 谢谢!这成功了。我需要将 SoundEffect 设为公共静态。
    【解决方案2】:

    soundGame 的任何特定实例的属性。

    您只能从特定实例中获取它。

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

    【讨论】:

    • 感谢您的回复!目前我不确定 XNA 如何处理主 Game 类,但我不认为它是静态的,我不知道 Game 是否是实例。谁能澄清一下?
    • @user2593449:我从未使用过 XNA,但静态和实例是相反的。要么它是一个静态类,并且它的所有成员都是静态的,并且你的代码可以工作,要么它是一个至少具有实例的常规类。后者的可能性更大。
    【解决方案3】:

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

    但是,

    您可以将它们包装起来,然后将它们传递给播放器。像这样的:

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

    【讨论】:

      猜你喜欢
      • 2010-12-11
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 2014-08-20
      相关资源
      最近更新 更多