游戏成就系统的实现
来源:互联网 发布:淘宝蚂蚁花呗无法开通 编辑:程序博客网 时间:2024/05/18 01:53
在游戏系统中,我们需要给玩家设计出一个成就系统,满足玩家的荣誉感, 同时给玩家设定目标,除了荣誉感,达成某种成就,往往也会给玩家带来某种好处,例如声望值的提高。
获得成就需要一定的条件,也就是,玩家需要完成某种指定的动作后,才可以获得需要的成就。下面我具体举一个成就的例子,说明成就系统的实现方式。
成就名: 勇者无畏
达成条件:战斗胜利次数到达10次
战斗奖励:增加玩家的声望值。
实现以上需求,需要注意的问题:
A 需要统计玩家战斗的次数
B 当成就达到的时候,不能重复达到
C 完成成就后,可以增加玩家的声望值
D 进行某种动作的时候,可能同时开启两个成就
成就的完成流程:
数据库设计:
需要统计完成战斗次数的表:user_state
我的成就表: user_achievement
成就的配置表:
* related_step_field: 如果字段可以对应到user_stats 这样就可以不要记录成就的完成度 当获取进度的时候 $this->_user['stats][related_step_field]
类设计
我的统计模型类:
职能:记录需要统计的字段,如果字段发生改变,调用成就类里面的方法。
<?php/** * 我的统计 模型 * * @author zhangkai * $Id: Stats.php 4374 2013-07-30 07:26:26Z sunli $ */class Model_User_Stats extends Model_User_Trait{ /** * 子类构函 * * @return void */ protected function _initTrait() { $this->_prop = $this->DaoDs('UserStats')->get($this->_uid); } /** * 指定字段自增 * * @return bool */ public function increment($field, $offset = 1) { // 注意这里 需要给这个属性加成,否则,就算数据库里面的字段已经更新,还是不能获取到最新信息 $this->_prop[$field] += $offset; return $this->DaoDs('UserStats') ->where(array('uid' => $this->_uid)) ->increment($field, $offset); } // 增加主动胜利场数 public function addTotalWinTimes($num = 1) { $this->increment('total_win_times', $num); $this->_user->achievement->checkBattleWinAchieve(); }}
我的成就类:
职能:
检测成就是否达成
改变我的成就的进度
成就达成后,给予相应的奖励
/** * 我的成就 * */class Model_User_Achievement extends Model_User_Trait{ // 内部方法,用于判断是否达成了某种类型的成就 private function _checkAchieve($field, $attrs) { $times = $this->_user['stats'][$field]; $result = array(); foreach ($attrs as $data) { if ($times >= $data['line']) { $result[$data['achieve_id']] = $this->achieve($data['achieve_id']); } } return $result; } // 检测是否达成了战斗胜利的相关成就 public function checkBattleWinAchieve() { $data = array(); // 同时开启两个成就 line:表示成就需要的总进度 $data[] = array('line' => 100, 'achieve_id' => 721003); $data[] = array('line' => 10, 'achieve_id' => 721001); return $this->_checkAchieve('total_win_times', $data); } // 达成成就(不可重复达成) public function achieve($achieveId) { // 已达成过直接退出 如果是第一次开启成就,则插入此成就 if ($this->DaoDs('UserAchievement')->isCreated($this->_uid, $achieveId)) { return false; } // 成就详细 $achieveInfo = Dao('Static_Achievement')->get($achieveId); // 实时弹出框 $this->_user->tips->setTips('showGainAchievementTip', $achieveInfo); // 达成成就后 奖励声望 $this->_user->base->addReputation($achieveInfo['reputation_award']); // 设置成就已经完成 return $this->DaoDs('UserAchievement')->createAchieve($this->_uid, $achieveId); }}
- 游戏成就系统的实现
- 游戏任务成就体系的实现(九):现有任务成就系统的缺陷
- 游戏任务成就体系的实现(附四):成就系统的压力预估
- 游戏任务成就体系的实现(附三):成就系统基于Mysql+Cache的数据库访问设计实现
- 游戏任务成就体系的实现(附七):成就系统基于Redis的数据库访问设计实现
- 高效的成就系统实现简介
- 游戏任务成就体系的实现(附一):任务成就服务的日志记录
- 使用BitMap实现游戏任务,成就的信息同步
- 如何做好游戏中的成就系统?
- 成就系统工程师的职业生涯
- 成就系统工程师的职业生涯
- 游戏任务成就体系的实现(附二):常用功能/扩展包的使用 Async Cluster
- 游戏任务成就体系的实现(附五):NodeJS的异常处理
- 游戏任务成就体系的实现(一):业务分析及技术架构
- 游戏任务成就体系的实现(二):业务拆分和大功能模块定位
- 游戏任务成就体系的实现(七):用户数据输入逻辑及其关联操作
- 游戏任务成就体系的实现(八):用户获取任务信息逻辑组
- 游戏任务成就体系的实现(附六):NodeJS TCP机制搭建服务器
- 结合实例谈SqlParameters的使用
- Android自定义扁平化对话框
- HDU 1102 Constructing Roads(prim)
- 万里长征,始于足下——菜鸟程序员的学习总结(二)
- POJ 1251 Jungle Roads(最小生成树裸prim)
- 游戏成就系统的实现
- POJ 1258 Agri-Net(裸prim)
- PermGen space错误解决方法
- php内置函数实现 验证邮箱,url地址格式是否合法
- hdu1856 More is better(并查集,运用了压缩路径)
- RAID 0,1,0+1,1+0,5简介
- oracle审计功能
- UVa408 Uniform Generator
- (转)[排序]SORT QSORT