08 2014 档案
摘要:curpostgtpos乍一看以为是当前位置和目标位置,但在项目里面这两个位置有点坑当客户端玩家移动或者AI里面的位置,会把获得的位置付给tgtpos而以前的tgtpos会付给curpos所以这个tgtpos是当前玩家或者怪物站立的位置,而curpos是上一个位置我想要这个curpos有什么用呢这个...
阅读全文
摘要:auto ply = new PlayerChannel();看到这个我想到和new PlayerChannel;到底有啥区别默认构造函数只有当不提供任何构造函数,编译器才会合成一个默认构造函数,参数初始化取决于定义对象的位置当提供一个函数时就不会有默认构造函数不管new PlayerChannel...
阅读全文
摘要:玩家移动1.检查位置包auto& mpos = m_spBase->getMapPos(pos.tgtPos);if(!check_move_pos(pos, pl)) return;2.跟新当前位置及方向,更新客户端发过来的位置pl->last_move_mode = EnumMoveMod...
阅读全文
摘要:MoveManager:移动管理类struct MoveOpt{ int cur_seq; ObjecInfo* obj;};std::map m_move_objs;//主要容器//加入移动标记void MoveManager::add_mask(ObjecInfo* obj){ ...
阅读全文
摘要://其他初始化init_prop();//初始化道具init_ornamemtal();//初始化装饰物init_monster_type_info();//初始化怪物基本信息这个比较重要在加载NPC时会用到这些基本信息的储存在m_monster_type_infos[mo_type_info.nB...
阅读全文
摘要:init_map(res_path)1.初始化mapbase的基本信息pos2d screen_area = {1000, 600}; //普通屏幕大小m_spBase->init(screen_area.x / 3, screen_area.y / 3 , //屏幕划分成3*3格子 hea...
阅读全文
摘要:init_timer(); //各种定时器的初始化void Map::init_timer(){ //auto tf = GetPlug(TimerFactory); auto tf = m_spTimerFactory; m_updateMovePosTimer.reset...
阅读全文
摘要:暂时有个疑问为什么这些需要这么复杂的继承
阅读全文
摘要:记得是端午节还是五一我没有回家因为我想看懂我们项目那个从客户端到服务器到底是怎么通信的当时共享进程已经出来一段时间了,通信的那个模块类实在太多了,还是libevent,还有boost共享内存,进程通信刚开始被那些类就搞晕了,为了搞懂那个模块不知我画了多少次流程图,那三天我每天都在看,那一个包从客户端...
阅读全文
摘要:遇到三个比较坑的事情:1.struct { enum A aa; int a; int b;};这样初始化不行{0}然后这样可以struct { int a; enum A aa; int b;};2.在调试程序的时候发现走向乱跳了一下在询问同事之后发现在将怪物的属性转换成人物,然后调用函数,然后乱...
阅读全文
摘要:#include#include using namespace std;int main(){ int a = 0; assert(a == 0);//当其不满足时触发 getchar(); return 0;}我以为是满足时触发,结果错了
阅读全文
摘要://宠物AI流程1.刚开始添加宠物Monster被动State:EnumMonster被NULLMonsterStat:EnumPet跟随2.附近有怪物就改成攻击模式(相关的收尾工作)void PetObj::cancle_follow(){ m_trace_line.clear(); ...
阅读全文
摘要:share到底干什么的//--------------------打开GameServer,share中加载-------------------------1.加载nBodyID//玩家的nBodyID表([职业][性别][nboduid])std::vector > m_nbodyid_tabl...
阅读全文
摘要:玩家上线//------------------c2s_login-------------------------bool GameChannel::OnLogin(void* data, int len){ UserInfo* info = (UserInfo*)data; ...
阅读全文
摘要:怪物AI执行//-----------------------------------------------主动攻击------------------------------------------------------初始状态attack_style Enum攻击方式 ...
阅读全文
摘要:NPC AI驱动最基本过程NPCmgr中比较重要的是加载NPC和一个NPCAI的一个指针他利用map那个线程的定时到底做了啥呢void NPCmgr::npcAITimer(){ time_t tb = GetTickCount(); m_spNpcAI->run();//[...]测试...
阅读全文
摘要:来看看map线程到底是如何运行的很早就知道一个map是一个线程,以后有可能改成一个map一个进程,那就先来看看一个map一个线程是如何运作的其实刚开始整个服务器就是两个线程,但发现这样服务器支持的人数不多,其实我是刚来具体不太清楚到底咋回事,也没有网络进程,最开始就是将GameMap从GameSer...
阅读全文
摘要:一直以为 int a[256]={0};是把a的所有元素初始化为0,int a[256]={1};是把a所有的元素初始化为1.调试的时查看内存发现不是那么一回事,翻了一下《The C++ Programming Language》总算有定论。PDF的竟然不然复制,就把它这章翻译了,如下5.2.1 ...
阅读全文
摘要:服务器ID分配包括NPC,Monster,Pet的ID分配都是调用allocateUID然后自动保存的ID加一,pet说是通过玩家的ID移位获得的,调试一下发现还是调用allocateUID,如果通过玩家ID移位,也不是长久之计,还得分配唯一的ID,这个就需要保存数据库了
阅读全文
摘要:#include #include using namespace std;int main(){ //tm转换成字符串 time_t t = time(0); tm tm; localtime_s(&tm, &t); char szTime[64]; spr...
阅读全文
摘要:啥是POD类型?POD全称Plain Old Data。通俗的讲,一个类或结构体通过二进制拷贝后还能保持其数据不变,那么它就是一个POD类型。平凡的定义1.有平凡的构造函数2.有平凡的拷贝构造函数3.有平凡的移动构造函数4.有平凡的拷贝赋值运算符5.有平凡的移动赋值运算符6.有平凡的析构函数7.不能...
阅读全文
摘要:我们在C++程序中经常看到两种new的使用方式:new A以及new A()。那么这两种究竟有什么区别呢?调用new分配的内存有时候会被初始化,而有时候不会,这依赖于A的类型是否是POD(Plain old data)类型,或者它是否是包含POD成员、使用编译器生成默认构造函数的类。附:POD类型P...
阅读全文
摘要:一,问题提出:class B; class A { public: B b; }; class B { public: A a; }; 以上写法会造成头文件相互包含,是错误的。 因为在A对象中要开辟一块属于B的空间,而B中又有A的空...
阅读全文
摘要:昨天遇到了两个让我解决好长时间的问题,属于比较蛋疼的问题,第一个发现总是发现编译没问题,链接总是错误,检查了半天,发现时头文件相互包含的问题,然后在一个文件里面申明一下,在.cpp文件里包含即可。第二更蛋疼了,也是链接问题,找了半天,发现是一个文件下的文件和另一个文件夹下的文件重名了,然后我把一个相...
阅读全文
摘要:有段时间没看map里面的东西了,刚才看发现功能上增加了一些,在来复习了一次流程初始化每个map建立线程,这个线程有两个功能,1.处理GS发过来的包 2.驱动map里面的定时器GS发过来的包是存在m_gs2msPkts2这个无锁的单消费者,单生产者队列中,只要是GS中不处理的包都要发到MAP中然后每个...
阅读全文
摘要:while(!m_SMque.pop(data));看到这个有点忘了,如果pop返回false会一直执行pop,其实这个执行的是空语句,而while每次执行都需要判断条件,所以如果pop返回false会一直执行pop函数
阅读全文
摘要:今天看到这个有点晕了SM_Data**m_ppSMPool;m_ppSMPool = new SM_Data*[nMaxCount];//其实m_ppSMPool还是一个指针,是一个SM_Data*类型的指针,代表里面每个元素是SM_Data*类型,别加个*就吓着了for (int i = 0; i...
阅读全文
摘要:发送端 //1.在页面文件中创建一个可共享的文件句柄 //2使用默认安全对象 //3.可读,可写打开打开映射 //4.最大长度的高32位 //5.最大长度的低32位,此为size大小 //6.指定文件映射对象的名字 //return:新建文件映射对象的句柄,...
阅读全文
摘要:#include struct MyStruct{ MyStruct(int a) { a = b = 0; } int a; int b;};int main(){ MyStruct my = {0};//列表初始化只适合非聚合结构体,所以这样不行...
阅读全文
摘要:发送端#include "DBProc1.h"#include #include #include using namespace boost::interprocess;PLUG_COMPONENT_AUTO_REG(DBProc1)//DO NOT EDIT THISstruct MyStruc...
阅读全文
摘要:有2个嵌套的数组:如果我想查询comments里score大于5的记录:testProvider.find({"comments.score":{"$gt":5}},{},function(err, result){console.log(result);});返回了查找到的记录,说明了查找有效果了...
阅读全文
摘要:channelid如何生成的/////////////////////////////////////////////////////////////////// I_TCPServer.h // Description: // ///////////...
阅读全文
摘要:我今天在想这个vector,map为什么不能写入共享内存,原来是因为new的时候只是new了这个对象在共享内存上,而真正的堆上的内存并没有在共享内存里面的,如果要想vector可以共享就要重写分配器或者用boost的,看了我们那个结构体还是很复杂的,肯定不适用,看来只有改成数组,对于string为什...
阅读全文
摘要:plug过程1.INIT_PLUG#define INIT_PLUG Plug::InitPlug g_InitPlug(true);//共享内存数据结构struct PlugShareMemory{ void* pFirstHand; //第一个打开文件的句柄 I_Plug...
阅读全文
摘要:昨天在上篇blog里描写了如何把STL容器放到共享内存里去,不过由于好久不写blog,发觉词汇组织能力差了很多,不少想写的东西写的很零散,今天刚好翻看自己的书签,看到一篇挺老的文章,不过从共享内存到STL容器讲述得蛮全面,还提供了学习的实例,所以顺便翻译过来,并附上原文地址。共享内存(shm)是当前...
阅读全文
摘要:vector,map这些容器还是在堆上分配的内存,在析构时是释放空间vector在提高性能可以先reserve在push_back()reserve:决定capacity,但没有真正的分配内存,我感觉只是告诉操作系统预留一段空间,但没有真正的分配resize:真正的分配了,可以通过下标访问
阅读全文
摘要:#include #include int* fun(int* a){ std::cout << *a << std::endl;//这样有问题吗???? int temp = 100; return &temp;//这个是典型的错误}int main(){ int a = ...
阅读全文