所以我正致力于在我正在开发的游戏中添加实体,我想知道构建敌人AI的最佳方式是什么。
我有一个构建了所有常用函数的entity对象,目前我正在用两个函数控制该实体的作用
entity.prototype.runMeleeAI = function(){
//makes the enemy make melee attacks
}
entity.prototype.runRangedAI = function(){
//makes the enemy make ranged attacks
}我在哪个函数与来自任何类型的实体的属性一起运行之间进行切换,例如
const entityTypes = {
"slime":{
"AiType": "ranged"
}}然而,我想知道如果我想让一个实体拥有一个不同于这两种类型的AI,我应该如何管理它,我应该只创建一个新函数,例如
entity.prototype.runDashAi = function(){
//do stuff
}
entity.prototype.runBossAI = function(){
//do stuff
}然后,如果我想要一个实体的特殊AI,我可以将其设置为其中之一
或者,有没有更好的方法来组织这件事?我想要有许多不同的AI类型,只用于一种类型的实体
我应该在单独的文件中编写AI函数,然后在entity对象上传递它们吗?或者,有没有一种我没有想到的完整的方法?
发布于 2021-07-21 08:04:23
如果你不熟悉它,可以做一些关于继承和多态性的研究;维基百科上关于多态性的文章看起来“还行”,但这个问题可能是一个更好的开始:What is the main difference between Inheritance and Polymorphism?
基本上,您的AI函数控制实体-其中将有许多变化;要做到这一点,您需要的是实体和AI函数之间的某种级别的兼容性。继承可以让你做到这一点--只需编写一个所有AI函数都可以使用的基本实体类型,比如LandVehicleEnemy,并创建继承它的特定敌人。
下面是一些伪代码:
class LandVehicleEnemy{ ... } // can move X-Y
class FlyingVehicleEnemy{ ... } // can move X-Y-Z
class JeepEnemy : LandVehicleEnemy{ ... }
class TankEnemy : LandVehicleEnemy{ ... }
class GiantCowWithLaserEyesEnemy : LandVehicleEnemy{ ... }你甚至可能在单个敌人级别上存在差异(Jeep vs Tank vs Giant-Cow-With-激光眼),一种可行的方法可能是让AI函数使用在基础级别声明的属性,但在敌人级别定义,例如:
class LandVehicleEnemy{
int AttackSpeed = 100;
}
class JeepEnemy : LandVehicleEnemy{
// int AttackSpeed - not set, use base value.
}
class GiantCowWithLaserEyesEnemy : LandVehicleEnemy{
int AttackSpeed = 100000;
}作为设计的一部分,你需要仔细考虑实体的数量和它们之间的变化量;诀窍是让你的设计足够灵活,而不是让它变得过于复杂。
最后,除了继承之外,还使用接口(契约)。在C#这个面向对象友好的领域,这对我来说工作得很好,我的javascript知识非常陈旧。这可能会给你一些启示:Does JavaScript have the interface type (such as Java's 'interface')?
https://stackoverflow.com/questions/68461674
复制相似问题