任务/成就系统

游戏中任务/成就系统是必不可少的,如何实现一个成就系统?

任务系统基本需求

  1. 检测玩家完成该任务
  2. 奖励
  3. 领取奖励有触发下一阶段任务

名词解析:

任务链:

同一类型的任务为一个链

如:
玩家连续登陆任务,连续登陆1天,连续登陆2天,连续登陆3天,…为一种类型的任务链
获得多少金币,
通过多少次副本,
加多少好友

任务进度监听 采用的模式

基于事件系统的任务监听模式:

pub/sub,     nodejs的event模式(`event.on("update",function(){对相应任务进行更新})`)

主动调用(在需要更新任务的地方,主动调用更新方法)

任务类型(任务链):

次数类型任务--加多少好友

收集类型任务--收集多少个宠物,卡片...

游戏进程任务--(通过某个关卡,或者打败某个boss之类的)

##任务基础结构
静态信息:(可保存在配置文件中,使用id映射具体的任务)

id:任务id
title:标题
type:任务类型
descs:任务描述
reward:奖励
param:任务需求参数(重要)
pic:任务图标
nextId:下一个任务id(重要)
begin:是否起点任务(重要)
everyday:是否每日任务(重要)
...

动态信息:

progress:任务完成进度
status: 任务状态

##代码结构

###任务基础类

  1. 定义一个任务基础类– 包含任务动态信息,用于记录任务基础信息,以数组形式保存在玩家数据中

包含属性:

任务id
任务进度
任务状态

直接添加一个任务管理类,处理玩家任务初始化工作,任务监控工作–当任务完成时,对任务状态进行修改,触发玩家任务完成事件–推送任务完成信息给玩家.

任务管理类

1.定义一个任务管理者–用于检测更新玩家任务数据

事件机制:

事件主体:任务管理者

诱发外因:玩家操作

导致结果:任务改变--进度改变,状态改变

2.为任务管理者绑定事件

应有事件:

任务进度触发事件,根据传入不同的任务类型,对不同的任务进行操作.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def update_task(cls, types, player):
"""
根据任务类型,更新相应的任务
:param types: 要检测的任务类型
:param player: 玩家数据
:return:
"""
tasks= player.tasks
for _type in types:
for task in tasks:
if task and task.status == Task_Status.Uncomplete:
# 根据类型,调用相应的检查函数,并在检测函数中更新相应的进度
check_fun = getattr(cls, "check" + str(_type))
complete = check_fun(player, task , sta_task)
if complete:
task.status = Task_Status.Complete

def check4(cls, player, task, sta_task):
"""
玩家某个数值超过多少
:param task: 动态任务数据
:param sta_task: 静态任务数据
:return:
"""
return player.attack >= sta_task.get('condition')


任务奖励

根据传入任务,获取任务奖励,为玩家添加任务链下一个任务

1
2
3
4
5
6
7
8
9
10
11

reward = sta_task.get("reward")
# 为玩家添加reward
# 添加任务链下一个任务
if sta_task.get("nextID"):
task= Task()
task.task_id= sta_task.get("nextID")
task.progress = 0
task.status = Task_Status.Uncomplete
self.player.add_task(task)