天才一秒记住【热天中文网】地址:https://www.rtzw.net
至少对第一个demo来说,够用了。
写到buff类时,又遇到问题。
2028年的buff系统支持多层叠加、持续时间刷新、效果合併、优先级判断。
但2002年不能这么搞。
他再次简化:buff不能叠加,同类型后到的覆盖先到的。
持续时间用帧数计算,每帧检测是否到期。
效果只有属性修正(加攻、加防、加减速)和状態附加(定身、沉默)。
他写了一个上午。
到中午时,头文件写完了,大概三百行。
这只是骨架,但结构清晰,职责分明。
“阿坤,来看一下。”
林浩说。
阿坤走过来,站在他身后,看屏幕。
他看得很慢,很仔细,有时会停下来,想几秒,然后继续。
“这个battlefield类,”
阿坤指著一行代码,“用二维数组存储单元引用,查找效率是o(1),但內存开销大。
如果地图大,会爆內存。”
“地图不会大。”
林浩说,“第一个demo,战场就100x100格,每个格存一个指针,4位元组,总共40kb,可以接受。”
“那单元移动时的碰撞检测呢?还是遍歷所有单元?”
“用空间分区。
把战场分成10x10的区块,每个单元只和同区块及相邻区块的单元检测碰撞。
算法你熟。”
阿坤点头:“四叉树或者网格。
我推荐网格,简单,2002年够用。”
“行,那你来实现。”
阿坤回到自己电脑前,开始写空间分区算法。
林浩继续写源文件。
下午,他遇到了第一个大难题:事件驱动框架。
2028年的游戏引擎,事件系统是核心。
玩家操作、技能释放、伤害触发、状態变化,全都是事件。
事件队列、事件监听、事件派发,一套完整的发布-订阅模式。
但在2002年,c++没有lambda,没有函数对象,没有標准库里的function。
要实现事件系统,得用函数指针,或者自己造轮子。
林浩选择了最土但最可靠的办法:用整数类型標识事件,用switch-case分发。
每个事件有一个结构体,包含事件类型和一堆union栏位。
监听者註册回调函数,事件发生时,遍歷所有监听者,调用对应的函数。
他写了两个小时,写出了事件系统的雏形。
测试时,发现性能有问题:每次事件派发都要遍歷所有监听者,如果监听者多,会成为瓶颈。
“用哈希表。”
本章未完,请点击下一章继续阅读!若浏览器显示没有新章节了,请尝试点击右上角↗️或右下角↘️的菜单,退出阅读模式即可,谢谢!