关于怪物AI,我思考了很长时间,前些日子一直在思考,如何将AI系统做成线程独立。由于是在找不到方案,最终放弃。之前有网友给我推荐说,可是讲AI当做客户端来处理。不错的方案,可是有很多逻辑思考不同,最终放弃。
我再参考了几个游戏的代码之后,决定AI系统就坐在逻辑线程里面好了,就不单独出来了。
大概的思路是,在逻辑线程运行的时候 ,保持每一个循环在处理N条消息的情况下,更新M只怪物的信息!这样既能及时响应客户端的需求,也能及时更新怪物的状态!!
代码:
void GameEngine::run()
{
for(;;)
{
this->pre_process();
this->AIprocess();
this->Msgprocess();
this->post_process();
}
}
void GameEngine::AIprocess()
{
T* monster;
EntityPtrList::NodeType* node;
for(int i=0;i<m;i++)
{
Entity* entity_tmp = *node;
monster = (T*)entity_tmp;
if (monster)
{
monster->updateState();
}
node->next();
}
}
void GameEngine::Msgprocess()
{
for(int i=0;i<n;i++)
{
Msg_Cmd* _msg = NULL;
if(_msg_list.peek(_msg) && _msg != null)
{
process(_msg);
}
else
{
break;
}
}
}