Last active
January 4, 2016 08:04
-
-
Save stableShip/36475a4ca43cff8d9b1d to your computer and use it in GitHub Desktop.
我的任务
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
title: 我的任务 | |
date: 2015-11-16 16:07:43 | |
categories: [avhievement, task,游戏开发] | |
tags: [avhievement, task,游戏开发] | |
--- | |
# 任务/成就系统 | |
游戏中任务/成就系统是必不可少的,如何实现一个成就系统? | |
## 任务系统基本需求 | |
1. 检测玩家完成该任务 | |
2. 奖励 | |
3. 领取奖励有触发下一阶段任务 | |
----- | |
## 名词解析: | |
任务链: | |
同一类型的任务为一个链 | |
如: | |
玩家连续登陆任务,连续登陆1天,连续登陆2天,连续登陆3天,...为一种类型的任务链 | |
获得多少金币, | |
通过多少次副本, | |
加多少好友 | |
... | |
<!-- more --> | |
## 任务进度监听 采用的模式 | |
基于事件系统的任务监听模式: | |
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.为任务管理者绑定事件 | |
应有事件: | |
任务进度触发事件,根据传入不同的任务类型,对不同的任务进行操作. | |
``` | |
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') | |
``` | |
### 任务奖励 | |
根据传入任务,获取任务奖励,为玩家添加任务链下一个任务 | |
``` | |
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) | |
``` | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment