前言
游戏中背包模块设置关系到游戏整体设置, 一个背包模块设置好的 可以给玩家好体验, 在玩家可以清楚知道自己的物品的数据, 选择什么样的成长方式
正文
思维导图
一, 功能分类
1, 英雄的战斗力的计算
2, 日常任务模块
3, 排行榜
①, 武器排行榜
4, 物品的分类
①, 大的类别
- 消耗品
- 碎片 .合成材料
- 杂项
- 武器
- 情报
- 工具
- 芯片
②, 子的类别
- 体力
- 主角经验书
- 英雄经验书
- 宝箱
- 生命药剂
- 疲劳药剂
- BUFF药剂
- 钥匙串
5, 物品管理类的接口定义
①, 服务器使用的接口
- 增加物品
- 删除物品
- 分离物品
②, 客户端的接口定义
- 使用物品
- 打开宝箱
- 碎片合成
- 销售物品
- 武器强化
- 武器改造
- 武器分解
二, 客户端的信息设置
1, 显示根据物品的类型
三, 服务器的数据结构的设置
背包的模块的数据玩家查询的次数是最多的, 在服务器的效率首选 红黑树结构, 使用std::map结构是平衡二叉树查询的效率
key-value形式, 服务器端自动生成一个key 的int类型, value使用指针类型
查看源码 find方法
iterator find(const key_type& _Keyval)
{ // find an element in mutable sequence that matches _Keyval
iterator _Where = lower_bound(_Keyval);
return (_Where == end()
|| _DEBUG_LT_PRED(this->_Getcomp(),
_Keyval, this->_Key(_Where._Mynode()))
? end() : _Where);
}
const_iterator find(const key_type& _Keyval) const
{ // find an element in nonmutable sequence that matches _Keyval
const_iterator _Where = lower_bound(_Keyval);
return (_Where == end()
|| _DEBUG_LT_PRED(this->_Getcomp(),
_Keyval, this->_Key(_Where._Mynode()))
? end() : _Where);
}
1, key
lower_bound方法lower_bound 返回一个迭代器,指向第一个“不小于”给定值的元素 (公开成员函数) [编辑]
iterator lower_bound(const key_type& _Keyval)
{ // find leftmost node not less than _Keyval in mutable tree
return (iterator(_Lbound(_Keyval), &this->_Get_data()));
}
const_iterator lower_bound(const key_type& _Keyval) const
{ // find leftmost node not less than _Keyval in nonmutable tree
return (const_iterator(_Lbound(_Keyval), &this->_Get_data()));
}
调用_Lbound方法
// 声明
typedef typename _Alloc_types::_Node _Node;
typedef typename _Alloc_types::_Nodeptr _Nodeptr;
// ----
template<class _Other>
_Nodeptr _Lbound(const _Other& _Keyval) const
{ // find leftmost node not less than _Keyval
_Nodeptr _Pnode = _Root();
_Nodeptr _Wherenode = this->_Myhead(); // end() if search fails
while (!this->_Isnil(_Pnode))
if (_Compare(this->_Key(_Pnode), _Keyval))
_Pnode = this->_Right(_Pnode); // descend right subtree
else
{ // _Pnode not less than _Keyval, remember it
_Wherenode = _Pnode;
_Pnode = this->_Left(_Pnode); // descend left subtree
}
return (_Wherenode); // return best remembered candidate
}
这个没有什么说的
2, value
返回一个迭代器再查看const_iterator类型
你会发现在xtree模块中有这两个声明
typedef _Tree_comp_alloc<_Traits> _Mybase;
typedef typename _Mybase::const_iterator const_iterator;
typename _Mybase::iterator>::type iterator;
在查找一下_Tree_comp_alloc基类中有两个声明
typedef _Tree_const_iterator<_Tree_val<_Val_types> > const_iterator;
typedef _Tree_iterator<_Tree_val<_Val_types> > iterator;
value是一个大结构体,这会导致搜索时的内存频繁被交换出去,而导致效率低下, 所以我们使用指针类型
四, 背包模块 一些异常的处理方案
- 背包个数的上线
结语
不同游戏有着不同背包设置理念, 但只有一个目的就是适应玩家习惯。