在哪里更新播放器健康文本graphics? (C ++)

我正在尝试更新播放器运行状况更改后在屏幕上呈现的文本。 我遇到的问题是决定在哪里更新这个。 玩家和健康graphics是独立的对象。

目前,我的代码是这样组织的:主c ++有vector:

  • vector<播放器>
  • vector<可装入物>

“Renderables”是可以呈现的任何东西。 它有一个成员函数render(),它被调用vector中的每个对象。 一个“文本”类从它inheritance。 它包含在屏幕上显示的string。 “文本”具有自己的渲染函数,并在其渲染函数中调用其成员函数getString()。

问题是,一旦玩家的健康状况发生变化,我应该在哪里更新这个string呢?

我现在的解决scheme实际上是有一个“文本”的“PlayerHealth”子类,它包含一个指向玩家的指针。 这样,“PlayerHealth”可以重新定义getString(),将player-> health转换为string,并使用“Text”的渲染函数。 但我被告知这不是一个很好的方法,并想知道这个问题还有什么其他的方法。

感谢您的时间

从根本上说,您需要在Player和与该玩家相关的可能多组Text之间创建某种关联。 当你有这种关联时,你可以(取决于你如何实现关联):

  • 将新玩家健康TextPlayer或玩家推送到正确的Text
  • 从文本中的Player中拉出新的播放Player Text

有几种方法来建立这个链接; 对Text子类化并创建引用PlayerPlayerHealth是单向的,但是不能很好地扩展。 你最终不得不创建很多小的子类,可能会造成可维护性问题。

一个更好的select可能是给Player一个指向与玩家相关的Text对象的指针。 也许他们需要一个指向Text的指针来代表他们的健康,一个是他们的名字,一个是debugging信息,比如世界上的位置,等等。

这允许您轻松地从Player推送文本更新,但并不需要对播放器部分中的Text进行任何管理(除了知道Text存在),因此您可以保留您的分离。

现在比较常见的方法是去找一个完整的“基于组件的实体系统”(或者说“ECS”),并把玩家作为一个具有不同组件的通用实体对象,例如每个相关文本的组件。 这个选项是更通用的,并且在两个系统之间放置了更多的抽象缓冲区(可能),但也是更多的工作来实现,并且可能成为devise分析瘫痪的来源。 所以,如果你走这条路线,请记住专注于你的具体目标。