搜索
您的当前位置:首页正文

独立日记 2015年12月28日 day7 工厂方法

来源:二三娱乐

今天的流水账:

5:00 入睡

11:40 起床

14:00~20:00 跑酷游戏

公众号空了一天,之前的某一天,不小心在00:00之后推送了消息,因为微信公众号每天只能发一条群发,所以之后的每天写好blog后要等到第二天00:00才能发消息。

状态机改进:

之前实现的状态机用得不太顺手,今天抽时间改了一下。

usingUnityEngine;usingSystem.Collections;usingSystem.Collections.Generic;//////可以改进的地方///1.全部改成字符串///publicclassFSM{// 定义函数指针类型publicdelegatevoidFSMCallfunc();//////状态类///publicclassFSMState{publicstringname;publicFSMState(stringname){this.name = name;        }//////存储事件对应的条转///publicDictionary TranslationDict =newDictionary();    }//////跳转类///publicclassFSMTranslation{publicstringfromState;publicstringname;publicstringtoState;publicFSMCallfunc callfunc;// 回调函数publicFSMTranslation(stringfromState,stringname,stringtoState,FSMCallfunc callfunc){this.fromState = fromState;this.toState  = toState;this.name = name;this.callfunc = callfunc;        }    }// 当前状态privatestringmCurState;// 状态Dictionary StateDict =newDictionary();//////添加状态//////State.publicvoidAddState(stringname){        StateDict [name] =newFSMState(name);    }//////添加条转//////Translation.publicvoidAddTranslation(stringfromState,stringname,stringtoState,FSMCallfunc callfunc){        StateDict [fromState].TranslationDict [name] =newFSMTranslation (fromState, name, toState, callfunc);    }//////启动状态机//////State.publicvoidStart(stringname){        mCurState = name;    }//////处理事件//////Name.publicvoidHandleEvent(stringname){if(mCurState !=null&& StateDict[mCurState].TranslationDict.ContainsKey(name)) {            Debug.LogWarning ("fromState:"+ mCurState);            StateDict[mCurState].TranslationDict [name].callfunc ();            mCurState =  StateDict[mCurState].TranslationDict [name].toState;            Debug.LogWarning ("toState:"+ mCurState);        }    }}// 测试代码// 添加状态PlayerModel.Instance ().fsm.AddState ("idle");        PlayerModel.Instance ().fsm.AddState ("run");        PlayerModel.Instance ().fsm.AddState ("jump");        PlayerModel.Instance ().fsm.AddState ("double_jump");        PlayerModel.Instance ().fsm.AddState ("die");// 添加跳转PlayerModel.Instance ().fsm.AddTranslation("run","touch_down","jump",Jump);        PlayerModel.Instance ().fsm.AddTranslation("jump","touch_down","double_jump", DoubleJump);        PlayerModel.Instance ().fsm.AddTranslation ("jump","land","run", Run);        PlayerModel.Instance ().fsm.AddTranslation ("double_jump","land","run", Run);// 启动PlayerModel.Instance ().fsm.Start ("run");

给女票写的:

工厂方法:定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。

何时使用:

编译时无法准确预期要创建的对象的类;

类想让其子类决定在运行时创建什么;

类有若干辅助类为其子类,而你想将返回哪个子类这一信息局部化;

在Cocoa Touch框架中可以用alloc init来创建NSNumber实例子,然而没什么卵用。需要用[NSNumber numberWithBool:YES]消息会得到NSNumber的子类NSCFBoolean的一个实例。 好处:安全,引入新的产品并不需要修改客户端代码。

微信公众号:QWERTeam

Top