随笔 - 132  文章 - 51  trackbacks - 0
<2010年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(7)

随笔分类

随笔档案

文章分类

文章档案

cocos2d-x

OGRE

OPenGL

搜索

  •  

最新评论

阅读排行榜

评论排行榜

今天写包裹中物品排序,有一些需要注意的问题和效率上的需要注意的事情,特此记下,备忘:

我的方法是:
1..遍历包裹,将需要叠加的物品叠加
2..再用qsort进行排序 (这个方法非常的好用,屡试不爽啊,他能将需要排序的数组重写数据.hoho~~~)

排序原则:

   先判断物品类型->再判断物品ID->再判断物品拥有数量


需要注意的问题是:防止用户重复点击 一直排序
解决方法:只有服务器回复排序完成之后,客户端才能向服务器发送排序消息

来段测试的小代码

// test.cpp : 定义控制台应用程序的入口点。
//

#include 
"stdafx.h"
#include 
<vector>
#include 
<Windows.h>
using namespace std;



struct stElement
{
    
int nType;
    
int nCnt;
    stElement( 
int type, int cnt )
    
{
        nType 
= type;
        nCnt 
= cnt;
    }

}
;


int compare( const void *arg1, const void *arg2 )
{
    stElement
* p1 = (stElement*)arg1;
    stElement
* p2 = (stElement*)arg2;

    
if ( p1->nType < p2->nType ){
        
return -1;
    }
else if ( p1->nType > p2->nType){
            
return 1;
    }
else{
        
if ( p1->nCnt < p2->nCnt )
            
return 1;
        
else if ( p1->nCnt  > p2->nCnt )
            
return -1;
        
else
            
return 0;
    }

}


int _tmain(int argc, _TCHAR* argv[])
{
    
    vector
<stElement>        vec;
    vec.push_back( stElement(
3,10) );
    vec.push_back( stElement(
5,10) );
    vec.push_back( stElement(
1,11) );
    vec.push_back( stElement(
2,50) );
    vec.push_back( stElement(
3,9) );
    vec.push_back( stElement(
3,20) );
    vec.push_back( stElement(
7,1) );
    vec.push_back( stElement(
3,8) );
    vec.push_back( stElement(
4,7) );
    vec.push_back( stElement(
3,8) );
    vec.push_back( stElement(
3,5) );

    qsort( 
&vec[0], vec.size(), sizeof(stElement), compare );


    
return 0;
}


posted on 2010-12-18 18:49 风轻云淡 阅读(2047) 评论(7)  编辑 收藏 引用 所属分类: UI

FeedBack:
# re: UI中包裹物品排序 2010-12-18 19:23 classyk
都已经使用了stl,为啥不直接使用std::sort呢?  回复  更多评论
  
# re: UI中包裹物品排序[未登录] 2010-12-19 11:13 杨粼波
classyk说的对,STL里面有自己实现快排,效率不成问题,而且以包裹如此小的数据规模而言,绰绰有余.

对于防止多次排序,是有很好的办法的.
你设置一个"可以排序标识符"比如:m_bCanSortBag,
排完序以后,你就设置为false.如果,包裹有变化,你设置为true.
客户端做一次判定,服务器端再做一次判定,就可以很好的处理了.  回复  更多评论
  
# re: UI中包裹物品排序 2010-12-20 11:46 金庆
包裹整理是客户端功能. 严格说, 应该是外挂(辅助程序)的功能. 只要客户端开放了包裹读取和操作的接口, 用户可以自定义包裹整理.  回复  更多评论
  
# re: UI中包裹物品排序 2010-12-21 16:11 Let me see see
@杨粼波
查看了下源代码,看了些资料对比了下 STL::sort 和qsort,MS stl中的sort效率更高,以后使用sort

我的游戏中每个包裹项BagItem数据快百条了,144个包裹项,数据量不是很小

你说的对于防止多次排序方法,我做的和你差不多,你说如果包裹有变化设置flag=true
我原来也想这么做来着,但是监视包裹变化我认为不是很容易,往包裹中添加物品,包裹中拖拽出物品,包裹中物品使用,还有包裹中物品交换、叠加,包裹和商店等界面的交互etc.... 我需要在所有的这些地方判断包裹是否改变么

我现在只能做到服务器发送回确认排序后才能再次排序.不知道有没有更好的办法

顺便蛋疼的问一句:你就是Cppblog中排行第三的神人么  回复  更多评论
  
# re: UI中包裹物品排序 2010-12-21 16:21 Let me see see
@金庆
这个不可能开放吧 呵呵 开放了包裹操作的接口 玩家不就可以自己push装备和物品了么,对挂了解少. 你说的是不是通过脚本形式的接口啊
  回复  更多评论
  
# re: UI中包裹物品排序 2010-12-22 09:26 zuhd
@Let me see see
是的,他就是那个神人

vector<stElement> vec,你存储对象实例,然后做排序,我觉得中间会用了若干次拷贝构造函数,倒不如在element中加一个变量为nLocation,表示该元素在背包中的位置,用vector<stElement*>来存储,然后每次去修改每个元素里的nLocation

  回复  更多评论
  
# re: UI中包裹物品排序 2010-12-23 14:17 杨粼波
几百个,不值一提的数量级.
STL几乎瞬间搞定.

不管你做什么操作,都会操作背包里面的逻辑数据,只要数据发生改变,数据就脏了.你可以用观察者模式,去通知UI或者别的需要订阅的对象.  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理