在游戏中,有多个模块都会涉及到升级的问题,例如,玩家升级,装备升级,英雄升级等升级问题。
用户升级
数据库设计 需要一个经验值静态表
id : 等级的id exp_line : 本级达标经验值 exp_offset : 区间偏移量,即离下一级还需要多少经验值
friend_max : 当前等级下最大拥有多少个朋友
hero_max : 当前等级下,最多可以有多少个英雄
......................................
下一级 升级线是 $level['exp_line_next'] = $level['exp_line'] + $level['exp_offset'];
用户升级的流程:
判断用户是否是最高级 ----- > 经验值还未到下一级别的升级线 ------->获取当前经验值对应的等级 -------> 判断最新的等级是否和原来的等级一样 ------> 执行等级更新 --------> 升级后的后续操作,如,解锁其他模块等。
根据经验值获取当前等级函数:
public function getLevelByExp($curExp) { return $this->where("`exp_line` <= '{$curExp}'")->order('`id` DESC')->fetchPk(); }
升级的函数:
/**
* 升级
*
* @return bool
*/
public function levelUp()
{
// 已经是最大等级(不能再升了)
if ($this->_user->isTopLevel()) {
return -10;
}
// 经验值还未到下一级别的升级线
if ($this->_user['exp'] < $this->_user['level']['exp_line_next']) {
return -20;
}
// 获取当前经验值对应的等级
$curLevel = Dao('Static_Level')->getLevelByExp($this->_user['exp']);
if (! $curLevel) {
return -30;
}
if ($curLevel['id'] == $this->_user['level_id']) {
return -40;
}
// 升级前是几级
$orgLevel = $this->_user['level'];
// 执行更新
if (! $this->_user->update(array('level_id' => $curLevel['id']))) {
return -50;
}
// 升级的后续操作
if ($curLevel['id'] > $orgLevel['id']) {
// 加满生命值、移动力、精力
$this->_user->restore->full();
}
// 升级达到指定等级后解锁某些模块
$this->_user->unlock->doUnlockAfterLevelUp($orgLevel['id'], $curLevel['id']);
}
return $curLevel['id'];
}
什么时候调用升级函数:
因为升级是由于获取经验值,才有可能导致升级,所以,每次获取经验值的时候,都需要检测一下,是否满足升级条件。
function addExp($exp)
{
$this->_user->base->levelUp($exp);
}