我正在尝试更新播放器运行状况更改后在屏幕上呈现的文本。 我遇到的问题是决定在哪里更新这个。 玩家和健康graphics是独立的对象。
目前,我的代码是这样组织的:主c ++有vector:
“Renderables”是可以呈现的任何东西。 它有一个成员函数render(),它被调用vector中的每个对象。 一个“文本”类从它inheritance。 它包含在屏幕上显示的string。 “文本”具有自己的渲染函数,并在其渲染函数中调用其成员函数getString()。
问题是,一旦玩家的健康状况发生变化,我应该在哪里更新这个string呢?
我现在的解决scheme实际上是有一个“文本”的“PlayerHealth”子类,它包含一个指向玩家的指针。 这样,“PlayerHealth”可以重新定义getString(),将player-> health转换为string,并使用“Text”的渲染函数。 但我被告知这不是一个很好的方法,并想知道这个问题还有什么其他的方法。
感谢您的时间
从根本上说,您需要在Player
和与该玩家相关的可能多组Text
之间创建某种关联。 当你有这种关联时,你可以(取决于你如何实现关联):
Text
从Player
或玩家推送到正确的Text
Player
中拉出新的播放Player
Text
有几种方法来建立这个链接; 对Text
子类化并创建引用Player
的PlayerHealth
是单向的,但是不能很好地扩展。 你最终不得不创建很多小的子类,可能会造成可维护性问题。
一个更好的select可能是给Player
一个指向与玩家相关的Text
对象的指针。 也许他们需要一个指向Text
的指针来代表他们的健康,一个是他们的名字,一个是debugging信息,比如世界上的位置,等等。
这允许您轻松地从Player
推送文本更新,但并不需要对播放器部分中的Text
进行任何管理(除了知道Text
存在),因此您可以保留您的分离。
现在比较常见的方法是去找一个完整的“基于组件的实体系统”(或者说“ECS”),并把玩家作为一个具有不同组件的通用实体对象,例如每个相关文本的组件。 这个选项是更通用的,并且在两个系统之间放置了更多的抽象缓冲区(可能),但也是更多的工作来实现,并且可能成为devise分析瘫痪的来源。 所以,如果你走这条路线,请记住专注于你的具体目标。