|
|
1
4
这是典型的“行为组合”问题。权衡的是,行为越独立,他们之间的互动就越困难。 从游戏编程的角度来看,最简单的解决方案是决定一组“核心”或“引擎”数据,并将其放在主对象中,然后让行为能够访问和修改该数据-可能通过功能接口。 如果您想要特定于行为的数据,这很好,但是为了避免变量名称中的冲突,您可能需要使用于访问它的接口包含行为名称。像:
这样,两个行为都可以定义自己的变量,称为速度而不是碰撞。这种类型的交叉行为getter和setter允许在需要时进行通信。 为此,我建议您考虑使用Lua或Python之类的脚本语言。 |
|
|
2
2
您可以从WPF(附加属性)中借用模式。WPF人员需要一种在运行时将属性附加到控件的方法。(例如,如果将控件放在网格中,则该控件最好有一个行属性——它们对附加属性进行了伪操作。 它的工作方式如下:(注意,这可能与WPF的实现不完全匹配,而且我省略了依赖属性注册,因为您不使用XAML)
这里的问题是,行为拥有财产,但你不必去洞穴探险来获得它这里有一些代码来检索暴徒的移动速度:
|
|
|
3
2
如果它与行为相关,并且只在该行为的上下文中有意义,那么它应该作为它的一部分存储。 移动速率只对可以移动的东西有意义。这意味着它应该作为对象的一部分存储,表示它的移动能力,这似乎是您的移动行为。 如果这使得访问变得太困难,听起来更像是您的设计问题。那么问题不是“我应该作弊,将一些变量放在mob类中而不是它所属的行为”,而是“我如何使与这些个人行为的交互更容易”。 我可以想出几种方法来实现这一点。显而易见的是mob类上的一个简单成员函数,它允许您选择单个行为,如下所示:
其他人可以这样做:
您也可以将其中的一部分放在mob类之外,创建一个助手函数,该函数修改移动速率(如果存在),否则不执行任何操作:
然后其他人可以这样使用它:
这将提供修改行为的简单访问,但不会弄乱mob类。(当然,将其转换为扩展方法是很有诱惑力的,但这可能会导致mob类的公共接口中出现太多的混乱。最好明确说明这是驻留在mob类本身之外的助手功能) |
|
|
4
2
看看组件系统/实体系统设计: http://www.devmaster.net/articles/oo-game-design/ 到目前为止我所见过的最好的。 聪明的人说这是玩大型游戏的唯一方法,但这需要改变你对OOP的看法。 |
|
|
5
0
你想做什么?存储移动速率数据的最简单方法是什么? 如果只在moveBehavior类中需要它,那么它应该在其中:
如果mob类本身就需要它,那么通过mob类更容易暴露出来:
所以这一切都取决于你试图用这个行为逻辑实现什么。我建议你推动设计决策,直到你真的需要这样或那样做。首先集中精力做简单的事情,然后重构。通常情况下,进行早期的设计猜测会导致架构过于复杂。 更务实的解决方案
我的意思是你实现了你想从运动到
当它生效时,将该实现
之后,如果您确实需要执行多种类型的行为,但它们共享一个公共接口,那么在此之前创建该接口,并让行为实现该接口。 |
|
6
0
编辑:下面的答案只有当你没有为每一个暴徒展示一个新的移动行为,但只有一个单一的移动行为才真正有意义。
我想说黑帮(呃,我讨厌游戏NPC这个词,但这不是你的错)应该在什么时候
|
|
|
7
0
如果我正在设计这样的东西,我会尝试使用接口来定义暴徒的行为:
这样你就可以通过这样的方式来检查暴徒是否可以移动:
|
|
|
8
0
imho,移动速度与移动行为相关,而不是与暴徒本身相关,正如你所说,它不一定移动。所以变量应该和行为联系在一起,移动率的改变是对他的行为的改变,而不是对暴徒本身的改变。 您还可以创建一个基本mob类,并派生一个movingmob类。但我想,这并不真正适用,一旦很明显你可以任意组合不同的行为… --编辑—— 首先,显然在同一个mob中不会有两次相同的行为类型(例如,没有一个mob具有相同类型的两个movementbehaviors),因此在这种情况下,集合是更好的选择,因为它可以避免重复 你可以在每一个黑帮中找到一个方法
一旦你有了暴徒,你就可以做任何你想做的事情。此外,还可以更改gethashcode()和equals()方法以确保没有重复项,或者使getbehavior方法更快(常量时间) |