【问题标题】:How do I draw things differently depending on the case in XNA?我如何根据 XNA 中的情况绘制不同的东西?
【发布时间】:2014-06-19 17:54:20
【问题描述】:

我有一个StatBarView 类,其中包含一个Stat、一个int 命名百分比和两个Colors。在Update() 方法中,我平滑地改变了条形的百分比值,它必须有多满。接下来我有四种Draw() 方法,一种用于绘制小条,一种用于中型,一种用于大型,一种用于将其绘制为文本而不是图形。

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

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

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

也就是说,我不知道如何真正让这段代码更干净。有人能帮帮我吗?

【问题讨论】:

    标签: c# xna draw


    【解决方案1】:

    听起来你的最后一个例子/选择是正确的。它甚至还有一个名字,Strategy 模式。

    在此模式的基于类的版本中,您通常每次只需传入一个 new 对象(如您的示例中所示),但因为这是在 Draw 方法中,所以我只需要每个示例策略存储在您的类中并传递现有的引用。

    实现此模式的另一种方法是使用委托。为此,您可以让Draw 方法获取一个包含您需要的信息的委托。比如:

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

    然后,您可以将大、小、文本等的函数传递给此函数。 Action&lt;int&gt; 当然只是一个例子,你可以让它返回值或者根据需要接受额外的参数。

    如果文本版本不使用百分比,那代码味道,但你可能不需要太担心它。 策略绝对是这里的必经之路。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多