07 DirectPlay编程基础.ppt_第1页
07 DirectPlay编程基础.ppt_第2页
07 DirectPlay编程基础.ppt_第3页
07 DirectPlay编程基础.ppt_第4页
07 DirectPlay编程基础.ppt_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在线网络游戏架构,七 DirectPlay编程基础,DirectPlay简介,DirectPlay是DirectX中的一部分,是由微软公司提供的一个独立于网络底层连接的抽象层。 通过DirectPlay,游戏程序不需要知道网络当前的连接状况。DirectPlay通过抽象化通信方法做到这一点。当应用程序使用DirectPlay来实现底层结构联网时,就不必考虑具体使用的联网方法了。 本章主要讨论: 服务提供商 游戏会话 DirectPlay地址 DirectPlay消息处理器,服务供应商( Service Providers),服务供应商: DirectPlay中可用的通信方法,如 TCP/IP,

2、通常被称为服务供应商。 通过列举,可以发现有效的服务供应商。 本书中将TCP/IP设置为服务供应商,因为它是最常用的游戏开发协议,并且很适合于互联网。,游戏会话 (Game Sessions),“游戏会话” 是指运行在两个或更多计算机上的多玩家游戏的一个实例。 DirectPlay中的游戏会话类型有两种: 端对端会话类型 客户端/服务器端会话类型,游戏会话 (Game Sessions),端对端 (Peer-to-Peer) 游戏会话 所有玩家都需要负责与其他玩家之间的指令通信。 一个显而易见的问题是较大的网络流量。 仍然使用了一个服务器,被称为“主机”,负责: 提供一个连接中心,接收新玩家进

3、入游戏。 监视谁在游戏中 当新玩家加入到游戏中,通知每一个玩家 当一个玩家离开游戏时,通知每一个玩家 接收或拒绝新玩家加入到游戏 除了主机,其他的端都必需建立一个连接,以参与到一个端对端会话中。,游戏会话 (Game Sessions),客户端/服务器端(Client/Server, C/S)会话 服务器负责所有游戏间的通信。客户端只与服务器“交谈”,而不与其他客户端“交谈”。 服务器作为一个独立的控制台应用程序运行,不必处理图形。 服务器需要设置一个可供玩家连接的端口 客户端首先定位所要连接的服务器,然后建立连接。客户端只能向服务器发送或接收数据包,而不能发送包到其他玩家或接收来自其他玩家的

4、包。,DirectPlay地址,用DPlay,则必须创建一个能包含各类信息的特殊地址。 DPlay地址中可以包含大量信息。 创建DirectPlay的地址,需要多个步骤,主要包括: 创建地址对象 设置地址对象的服务供应商 设置地址对象中的组件,DirectPlay地址,1创建地址对象 首先必须创建IDirectPlay8Address接口对象 hReturn = CoCreateInstance(CLSID_DirectPlay8Address, NULL, CLSCTX_INPROC_SERVER, IID_IDirectPlay8Address, (LPVOID*) device=%7BI

5、P ADAPTER GUID%7D;,DirectPlay地址,3设置地址对象中的组件 DPlay地址对象中可用组件的列表:,DirectPlay地址,指定DPlay地址对象字符串中的内容的方法: 1. 直接访问并自己处理地址字符串 可以只用手工方式创建整个地址字符串,然后使用BuildFromURLA()函数去调用它。,DirectPlay地址,2. 利用IDirectPlay8Address接口提供的函数来调整地址字符串,DirectPlay地址,最常用的一个函数是AddCompoent(),函数的原型如下: HRESULT AddComponent( const WCHAR *const

6、 pwszName, const void *const lpvData, const DWORD dwDatasize. const DWORD dwDataType); 第一个参数表示将增加的组件的名称 第二个参数表示将使用的数据。 第三个参数指定第二个参数所表示数据的大小 。 最后一个参数表示组件所包含的数据的类型。可用类型: DPNA_DATATYPE_STRING DPNA_DATATYPE_DWORD DPNA_DATATYPE_GUID DPNA_DATATYPE_BINARY,DirectPlay地址,IDirectPlay8Address组件定义:,DirectPlay地址,

7、添加组件实例: hReturng_pHostAddress-Addcomponent( PNA_KEY_HOSTNAME, wszHostName,(wcslen(wszHostName)+1)*sizeof(WCHAR), DPNA_DATATYPE_STRING); if( hReturn !=S_OK) MessageBox(hwnd,“Failed to Addcomponent()”, “hrJoinGame()”, MB_ICONERROR); return -1; ,DirectPlay消息处理器,DirectPlay使用消息处理器处理所有的通信。消息处理器很像是用于每一个Win

8、dows程序中的主消息泵。消息首先被接收,继而被发送到消息处理器。然后,处理器查看信息并决定如何处理它们。 在使用消息处理器之前,必须先创建它。,DirectPlay消息处理器,l. 初始化成员函数Initialize() Initialize()成员函数的原型: HRESULT Initialize (PVOID const pvUsercontext, const PFNDPNMESSAGEHANDLER pfn, const DWORD dwFlags ); 第一个参数指向所谓的提供用户(user-provided)的上下文。上下文中包含了有关信息发送者的信息。例如发送者的ID等重要信息

9、就存储其中。 第二个参数表示接收DirectPlay消息的消息处理器函数的名称。 最后一个参数通常设置为NULL,表示不使用任何标志。 应用实例:建立一个端对端会话消息处理器 if( FAILED( hReturn=g_pDP-Initialize( NULL,DirectPlayMessageHandler, 0) MessageBox(hwindow,“Failed to Message Handler”,“DirectPlay Error”,MB_ICONERROR); return -1; ,DirectPlay消息处理器,2. 设置消息处理器函数 HRESULT WINAPI Mes

10、sageHandler(PVWID pvUserContext, DWORD dwMessageId. PVOID pMsgBuffer); 第一个参数包含了发送消息的用户的上下文。 第二个参数包含了所发送消息的类型的一个标识符。下表列举了部分可用的标准DirectPlay消息。 最后一个参数指向一个包含真实消息内容的void型数据。,DirectPlay消息处理器,DirectPlay消息处理器,3. 消息处理 示例代码: switch(dwMessageId) case DPN_MSGID_HOST_MIGRATE: vShowText(hLB_Output,“Migrate Host”); PDPNMSG_HOST_MIGRATE pHostMigrateMsg; pHostMigrateMsg= (PDPNMSG_HOST_MIGRATE) pMsgBuffer; /检查本地玩家是否为新主机 if( pHostMigrateMsg -dpnidNewHost = g_dpnidLocalplayer) vShowText (hLB_Output,“(HOSTING)”); break; ,DirectPlay消息处理器,使用switch去检查消息ID。一旦一个匹配的被找到,则创建一个该消息类型的消息结构指针。 在这个例子中,接收到DPN_MSGID_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论