Skip to content

Instantly share code, notes, and snippets.

@stableShip
Last active January 4, 2016 08:04
Show Gist options
  • Save stableShip/36475a4ca43cff8d9b1d to your computer and use it in GitHub Desktop.
Save stableShip/36475a4ca43cff8d9b1d to your computer and use it in GitHub Desktop.
我的任务
---
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