Lobby2Client_360插件概览
NP系统的接口,包括信号
PS3 NP系统提供了房间和大厅的概念。Sony也使用NAT穿透架起了自己的主机服务器。通过使用Lobby2Client_PS3插件,这些服务以RakNet接口的方式提供给用户使用。
例子位于np_matching2_lobby工程下的RakNet_PS3_VS2005解决方案下。这个例子是使用了PS3 SDK的np_matching2例子,但是修改成了RakNet接口调用形式。如果你仔细看Lobby2Client_PS3.cpp和Lobby2Message_PS3.cpp的源代码,你会看到例子中使用的代码中其大部分的代码是相同的。这保证了与PS3 TCRs的一致性。
使用:
将Lobby2Client_PC3实例附加到RakPeer实例。大部分的操作是通过SendMessage()方法和SendMsgAndDealloc()方法来执行,类也包含了一些功能函数。例如,IsInRoom()返回你当前是否位于房间内。GetNumFriends()方法返回在线好友数。参考类的方法的完整列表。
可用的操作方法可以在Lobby2Message_PS3.h文件中查看。这些操作的文档是在文件中做了详细陈述。参考文件的底部的操作完整列表。
需要的文件:
DependentExtensions\Lobby2目录下的所有文件,除了Lobby2Server.h和Lobby2Server.cpp。这些是所有平台都需要的共有文件。
DependentExtension\Lobby2\ps3目录下的所有文件。这些文件是针对PS3的。Smaples\Lobby2Client_PS3\np_matching2\np_maching2_lobby\np_conf.*。
例子代码:
初始化RakNet:
RakNet::Lobby2Message* startupMsg = messageFactory->Alloc(RakNet::L2MID_Client_Login);
((RakNet::Client_Login_PS3*) startupMsg)->cellSysutilRegisterCallback_slot = 3;
((RakNet::Client_Login_PS3*) startupMsg)->npCommId = NpConf::npCommId();
((RakNet::Client_Login_PS3*) startupMsg)->npCommPassphrase = NpConf::npCommPassphrase();
lobby2Client->SendMessage(startupMsg);
if (startupMsg->resultCode != RakNet::L2RC_PROCESSING && startupMsg->resultCode != RakNet::L2RC_SUCCESS)
printf("PS3 Login failed.\n");
messageFactory->Dealloc(startupMsg);
附加插件,注册回调
struct PS3Results : public RakNet::Lobby2Callbacks
{
// ...
} ps3Results;
// 附加插件,注册回调
messageFactory = new RakNet::Lobby2MessageFactory_PS3;
lobby2Client = new RakNet::Lobby2Client_PS3();
lobby2Client->AddCallbackInterface(&ps3Results);
lobby2Client->SetMessageFactory(messageFactory);
rakPeer->AttachPlugin(lobby2Client);
登陆:
RakNet::Lobby2Message* startupMsg = messageFactory->Alloc(RakNet::L2MID_Client_Login);
((RakNet::Client_Login_PS3*) startupMsg)->cellSysutilRegisterCallback_slot = 3;
((RakNet::Client_Login_PS3*) startupMsg)->npCommId = NpConf::npCommId();
((RakNet::Client_Login_PS3*) startupMsg)->npCommPassphrase = NpConf::npCommPassphrase();
lobby2Client->SendMessage(startupMsg);
if (startupMsg->resultCode != RakNet::L2RC_PROCESSING && startupMsg->resultCode != RakNet::L2RC_SUCCESS)
{
printf("PS3 Login failed.\n");
}
messageFactory->Dealloc(startupMsg);
读取异步登陆结果:
// 使用这些代码更新PS3Results类
struct PS3Results : public RakNet::Lobby2Callbacks
{
virtual void MessageResult(RakNet::Client_Login *message)
{
if (message->resultCode == RakNet::L2RC_Client_Login_CANCELLED)
{
printf("L2RC_Client_Login_CANCELLED");
}
else if (message->resultCode == RakNet::L2RC_Client_Login_CABLE_NOT_CONNECTED)
{
printf("L2RC_Client_Login_CABLE_NOT_CONNECTED");
}
else if (message->resultCode == RakNet::L2RC_Client_Login_NET_NOT_CONNECTED)
{
printf("L2RC_Client_Login_NET_NOT_CONNECTED");
}
else if (message->resultCode != RakNet::L2RC_SUCCESS)
{
printf("An error has occurred while unloading NetStartDialog.");
}
else
{
//Success
printf("Login Success");
}
}
} ps3Results;
重要:
1. 使用这个系统,在发送Client_Login消息之前,需要启动RakNet。此外,在传递给Startup()方法SocketDescriptor参数中,要指定remotePortRakNetWasStartedOn_PS3。如果所有的系统从一个相同端口启动,那么SocketDescriptor::remotePortRakNetWasStartedOn_PS3应该等于SocketDescriptor::port。
2. 当RakNet没有运行时,需要手动调用Lobby2Client_PS3::Update()方法,否则回调函数不会被调用。
By 北洋小郭
转载请注明出处,请勿用于商业用途,谢谢!