游戏开发(十五) 之 任务系统 成就系统

结合目前的塔防项目,介绍一下游戏开发中的 任务系统

先简单介绍下要讲的任务系统,因为游戏内容不多,所以目前的任务都比较简单,与其说是任务系统,不如叫成就系统.但是就算复杂的MMORPG游戏的任务系统,也可以按照此思路来做.

这次我只实现了两大类任务(成就任务、每日任务)

先看下任务系统的配置表

任务ID描述父类型子类型目标值前置任务奖励ID奖励数量
IDTxtP_TypeS_TypeValuePre_ID11001
1今日获得金币50000P2S650000011002
2今日通关5关关卡P2S45011003
3今日杀怪达到100P2S5100011004
101累积金币达到10000P1S110000011005
102累积金币达到50000P1S15000010111006
103累积金币达到100000P1S110000010211007
201通关关卡10P1S210011008
202通关关卡20P1S22020111009
203通关关卡40P1S24020211010
301累积杀怪达到100P1S3100011011
302累积杀怪达到200P1S320030111012
303累积杀怪达到500P1S350030211013

任务ID:唯一id

文本:显示的任务描述

父类型:1.数值 2.每日任务

子类型:(1.累积金币 2.关卡 3.累积杀怪 4.今日通关 5.今日杀怪 6.今日获得金币)

目标值:任务需达到的数量

前置任务:前置任务(根据前置任务是否完成 决定是否显示任务)

奖励ID:奖励道具的id (目前我只有一种游戏货币)

奖励数量:奖励道具的数量

上代码→

--定义枚举类型:
--子类型 (1.累积金币 2.关卡 3.累积杀怪 4.今日通关 5.今日杀怪 6.今日获得金币)
TaskSType = { 
	S1 = "Total_Money",
	S2 = "Level",
	S3 = "Total_Monster",
	S4 = "Daily_Level",
	S5 = "Daily_Monster",
	S6 = "Daily_Money",
}
--任务管理类
local TaskModel = class("TaskModel", XXModel)

function TaskModel:init()
	self.doneTaskList = {} --已经完成并领取的任务列表
	self.taskList = {} --任务列表

	self.totalMoney = 0 --累计获得金币
	self.totalMonster = 0 --累计杀怪

	self.dailyLevel = 0; --今日通过关卡
	self.dailymonster= 0; --今日杀怪
	self.dailymoney = 0; --今日获得金币

	--初始化任务数值 key:子类型
	self.taskCountList = {}
	for _,v in pairs(TaskSType) do
		self.taskCountList[v] = 0
	end
	self:resetTaskList()
end
--初始化显示任务列表
function TaskModel:resetTaskList()
	self.taskList = {}
	for k,v in pairs(XXIO.allData["task"]) do
		if self.doneTaskList[v.ID] == nil then  --未领取
			if v.Pre_ID == "0" then --初始任务
				self.taskList[v.ID] = v.ID
			else
				if self.doneTaskList[v.Pre_ID] ~= nil then --前置任务已完成
					self.taskList[v.ID] = v.ID
				end
			end
		end
	end
end
--任务完成
function TaskModel:doneTask(tid)
	self.doneTaskList[tid] = tid
	self:resetTaskList()
	self:update()
end
--所需要维护的数据结构,对应到表中每个子类型
function TaskModel:resetTaskValue()
	local userModel = XXMVCManager:getModel("User")
	self.taskCountList[TaskSType.S1] = self.totalMoney
	self.taskCountList[TaskSType.S2] = userModel.level
	self.taskCountList[TaskSType.S3] = self.totalMonster
	self.taskCountList[TaskSType.S4] = self.dailyLevel
	self.taskCountList[TaskSType.S5] = self.dailymonster
	self.taskCountList[TaskSType.S6] = self.dailymoney
	self:update()
end
--判断列表中是否有已经完成的任务
function TaskModel:hasDoneTask()
	for _,v in pairs(self.taskList) do
		local info = XXIO.allData["task"][v] --配置表
		local curValue = self.taskCountList[TaskSType[info.S_Type]]
		if tonumber(curValue) >= tonumber(info.Value) then
			return true
		end
	end
	return true
end

function TaskModel:appendLevel() --数值改变
	self.dailyLevel = self.dailyLevel + 1
	self:resetTaskValue()
end

function TaskModel:appendMonster(money) --数值改变
	self.totalMoney = self.totalMoney + money
	self.totalMonster = self.totalMonster + 1
	self.dailymoney = self.dailymoney + money
	self.dailymonster = self.dailymonster + 1
	self:resetTaskValue()
end

return TaskModel

1.枚举值我使用的字符串,这点的好处就是可以一份代码终身试用.拿来当key,不要太香哦

2. resetTaskList()

根据完成列表doneTaskList的内容,序列化出来需要显示的任务

3. doneTask()

完成任务调用,完成的任务添加到完成列表doneTaskList,然后调用 resetTaskList

4. resetTaskValue()   ※※※※※※※

这个方法里面主要做的是整个任务系统在外部唯一要维护的列表,就是你各类任务所对应的数值

我这里有6种类型的数据,只要维护好这个数值,那其他的地方不管你任务多少,都不需要在进行修改了

5. hasDoneTask()

看是否有已经完成了的任务,用于主界面任务按钮上面的红点显示

6.appendLevel  appendMonster

这些方法都是为了维护那个数据列表的

 

基本就是这些,这个思路可以用于绝大多数任务系统,无非就是做一些修改

比如大型RPG中的:

  • 击杀某个怪物
  • 移动到某个点
  • 采摘某个道具
  • 跟某个npc对话
  • 进入某个副本
  • 等等等等...

有其他问题可以留言交流!

 

 

 

 

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值