首页 > 解决方案 > 在游戏编程(以及一般的 OOP)中,我们什么时候决定使用命令与状态设计模式?

问题描述

我正在阅读游戏编程模式中的命令应该用于为演员指示方向,而状态用于指示演员将处于的单个状态(站立、跳跃、移动等)。

我目前正在处理我的代码库中的一个问题,我似乎无法以一种好的方式解决问题。我目前有 3 个“交互状态”,我的角色可以处于 - 被动、近战或远程战斗。

目前我认为角色可以使用的命令有几种——移动、说话、攻击等。但是角色不能在被动状态下攻击,或者在战斗状态下说话——我的问题是这些命令作为命令或状态更有意义,我可以构建并发/分层状态机吗?

另外,我们是否应该将命令视为将角色从一个状态移动到另一个状态的动作(例如,如果我右键单击一个敌人,我会将“攻击”命令传递给状态构造函数以从“移动”状态移动到“攻击”状态)?我想我只是很难概念化在这里做什么以及状态和命令如何交互。

示例状态,将附加到角色对象:

public class MeleeState : InteractionState
{
    public override void HandleInput(Character character, InteractionCommands command)
    {
        base.HandleInput(character, command);

        if (command == InteractionCommands.CHANGETOPASSIVE)
        {

        }
        else if (command == InteractionCommands.CHANGETORANGED)
        {

        }
        else
        {

        }
    }
}

示例命令:

public class Attack : Command
{

    Attack(Character aggressor, Enemy victim)
    {

    }

    public override void Execute()
    {
        base.Execute();
    }

    public override void Undo()
    {
        base.Undo();
    }

    // Update is called once per frame
    void Update()
    {

    }
}

标签: oopunity3ddesign-patterns

解决方案


我认为,所有这些都可以看作是状态。即被动,行走,跳跃,近战ING,远程战斗ING都可以认为是状态。
我们向 walk 传递一个命令,因此角色的状态从被动状态变为清醒状态。而且在你指出的情况下,我们不应该在角色处于被动状态时提供任何攻击实现,或者在战斗状态时不提供对话实现

在给定的时间点,角色处于某种状态,直到给出命令(RangedCombatCommand)。收到命令后,角色将处于战斗状态并执行远程战斗


推荐阅读