在游戏中,有多个模块都会涉及到升级的问题,例如,玩家升级,装备升级,英雄升级等升级问题。

用户升级 

   数据库设计 需要一个经验值静态表 

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);
}

  

 

posted on 2013-07-04 10:08  孙力  阅读(468)  评论(0编辑  收藏  举报