1

我希望能够使用GameTime而无需每次在所有方法的参数中显式输入其名称。它只是在代码中看起来不太好。我怎样才能做到这一点?

4

4 回答 4

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
    }

}
于 2012-10-21T05:46:36.137 回答
1

你可以通过别的东西。我个人通常这样做:

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完全跳过将它传递给方法。


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

于 2012-10-21T05:50:02.913 回答
1

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

于 2012-10-22T11:28:08.443 回答
0

我刚刚发现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
    }
}
于 2012-10-21T06:07:38.297 回答