任务模块
目录
我们接上一篇【事件模块】,现在继续使用AI帮我们写一个【任务管理器】。
前言
任务管理器,主要用于任务的计时、添加和销毁。
我们利用定时器 setInterval 封装了一个简洁的任务系统。
小白必读:任务管理器的用处?
答:我认为任务管理器就是一个定时系统,也就是我们经常看到的任务计划系统,适用于游戏关卡计时、或某个时间刷怪、或网络连接掉线时定时重连等等情况。
一、新建TimeMgr.ts
我们继续在Core分包目录下的Scripts\Managers目录新建TimeMgr.ts
二、提问AI
注意:现在我们根据DataMgr.ts的风格,来写代码。
1、点击提问区的 + 号
2、选择DataMgr.ts
3、输入问题
根据DataMgr的风格,帮我们写一个TimeMgr任务管理器,实现:
1、任务的计时
2、任务的添加
3、任务的销毁
4、参考DataMgr单例方式,并导出
4、复制后粘贴到TimeMgr.ts
三、优化修改
我们从上图中看到还差任务的倒计时、回调功能,现在我们直接把补充发送给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、返回编辑器自动刷新改动后,运行浏览器预览测试看看效果。
五、最终版本
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-10-06 09:43