其实写两个函数恰恰是最优雅,工作量最小的方法,如果要支持创意工坊的话,架构很重要,现在写10行能够避免以后写一百行,写两行就能跑的那种是脚本 XD,就是在10行的基础上才能实现的,简述一下我的架构希望能交流下:
Buff Timer线程:
List< task(时间戳,对象Id,buffId,创建/销毁) >[]; //一个线程专门用来创建和销毁Buff,可以统一管理buff,避免了每个对象单独跑占资源,当然不只是buff,也可以用来管全局事件。
比如可以在给对象objA 加buffA时,在buffA创建方法里写加一个 new task(当前时间+buffA.过期时间, objA.Id, buffA.Id, 销毁), 到期时调用
objA.removeBuff( buffA.Id){
this.buffList[ id ].dispose();
this.BuffList.remove(id);
}
Buff基类{
id;//方便调用及销毁;
过期时间;//
影响对象集合[];//一般不会频繁改变的才用这个,如果需要时时刻刻调范围的,不如直接现加;
//对于具体的buff实现,可以再+属性,比如需求要的效果,就可以+ 基础增益数值、每层增益数值、当前层数、最高层数等,还可以加一些通用属性如是否可见、buff图标等。
创建方法();//比如在给buff的时候给属性加一个装饰器,销毁时删掉;
销毁方法();
}
属性基类{
属性基本值;
属性实际值;//仅调用属性刷新方法才更新,若更改频繁,这个也可以用方法替代;
属性文本;//这里有需要可以再加,什么属性图标、属性描述等,不赘述;
属性装饰器[];//
刷新方法();//会遍历属性装饰器更新属性实际值及属性文本,就能实现 >>No.62336585 需求的效果。
}
属性装饰器{
buffId buffId;
追加方法(str oriStr ){ //一个buff影响属性文本的例子,如果是游戏引擎的话,这里可以写超文本;
Buff buff = this.buffList[buffId];
return oriStr + buff.buff层数 + 'x' + buff.每层值;
}
}
在上述基础上,若要实现巢穴根据周围设施A数量提供增益,可以这样写:
* 设施A放下时,给范围内巢穴.buffList.add( new BuffA());
>add中调用buffA的create方法;
>>create中为 对象属性add buffA装饰器;
>>>属性.add装饰器 调用刷新显示文本及属性方法;
* 设施A销毁时,遍历影响对象集合调用buffList.remove(buffA.id),后续如上;
都是伪代码较粗糙,有瑕疵say sry。