我希望能够使用GameTime
而无需每次在所有方法的参数中显式输入其名称。它只是在代码中看起来不太好。我怎样才能做到这一点?
4 回答
很好地传递参数是 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
}
}