写作绅士,读作丧尸 X岛揭示板
 首页版规 |用户系统 |移动客户端下载 | 丧尸路标 | | 常用图串及路标 | 请关注 公众号:【矛盾苇草】| 人,是会思考的芦苇
常用串:·豆知识·跑团板聊天室·公告汇总串·X岛路标

No.62326498 - 无标题 - 技术宅


回应模式
No.62326498
名 称
E-mail
标题
颜文字
正文
附加图片
•程序语言、压制投稿、视频制作以及各计算机领域的技术问题
•我觉得还是CSDN靠谱一点
•本版发文间隔为15秒。

无标题 无名氏 2024-05-09(四)23:37:00 ID:TPWHppd [举报] [订阅] [只看PO] No.62326498 [回应] 管理
肥哥们,我现在在实现这样一个功能:

如果设施a存在,为巢穴提供一个数值+1

我现在的实现方式是在设施a被修建起来时令巢穴的数值+1,然后在被摧毁时令巢穴的数值-1

但这样的话就要写两个函数,感觉不够优雅,工作量也很大,有没有更好的实现方式呢(つд⊂)
无标题 无名氏 2024-05-12(日)19:54:14 ID:QbwxZDS [举报] No.62359954 管理
建议popo系统学习一下面向对象,感觉就是职责划分,事件设计的问题
无标题 无名氏 2024-05-12(日)20:32:43 ID:TPWHppd (PO主) [举报] No.62360370 管理
>>No.62359954
(;´Д`)我觉得js还挺面向对象的,我觉得我现在的问题主要还是咱都没做过游戏,也找不到类似的教程,老是担心自己的做法不够好|-` )

虽然我知道完美的代码不可以一开始就写出来,但还是想减少后面史山畅泳的概率(つд⊂)
无标题 无名氏 2024-05-14(二)09:42:18 ID:j3lJQyS [举报] No.62379254 管理
>>No.62326498
一般Buff的的做法就是单位带一个集合(可以再包一层正面、负面、光环等等方便拿),里面是buff内容,然后通过别的对象的事件来增加/移除buff 同时调用Buff的创建、销毁方法(+ -属性、效果之类的),并且可以增加expireTime/常驻 属性, 拉一个线程出来计算过期时间。
如果是会移动的光环的buff,需要发起方隔一段时间查一遍范围内符合条件的单位并上一个时间大于光环搜索间隔的buff,如果是不会移动的,可以给该光环加一个对象集合,该单位创建时给附近单位放buff并放到对象集合里,该光环销毁时遍历集合remove buff(这个集合也可以放到移动光环内)。
无标题 无名氏 2024-05-14(二)09:44:36 ID:j3lJQyS [举报] No.62379272 管理
正常的buff都要有 创建 销毁方法的。
无标题 无名氏 2024-05-14(二)10:44:03 ID:j3lJQyS [举报] No.62379951 管理
其实写两个函数恰恰是最优雅,工作量最小的方法,如果要支持创意工坊的话,架构很重要,现在写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。
无标题 无名氏 2024-05-15(三)02:56:54 ID:QbwxZDS [举报] No.62391055 管理
>>No.62379951
老哥是写unity的吗,读起来有种c#的范式




↑That's true OO
无标题 无名氏 2024-05-16(四)07:51:59 ID:NPzcKpG [举报] No.62404259 管理
用多个函数实现一个功能才是正确的
分开多个函数看似很麻烦,我把所有功能用一个函数实现不是更方便吗。但实际上使用多个函数可以增加代码的可读性,方便修改和维护,在debug时也能更快找到出问题的部分
模块化设计还能增加后续的功能拓展性,当你想写一个新的功能时,或许就能直接从已有的函数中进行调用
虽然在编写的时候看起来好像很麻烦,但从长远来看工作量是降低了的

UP主: