定时器与数据库
定时器与数据库
1 定时器
定时器是游戏服务器端必不可少的,网游和手游都需要有定时器来处理特定的操作。网游的定时器的精度比较高,而手游的定时器的精度相对来说就可以低一点,一般来说手游定时器设为1s是可以接受的。
定时器的主要功能就是处理游戏流程循环、处理特定的游戏任务。例如:棋牌类游戏《斗牛》,这款游戏玩法分为以下几步:
1.进入房间--1s
2.玩家准备--5s
3.系统发牌--2s
4.玩家下注--15s
5.系统开牌--5s
6.系统结算--5s
这样一个清晰的游戏流程是必须要有严格的控制,如果没有严格控制,逻辑出现混乱,游戏就是失败的。而这样的游戏流程正是通过定时器来实现的。
1.1定时器的实现
首先要创建一个定时器函数,然后将定时器函数加入已经封装好的uniligt库制定的“添加定时器函数”中,并设置时间。例如:
function InitTimer()
unilight.addtimer("TimeTickMgr.OnTimeTick1s", 1)
end
这是用Lua语言写的定时器函数,将自己写的定时器回调函数:OnTimeTick1s 添加到封装好的unilight库中的addtimer函数中,并且设置回调时间间隔为1s,这样游戏过程中,每一秒都会调用TimeTickMgr文件中的OnTimeTick1s函数,而OnTimeTick1s函数里则写的是游戏的流程控制。
unilight.addtimer = function(name, sec, ...)1秒定时器
unilight.addtimermsec = function(name, msec ...)1毫秒定时器
功能:添加定时器
参数:
name : string,回调函数名
sec : number,回调间隔为秒级
msec : number,回调间隔为毫秒级
这个添加定时器函数有两个参数,第一个参数是字符串类型,也就是定时器回调函数的名称;第二个参数时无符号整型,也即是要多少秒或者多少毫秒调用一次。
假设我们OnTimeTick1s函数里面调用的是斗牛游戏流程控制函数,那么每隔1秒就会调用一次流程控制函数,这样就能控制游戏的状态,例如:假如玩家进入游戏后,会有一个5s的准备时间,这样玩家都会在准备状态等待5s,那如何进入到发牌状态呢?正是由于每一秒都会回调这个流程控制函数,而这个函数有保存时间的变量,因此我们可以判断过了多少秒,当这个变量记录的时间大于等于5s时就会跳转到发牌状态,然后再经过2s跳转到加注状态,每个玩家都有15s的时间进行加注,然后再跳转到开牌、结算状态。
整个游戏循环正是通过定时器来实现的。
2 数据库
数据库是游戏里必不可少的,而且unilight库已经封装好了数据库的API,而数据库使用的是MongoDB。
GAME_ID = 163
Do.dbready = function()
unilight.createdb("userinfo","uid") --创建数据库
RoomDb.CmdRoomDbInit(GAME_ID) --通过游戏ID创建数据库
end
这是Lua语言写的创建数据库函数,调用了unilight库函数。
2.1 数据库接口
1.unilight.createdb = function(name, primary)
功能:创建表
参数:
name : string, 表名
primary: string, 主键名
2.unilight.droptable = function(name)
功能:删除表
参数:
name : string, 表名
3.unilight.getdata = function(name, key)
功能:获取表中一条记录
参数:
name : string, 表名
key : number, 主键名
4.unilight.savedata = function(name, data,force)
功能:保存一条记录
参数:
name : string, 表名
data : table, 数据表
5.unilight.delete = function(name, id)
功能:删除表中一条记录
参数:
name : string, 表名
id : 根据存储类型一致,主键名
6.unilight.createindex = function(name, index)
功能:创建索引
参数:
name : string, 表名
index : string, 索引
常用的数据库接口已经在上面列举出来了,可以根据需要进行调用。