// 当存在existState时,是否允许添加newState
    protected bool allowAddStateByGroup(PlayerState newState, PlayerState existState)
    {
        // 任意一个状态没有所属组,则不在同一组
        if (!mStateGroupList.ContainsKey(newState.GetType()) ||
            !mStateGroupList.ContainsKey(existState.GetType()))
        {
            return(true);
        }
        List <Type> newGroup   = mStateGroupList[newState.GetType()];
        List <Type> existGroup = mStateGroupList[existState.GetType()];

        // 有一个状态不属于任何状态组时两个状态是可以共存的
        if (newGroup == null || existGroup == null)
        {
            return(true);
        }
        int count0 = newGroup.Count;
        int count1 = existGroup.Count;

        for (int i = 0; i < count0; ++i)
        {
            for (int j = 0; j < count1; ++j)
            {
                // 属于同一状态组,并且该状态组中的所有状态都不能共存,而且不允许添加跟当前状态互斥的状态,则不允许添加该状态
                if (newGroup[i] != existGroup[j])
                {
                    continue;
                }
                StateGroup            group   = mGroupStateList[newGroup[i]];
                GROUP_MUTEX_OPERATION operate = group.mCoexist;
                // 状态可共存
                if (operate == GROUP_MUTEX_OPERATION.GMO_COEXIST)
                {
                    ;
                }
                // 只与主状态互斥
                else if (operate == GROUP_MUTEX_OPERATION.GMO_MUETX_WITH_MAIN)
                {
                    // 有主状态时不可添加其他状态
                    if (group.mMainState == existState.GetType())
                    {
                        return(false);
                    }
                }
                // 不可添加新状态
                else if (operate == GROUP_MUTEX_OPERATION.GMO_NO_NEW)
                {
                    return(false);
                }
                // 添加新状态时移除所有旧状态
                else if (operate == GROUP_MUTEX_OPERATION.GMO_REMOVE_OTHERS)
                {
                    ;
                }
            }
        }
        return(true);
    }
    public static void registeGroup <T>(GROUP_MUTEX_OPERATION mutex = GROUP_MUTEX_OPERATION.GMO_COEXIST) where T : StateGroup, new()
    {
        if (mGroupStateList == null)
        {
            mGroupStateList = new Dictionary <Type, StateGroup>();
        }
        StateGroup group = new T();

        group.setCoexist(mutex);
        mGroupStateList.Add(typeof(T), group);
    }
Exemplo n.º 3
0
 public void setCoexist(GROUP_MUTEX_OPERATION coexist)
 {
     mCoexist = coexist;
 }