目录

  • 前言
  •       一、新建TimeMgr.ts
  •       二、提问AI
  •       三、优化修改
  •             第一次修改
  •             第二次修改
  •             第三次修改
  •       四、测试
  •       五、最终版本
  •       六、总结
  • 我们接上一篇【事件模块】,现在继续使用AI帮我们写一个【任务管理器】。

    前言

    任务管理器,主要用于任务的计时、添加和销毁。
    我们利用定时器 setInterval 封装了一个简洁的任务系统。

    小白必读:任务管理器的用处?
    :我认为任务管理器就是一个定时系统,也就是我们经常看到的任务计划系统,适用于游戏关卡计时、或某个时间刷怪、或网络连接掉线时定时重连等等情况。

    一、新建TimeMgr.ts

    我们继续在Core分包目录下的Scripts\Managers目录新建TimeMgr.ts
    新建TimeMgr.ts

    二、提问AI

    注意:现在我们根据DataMgr.ts的风格,来写代码。
    1、点击提问区的 + 号
    2、选择DataMgr.ts
    3、输入问题

    根据DataMgr的风格,帮我们写一个TimeMgr任务管理器,实现:
    1、任务的计时
    2、任务的添加
    3、任务的销毁
    4、参考DataMgr单例方式,并导出

    4、复制后粘贴到TimeMgr.ts
    提问1

    三、优化修改

    我们从上图中看到还差任务的倒计时、回调功能,现在我们直接把补充发送给AI,让其解决。

    第一次修改

    我们的任务管理器,需要补充:
    1、任务倒计时更新,更新间隔1000毫秒
    2、需要在构造里使用 ccc 3.8.x 内部API 实现在场景运行后 更新倒计时
    2、任务回调
    3、是否重复
    4、时间间隔

    第一次修改

    第二次修改

    我们可以看到上图:
    1、addTask多了不必要的参数:taskId、duration
    2、callback类型简写为Function
    3、去掉isTaskCompleted函数
    4、EVENT_AFTER_UPDATE 应该改为 EVENT_AFTER_SCENE_LAUNCH
    5、最后修改后重新优化代码

    第二次修改

    第三次修改

    根据第二次修改的截图来看,我们还差:
    1、我们只需要在构建时监听一次 EVENT_AFTER_SCENE_LAUNCH
    2、addTask 需要去掉duration,如果我们任务重复,只需要按interval间隔重新执行
    3、addTask需要返回一个任务id,以便removeTask使用
    4、updateTasks里加强对已完成的非重复任务进行检查

    第三次修改
    注意截图第4和5的标注,我们手动修改使用Director代替director

    四、测试

    1、我们在AI提问区域选择TimeMgr和GameEntry进行关联提问
    2、使用AI生成测试代码,然后复制到GameEntry.ts。
    3、返回编辑器自动刷新改动后,运行浏览器预览测试看看效果。
    测试1
    测试2

    五、最终版本

    import { Director, director } from 'cc';
    
    /**
     * 时间管理器
     * 用于任务的计时、添加和销毁
     */
    class TimeMgr {
        private tasks: Map<string, { endTime: number, callback?: Function, repeat?: boolean, interval?: number }>;
    
        // 私有构造函数,防止外部实例化
        private constructor() {
            this.tasks = new Map();
            director.once(Director.EVENT_AFTER_SCENE_LAUNCH, this.startTaskUpdates, this);
        }
    
        /** 单例实例 */
        public static readonly instance: TimeMgr = new TimeMgr();
    
        /**
         * 添加任务
         * @param {Function} callback - 任务完成时的回调函数
         * @param {boolean} [repeat] - 是否重复
         * @param {number} [interval] - 重复任务的时间间隔(秒)
         * @returns {string} 任务ID
         */
        public addTask(callback: Function, repeat?: boolean, interval?: number): string {
            const endTime = Date.now() + (interval || 0) * 1000;
            const taskId = `${Date.now()}_${Math.random()}`;
            this.tasks.set(taskId, { endTime, callback, repeat, interval });
            return taskId;
        }
    
        /**
         * 销毁任务
         * @param {string} taskId - 任务ID
         */
        public removeTask(taskId: string) {
            this.tasks.delete(taskId);
        }
    
        /**
         * 开始任务更新
         */
        private startTaskUpdates() {
            setInterval(this.updateTasks.bind(this), 1000);
        }
    
        /**
         * 更新任务倒计时
         */
        private updateTasks() {
            const now = Date.now();
            this.tasks.forEach((task, taskId) => {
                if (now >= task.endTime) {
                    if (task.callback) {
                        task.callback();
                    }
                    if (task.repeat && task.interval) {
                        task.endTime = now + task.interval * 1000;
                    } else {
                        this.tasks.delete(taskId);
                    }
                }
            });
        }
    }
    
    /** 导出实例 */
    export const timeMgr = TimeMgr.instance;

    六、总结

    如果我们对AI的回答不满意,我们可以继续追加修改要求,让其继续优化修改,直到满意为止。
    结合我们前面所讲的联合提问,加上追加提问,基本能解决90%的开发需求。
    但是作为ccc游戏开发者,我们还是得了解ccc一些基础知识,结合AI辅助才能事半功倍。

    加油吧,后面的内容更加精彩!!!

    作者:ccs2d.com  创建时间:2024-09-27 14:02
    最后编辑:ccs2d.com  更新时间:2024-10-06 09:43
    上一篇:
    下一篇: