【问题标题】:How can I use GameTime without passing it over and over again through parameters?如何在不通过参数一遍又一遍地传递 GameTime 的情况下使用它?
【发布时间】:2012-10-21 05:15:39
【问题描述】:

我希望能够使用GameTime,而无需每次都在我的所有方法的参数中明确输入其名称。它只是在代码中看起来不太好。我该怎么做?

【问题讨论】:

    标签: c# parameters xna parameter-passing


    【解决方案1】:

    传递参数是 OOP 的基础,但一个建议是有一个用 GameTime 初始化的基类,然后从它扩展所有类。这样您就可以作为受保护的成员访问它。

    public class BaseClass 
    {
        protected BaseClass(GameTime gt) 
        {
            Time = gt;
        }
    
        protected GameTime Time {private set; protected get;}
    
    }
    
    public class SomeOtherClass : BaseClass
    {
        public SomeOtherClass(GameTime gt) : base(gt)
        {
        }
    
        public void DoSomething() 
        {
            //can access Time here
        }
    
    }
    

    【讨论】:

    • 我可以对主游戏类执行此操作,以便可以从游戏的任何方法访问游戏时间吗?
    【解决方案2】:

    你可以传递一些别的东西。我个人通常这样做:

    float seconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
    something.Update(seconds);
    otherThing.Update(seconds);
    

    这将使您不必在每次要使用它时提取经过的时间(以秒为单位)。


    如果您想节省一些打字时间,可以这样做:

    interface IHasUpdate { void Update(float seconds); }
    

    然后,如果您在您的类上实现IHasUpdate 接口,只需单击一两次或使用快捷键,您就可以让Visual Studio 为Update 创建所需的存根。这具有额外的优势,您将能够推理 IHasUpdate 的对象。


    如果你发现自己必须传递很多“东西”,你可以创建一个这样的结构:

    struct UpdateContext { float seconds; PlayerInput input; SomethingElse blah; }
    

    如果您需要为 Update 方法添加新参数,您可以轻松地将新内容添加到“更新上下文”中。


    当然,您通常不需要知道绘制时间,因此您可以完全跳过将其传递给Draw 方法。


    除了传递参数之外,其他确实不是一个好主意,因为从概念上讲,您拥有的是特定于给定方法“树”的数据来电。

    【讨论】:

      【解决方案3】:

      具有公共静态属性 GameTime 的全局静态类,它将在每个 Game.Update() 开始时更新。然后所有对象将通过此属性访问该变量。但是,这被认为是一种不好的做法。

      【讨论】:

        【解决方案4】:

        我刚刚发现 GameTime 在主 Update 方法执行过程中不会发生变化,因此我可以安全地在本地 GameTime 变量中使用它的副本,如下所示:

        public class Game1 : Microsoft.Xna.Framework.Game
        {
            public GameTime gt;
        
            /* ... */    
        
            protected override void Update(GameTime gameTime)
            {
                gt = gameTime;
        
            // the rest of the Update method
            }
        }
        

        【讨论】:

        • 这可行,但它是一个不好的做法 - 方法签名应该告诉你关于某个方法你需要知道的一切。如果您使用的是全局变量,那么您的方法的输入不会显示在其签名中。这使得维护变得困难。
        • 这个项目只是我的,所以我不介意这样的东西没有出现在我的方法签名中,我会说这样更好。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-25
        • 1970-01-01
        • 1970-01-01
        • 2015-02-14
        • 2022-01-04
        • 1970-01-01
        • 2012-04-06
        相关资源
        最近更新 更多