今天的流水账:
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