Articles of fsm

人物行为应该被视为国家吗?

所以我已经在一个团队里工作了好几个月,我们正在用角色扮演一些非常糟糕的问题。 问题以粗体显示。 附带的信息在下面。 对于具有其他动作并发性的复杂角色动作,我将如何使用HSM重构我们当前的系统(见下文)。 正如我迄今为止所做的那样引起了并发问题。 我们目前有这些“州/行动”的人物。 闲 跑步/运动 攻击 跳跃 落下 在跳跃时攻击 下降时攻击 运动时跳跃 运动在下降 和更多… 我们开始使用FSM来跟踪角色的所有状态,但是它变得庞大而难以管理。 当我们创建一个只能根据一些先决条件执行的新动作和/或导致当前状态改变时,我们必须确保检查所有的状态。 这里是我们移动代码中的一小段代码,它试图确定角色是否应该进入空闲状态。 if (CurrentPosition == PreviousPosition && animator != null && mState.CurrentHas(StateFlags.Landed) == false && mState.CurrentHas(StateFlags.InAir) == false && mState.CurrentHas(StateFlags.Attacking) == false && mState.CurrentHas(StateFlags.Stunned) == false && mState.CurrentHas(StateFlags.Hurting) == false && mState.CurrentHas(StateFlags.Falling) == false && mState.CurrentHas(StateFlags.FallingNonJump) == false […]

具有多个并发状态的有限状态机

我正在使用一个FSM玩家实体,它工作正常。 目前该实体只有一个国家,只有一个国家(例如瘫痪)。 实体的状态process()方法每轮调用一次。 然而,每个实体必须同时拥有一个以上的状态(例如瘫痪和不知情)是必要的。 每个状态都会影响实体属性,例如瘫痪会将步行范围缩小到10%,而失明将其降低到50%。 视力范围不受瘫痪状态的影响,但是由于失明(设定为0)。 现在处理状态的顺序是很重要的。 我最终会出现错误的步行范围或错误的视野范围。 我可以在每个状态的进程中进行检查()实体是否有其他状态并相应地修改代码,但是我添加的状态越来越乱。 目前我认为只给一个实体附加一个状态是一个更好的select,但是要创建更多的状态,其中一些状态是两个状态的组合(例如,一个盲注和一个分离)。 这样我就会比现在计算更多的州,因为任何州都必须与其他州合并。 我想知道这是否是最好的解决scheme? 状态是一个带有input,进程和退出方法的单例。 过程被称为每转。 目前进程()为瘫痪看起来像这样: public void process(){ walkRange = 10% * walkRangeBase; visionRange = visionRangeBase; } public void process(){ walkRange = 10% * walkRangeBase; visionRange = visionRangeBase; } 和进程()盲目看起来像这样public void process(){ walkRange = 50% * walkRangeBase; visionRange = 0; } public void process(){ walkRange […]

有什么方法来实施一个可变的环境(如神性原罪)的战斗系统?

让我们考虑一个类似DOS的例子,但更简单一点:你正在制作一个基于瓦片的2D游戏。 有几种基本types的瓷砖:地面,沙子,空气,焦化,石头等,每个都可以受到你的法术和物品的影响。 例如,如果你用铲子在地上挖一个洞。 现在你有了“GROUND_TILE_WITH_HOLE”。 然后你投“雨”,现在是“WITH_HOLE_FILLED_WITH_WATER”。 然后你投“毒球”,现在你有“WITH_HOLE_FILLED_WITH_POISON”。 或者,也许你把尖峰放在洞里(“WITH_HOLE_WITH_SPIKE_TRAP”),然后用一些东西(草,叶)覆盖它,所以现在你有“WITH_HOLE_WITH_COVERED_SPIKE_TRAP”)。 当然,当一个敌人踩到一个瓦片时,他会受到不同的影响,这取决于瓦片的状态。 所以,你有N种types的瓷砖,每个瓷砖可能有几十个可能的状态。 问题很简单:执行和维护几十个和几十个不同的州/转换的方法是什么? 我看到三个可能的解决scheme 1)暴力。 你有“GroundTIle”类和枚举“激活”(孔,火焰,毒药等)和“国家”(见上述 – “… FILED_WITH_POISON”等) 然后你蛮力所有可能的组合: public void UpdateState(Activator activator) { GroundTileState previousState = CurrentState; if (CurrentState == GroundTileState.Default && activator == Activator.Hole) CurrentState = GroundTileState.WithHole; else if (CurrentState == GroundTileState.Default && activator == Activator.Ice) CurrentState = GroundTileState.Slippery; //else if //… //… //else // […]

基本AI FSM – 处理状态转换

我开始研究如何实现游戏AI,在我看来,我的Pong演示非常简单的FSM将是一个很好的开始。 我的想法是为每个国家建立一个基本的国家界面和一个阶级,然后NPC会有一个现状的实例。 这个class级应该有一个更新的方法和方向,根据收到的事件来确定下一个状态。 问题是:我如何处理这个事件? 我应该有一个常规的addEventListener和一个costum事件系统吗? 还是应该检查更新的东西,可以改变目前的状态? 我感觉有点失落,我觉得我对FSM概念有很好的把握,但是好的实现看起来很棘手,这要提前感谢。

如何处理Gameflow和进程?

我正在构建自己的2D引擎,并尝试处理角色的进展。 例如,当玩家有一个特殊的物品时,门打开,或者当他与某人谈话并且拥有物品时,该人以不同的方式作出反应。 我不想硬编码。 有一个共同的方式来处理这样的事情? 我想过一个FSM来处理这个问题,但是它似乎太复杂了。 (我想要一个更简单的方法。) 目前,我用几个if语句处理它,检查字符items数组是否有item X,然后说这个,如果他有item Y,那就这么说。 PS:我正在用JavaScript编写我的引擎,所以如果你发布代码,我可以用Java和AS 3,但不能用C / C ++。

实体的密克罗尼西亚联邦和揭露实体的内部

我试图按照编程游戏AI的例子来实现有限状态机,这是一个非常标准和直接的FSM,类似于这样的(有些东西被省略,并从C ++转换为C#,希望它没事): class StateMachine<Entity> { Entity owner; State<Entity> state; void StateMachine<Entity>(Entity entity) { owner = entity; } void Update() { state.Execute(owner); } } class State<Entity> { Entity owner; void Execute(Entity owner) { if (owner.Foo) owner.Bar(); } } class Entity() { public type Foo; private StateMachine<Entity> stateMachine; public void OnStart() { stateMachine = new StateMachine<Entity>(this); } […]

我如何用基于状态的AI实现以下行为?

我正在制作一个2D游戏,两个飞船互相射击。 一个飞船由用户控制,由AI控制。 我想为AI使用简单的有限状态机(FSM)。 我试图让AI船跟随玩家的船只停在给定的半径上。 我有一个GetInsidePlayersRadius状态和一个StopMoving状态。 但到目前为止,我得到了一个奇怪的错误,涉及AI船只移动几个像素,然后停下来,而不是再次移动,创造了非常零散的运动。 AI可以像玩家一样向上,向下,向左,向右,向左,向右,向左或向右移动。 什么会造成这种零散的移动行为,通常当一个人工智能代理不断尝试从一个物体进入某个半径内,并在其内部停止时? 你将如何实现一个AI的以下行为作为有限状态机的一部分?

状态机类与函数指针

你们推荐使用什么? 具有函数指针或类的状态机? 或者,在这种情况下,一个会比另一个好? 在工作中,我们只使用带有函数指针的状态机,而我从来没有尝试过使用类。

FSM AIdevise没有接受状态

我是游戏开发和devise的新手,我一直期待着做FSM AIdevise,因为它对我来说似乎很有趣,但是我有一个问题,我在互联网上看不到任何答案。 我已经看到了来自Pac-Man的FSM图,我注意到FSM没有接受状态,这是有道理的,因为敌人总是处于活跃状态,处于不同的状态(游走,追逐吃豆人,吃豆人,在他们的房子里恢复)吃豆人的敌人的密克罗尼西亚联盟是什么显然停止或者吃豆人死亡或水平结局,但是这似乎更像是一个devise决定的蛮力。 我可以想象一些FSM,敌人刚刚“死亡”,这将是一个接受状态,因为它结束了它的过程,但是在许多来源中,我看到一些devise没有接受状态。 有人能解释这是为什么吗? 另外,你会做什么来防止不接受状态FSM?

有限状态机(AI与实体状态)

有限状态机(Finite State Machines)是简化系统的一个很好的工具,在这个系统中,一个实体有很多状态可以在不同的条件下决定要转换到哪个状态。 这对于在播放器中表示播放器很有效,因为状态机可以根据用户input来跟踪播放器所处的状态。 这个状态机主要基于animation状态(跑步,跳跃,攻击等) 但是,虽然这对于处理实体状态和跟踪animation是有意义的,但AI还是如此呢? FSM也提供了一个很好的框架来处理敌人与玩家进行交互时的行为。 我的问题是,这个FSM和处理一般实体状态的FSM之间有什么关系? 例如,一般来说,敌人可以跑步,攻击,怠速,跳跃,下降,蹲伏等等。就AI而言,敌人可以跟踪,攻击,逃跑,巡逻等等。可以看到,这些状态大多与一些重叠不同。 我想知道如何在代码中处理这两个不同的FSM。 问题 : 我是否应该将这些密码管理器分开,并分别更新状态,还是应该将它们合并为一个密钥管理器? 如果我把FSM分开,我怎么能处理相互依赖(如果敌人突然离开悬崖,现在正在下降,AI中的行为可能会改变)?