首页 | 教程 | 人才 | 资源 | 视频 | 外包 | 培训 | 论坛  
游戏教程 美术基础 3D设计 平面软件 影视后期 建筑效果 网站设计 精选教程
 
网络学堂   2D美术   3D美术   游戏动作   次时代游戏   游戏策划   游戏程序   理论   其它
 您现在的位置:首页 > 教程频道 > 游戏教程 > 游戏程序
     tnl的ghostObject分析--使在线玩家为n人的架构实现

tnl的ghostObject分析--使在线玩家为n人的架构实现
编辑:大磊 发布时间:2009-06-16 查看:4743 次   
  
作为优秀的游戏网络包tnl最牛的地方就是其ghostobject机制了,用户程序员可以很轻松的控制具体从server到n个client之间的通信逻辑从而使单个玩家收到的场景消息最小,理论上你就是一千,一万个玩家都木有问题,要是你具体介绍看文档..这里分析其实际使用的流程和代码实现,当然你要是不过一些宏和很薄的类封装也可以....

作为客户时,onGhostAdd函数被callback然后可以在这里执行业务逻辑的callback调用,最重要的就是
在客户端把objectInScope里传来的对象给登记上,
至于netobject本身所控制的对象,是作为与server共用的connection的属性而存在的
(只不过一个作为client里的一个作为server里的,client里只有一个connection而server里有n个
,每个connection里仍然是rpc的关系)
传过来的,而执行传递的动作,是由performScopeQuery
里的connection->objectInScope这个方法调用的,此方法只在作为server的时候才被调用

bool Player::onGhostAdd(TNL::GhostConnection *theConnection)
{
addToGame(((TestNetInterface *) theConnection->getInterface())->game);
return true;
}

//addtogame还有个任务就是把属于自己控制的player (不同于client概念) 登记上

void Player::addToGame(TestGame *theGame)
{
// add the player to the list of players in the game.
theGame->players.push_back(this);
game = theGame;

if(myPlayerType == PlayerTypeMyClient)
{
// set the client player for the game for drawing the
// scoping radius circle.
game->clientPlayer = this;
}
}
void Player::performScopeQuery(TNL::GhostConnection *connection)
{
// find all the objects that are "in scope" - for the purposes
// of this test program, all buildings are considered to be in
// scope always, as well as all "players" in a circle of radius
// 0.25 around the scope object, or a radius squared of 0.0625

for(TNL::S32 i = 0; i < game->buildings.size(); i++)
connection->objectInScope(game->buildings[i]);

for(TNL::S32 i = 0; i < game->players.size(); i++)
{
Position playerP = game->players[i]->renderPos;
TNL::F32 dx = playerP.x - renderPos.x;
TNL::F32 dy = playerP.y - renderPos.y;
TNL::F32 distSquared = dx * dx + dy * dy;
if(distSquared < 0.0625)
connection->objectInScope(game->players[i]);
}
}


//connection共享对象在此处定义
class TestConnection : public TNL::GhostConnection
{
typedef TNL::GhostConnection Parent;
public:

/// The TestConnection constructor. This method contains a line that can be
/// uncommented to put the TestConnection into adaptive communications mode.
TestConnection();

/// The player object associated with this connection.
TNL::SafePtr myPlayer;
相关文章:
本月教程排行
全部教程热点 全部推荐教程
· 老外的经典(少女贞德)从.
· Zbrush的行业应用之游戏篇.
· 3DMAX汽车三视图建立到使用.
· ZBrush3官方中文教程
· 3ds MAX基础教程:碗和杯子.
· MAYA材质教程:制作天鹅绒.
· 经典简单室内建模方法(新手.
· 用3ds max结合photoshop制.
· 【painter 8 手绘教程】《.
· Painter 8实例:时尚插画绘.
· Maya教程_3D制作足球模型教.
· 3ds MAX教程:室内空间夜景.
· 3D MAX教程:楼梯间的立体.
· 3dsMAX基础教程 直筒水杯的.
· 《山海经》奢比兽的制作
· PS 绘画 性感美女(国外)教.
· 美术基础--原画底稿上色篇.
· [分享]结构素描
· 贴图教程_PS滤镜快速制作草.
· 原动画运动规律基础教程(翻.
DOGAME游戏兵工厂 | 交流论坛 |关于我们| 广告联系 | 联系我们
DOGAME游戏兵工厂2009-2014HNYU GAME 京ICP备13045305号