【发布时间】:2012-10-21 05:15:39
【问题描述】:
我希望能够使用GameTime,而无需每次都在我的所有方法的参数中明确输入其名称。它只是在代码中看起来不太好。我该怎么做?
【问题讨论】:
标签: c# parameters xna parameter-passing
我希望能够使用GameTime,而无需每次都在我的所有方法的参数中明确输入其名称。它只是在代码中看起来不太好。我该怎么做?
【问题讨论】:
标签: c# parameters xna parameter-passing
传递参数是 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
}
}
【讨论】:
你可以传递一些别的东西。我个人通常这样做:
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 方法。
除了传递参数之外,其他确实不是一个好主意,因为从概念上讲,您拥有的是特定于给定方法“树”的数据来电。
【讨论】:
具有公共静态属性 GameTime 的全局静态类,它将在每个 Game.Update() 开始时更新。然后所有对象将通过此属性访问该变量。但是,这被认为是一种不好的做法。
【讨论】:
我刚刚发现 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
}
}
【讨论】: