根据XNA中的情况,我如何以不同的方式绘制内容?

时间:2014-06-19 17:54:20

标签: c# xna draw

我有一个StatBarView类,其中包含Statint命名百分比和两个Color。在Update()方法中,我可以平滑地改变条形图的百分比值,它有多充实。接下来,我有四个Draw()方法,一个用于绘制小的条形图,一个用于绘制介质,一个用于大型,一个用于将其绘制为文本而不是图形。

它有效,但是......如果我想实现更多的绘图案例,我觉得这会变得一团糟。

我可以将“文本视图”转换为它自己的StatTextView,但这只会将问题移到其他地方。我还想避免将各种参数传递给draw方法,如果我想改变一些东西的大小,它会让我到处运行。我还想避免一些使用switch语句的大量方法,感觉更糟。

我考虑过IStatBarContext传递Draw(int percentage),这会有效,但感觉非常复杂。 我是否必须在Stat.Draw(spriteBatch, position, new StatBarLarge())的每次迭代时调用Draw()?这是每秒无用的新对象。此外,new StatBarString()不会使用该百分比统计数据。我想我的设计出了问题。

那就是说,我不知道如何让这个代码变得更干净。有人会帮助我吗?

1 个答案:

答案 0 :(得分:2)

听起来你的最后一个例子/选择就是现场。它甚至有一个名称,策略模式。

在这个模式的基于类的版本中,通常每次都会传入一个new对象(如在您的示例中),但因为这是在Draw方法中,我只会存储在您班级中的每个策略的样本,并传递现有的参考。

实现此模式的另一种方法是使用委托。为此,您可以使用Draw方法获取所需信息的代理人。类似的东西:

public void Draw(SpriteBatch spriteBatch, Vector3 position, Action<int> drawStrategy)
{
   ...
   drawStrategy(percentage);
}

然后,您可以将大,小,文本等函数传递给此函数。 Action<int>当然只是一个示例,您可以根据需要返回值或采用其他参数。

如果文本版本不使用百分比,那么 是一种代码味道,但您可能不需要担心它。 战略绝对是走到这里的方式。