2D网络游戏开发(网络篇)(七)2

原创 2006年06月22日 11:42:00
autoPatcher.SetNetworkingSystem(rakPeer);
 
SetNetworkingSystem函数的原型如下:
 
void SetNetworkingSystem (RakPeerInterface *localSystem)
void SetNetworkingSystem (RakClientInterface *localSystem)
void SetNetworkingSystem (RakServerInterface *localSystem)
 
这个函数的作用就是设置使用哪个系统的实例来传输文件。
这些设置好了以后,下一步我们将在服务器端设置加载文件,在客户端设置下载文件,设置如下:
 
服务器端:
 
               if (AutoPatcher::CreateFileSignature(input)==false)
                      printf("Unable to create file signature %s.shan", input);
 
               if (autoPatcher.SetFileDownloadable(input, true)!=SET_FILE_DOWNLOADABLE_SUCCESS)
                      printf("Unable to make %s downloadablen", input);
        }
 
       printf("Enter name of second file to make downloadable or hit enter for nonen");
       gets(input);
        if (input[0] && autoPatcher.SetFileDownloadable(input, false)!=SET_FILE_DOWNLOADABLE_SUCCESS)
               printf("Unable to make %s downloadablen", input);
 
前面两个if语句用于设置带签名的文件,最后一个if用于设置不带签名的下载。三个函数原型如下:
 
bool AutoPatcher::CreateFileSignature ( char * filename   ) [static]
 
为filename建立一个以.sha为扩展名的签名文件。
 
SetFileDownloadableResult AutoPatcher::SetFileDownloadable ( char * filename, 
 bool checkFileSignature
 ) 
 
这个函数,我们已经在前面讲解了。
然后需要在客户端设置文件的下载目录:
 
       autoPatcher.SetDownloadedFileDirectoryPrefix(input);
 
函数原型如下:
 
void AutoPatcher::SetDownloadedFileDirectoryPrefix ( char * prefix   )
 
就是设置文件下载到什么地方,用prefix设置,例如 c:.
 
现在进入循环当中,在消息检测当中,加入下面的代码:
 
               case ID_AUTOPATCHER_REQUEST_FILE_LIST:
                      printf("Got a request for the file listn");
                      autoPatcher.SendDownloadableFileList(packet->playerId);                       
                      break;
               case ID_AUTOPATCHER_FILE_LIST:
                      printf("n-------nGot the list of available server files.nRequesting downloads.n-------n");
                      autoPatcher.OnAutopatcherFileList(packet, true);
                      if (ShowDownloadStatus(&autoPatcher)==0)
                      {
                             rakPeer->DeallocatePacket(packet);
                             goto QUIT;
                      }
                      break;
               case ID_AUTOPATCHER_REQUEST_FILES:
                      printf("Got a request for filesn");
                      autoPatcher.OnAutopatcherRequestFiles(packet);
                      break;
               case ID_AUTOPATCHER_SET_DOWNLOAD_LIST:
                      printf("* Confirmed download listn");
                      autoPatcher.OnAutopatcherSetDownloadList(packet);
                      break;
               case ID_AUTOPATCHER_WRITE_FILE:
                      printf("-------nGot a filen-------n");
                      autoPatcher.OnAutopatcherWriteFile(packet);
                      if (ShowDownloadStatus(&autoPatcher)==0)
                      {
                             rakPeer->DeallocatePacket(packet);
                             goto QUIT;
                      }
                      break;
               }
 
autoPatcher.SendDownloadableFileList函数的原型如下:
 
void AutoPatcher::SendDownloadableFileList ( const PlayerID remoteSystem   ) 
 
这个函数的作用就是将下载列表中的全部文件发送到以PlayerID为标致的客户端去。
 
.OnAutopatcherFileList的函数如下:
 
void AutoPatcher::OnAutopatcherFileList ( Packet * packet, 
 bool onlyAcceptFilesIfRequested
 )  
 
这个函数的作用就是分析服务器端的下载文件列表,看是否有我们没有的文件,或是不匹配的文件。然后以包的形式将分析结果传给服务器。
第二个参数,如果设置成真,那么就调用了这个函数以后就用GetDownloadStatus函数进行分析。如果设置成假,就马上下载文件。
 
autoPatcher.OnAutopatcherRequestFiles(packet);
这个函数原型如下:
void AutoPatcher::OnAutopatcherRequestFiles ( Packet * packet   ) 
这个函数的作用就是从内存中读取文件,然后将它们发送到客户端。
 
autoPatcher.OnAutopatcherSetDownloadList(packet);
这个函数原型如下:
void AutoPatcher::OnAutopatcherSetDownloadList ( Packet * packet   )  
这个函数的作用就是服务器端同意下载下载列表上的文件。
 
autoPatcher.OnAutopatcherWriteFile(packet);
函数原型如下:
bool AutoPatcher::OnAutopatcherWriteFile ( Packet * packet   )  
 这个函数的作用就是将接受到的文件全部写入到我们设置的硬盘里。
 
其它就没什么了,大家可以参考其源代码就在raknet的例程当中。关于程序执行的效果,请大家自己去编译。
Over!
 
关于更多内容请访问金桥科普网站( http://popul.jqcq.com  )游戏开发栏目,如你需要游戏开发方面的书籍请参考金桥书城游戏频道(http://book.jqcq.com/category/1_70_740.html )。如果你在阅读本篇文章时有什么好的建议请来信给我,我的E_mail: akinggw@126.com. 如果你在使用SDL时有什么问题,请到金桥科普网站(http://popul.jqcq.com  )游戏开发栏目,我将详细地为你解答。
 
 
 

2D网络游戏开发(网络篇)(七)1

2D网络游戏开发(网络篇)(七) 作者:akinggw 在前面的章节中,我们讲解了如何在服务器和客户端之间如何传输信息,今天,我们将讲解在它们之间如何传输文件。这个功能很重要,比如,在网络游戏中,为了...
  • akinggw
  • akinggw
  • 2006年06月22日 11:40
  • 1143

2D网络游戏开发(网络篇)(八)2

#pragma pack(1)struct C   //结构C的类型和结构A的类型一样{ A a; B b;}#pragma pack(1)struct D      //结构C的类型和结构A的类型一...
  • akinggw
  • akinggw
  • 2006年06月22日 11:44
  • 1496

cocos2d-x商业级单机游戏和网络游戏开发系列

引言 接触coco2d-x已经一年多了,期间陆陆续续开发了很多的游戏,包括单机的小游戏和网络卡牌游戏。cocos2d-x是一个快速发展的引擎,除了经常的主引擎的更新之外,社区内也经常涌现出新的插件,...
  • hhk20042005
  • hhk20042005
  • 2013年09月17日 13:14
  • 1829

2D网络游戏开发(网络篇)(八)1

2D网络游戏开发(网络篇)(八) 作者:akinggw 前言 已经写到raknet编程的第八篇了,在前面的内容当中,我们讲解了raknet如何传输普通的信息,可光是这些是不够的。因为一个游戏不可能就只...
  • akinggw
  • akinggw
  • 2006年06月22日 11:43
  • 913

2D网络游戏开发(网络篇)(二)

2D网络游戏开发(网络篇)(二) 作者:akinggw在上一章中,我简单的讲解了什么是Raknet,它有那些好处。在这一章中,我们将讲解如何在IDE中配置Raknet,并将测试一个程序。由于Rakne...
  • akinggw
  • akinggw
  • 2006年06月22日 11:34
  • 2285

2D网络游戏开发(网络篇)(四)

2D网络游戏开发(网络篇)(四) 作者:akinggw 在上一篇中,我们只是讲解了如何建立一个服务器或客户端。这一篇中,我们将讲解客户端如何和服务器进行连接。 #include "stdio.h" /...
  • akinggw
  • akinggw
  • 2006年06月22日 11:36
  • 1620

2D网络游戏开发(网络篇)(一)

2D网络游戏开发(网络篇)(一) 来源: ChinaUnix博客  日期: 2006.05.26 11:16 (共有0条评论) 我要评论 作者:akinggw“2D网游开发”,我有时都觉得这个标题包含...
  • Aaronzzq
  • Aaronzzq
  • 2011年04月07日 12:07
  • 950

2D网络游戏开发(网络篇)(六)

2D网络游戏开发(网络篇)(六) 作者:akinggw 在前面的章节中,我们实现了一个简单的聊天室。今天,我们仍然要围绕这个主题,但采取别的方法,这个方法很有用,应该说是整个网络引擎的关键,它就是――...
  • akinggw
  • akinggw
  • 2006年06月22日 11:38
  • 864

2D网络游戏开发(网络篇)(十)

2D网络游戏开发(网络篇)(十) 作者:akinggw 前言 其实,我也很想将游戏开发简单化,可不管我怎么努力,游戏开发还是那么难,还是涉及那么多知识。同样,在这里,我也希望我的翻译和讲解能够让你明白...
  • akinggw
  • akinggw
  • 2006年06月22日 11:45
  • 1318

2D网络游戏开发(网络篇)(九)

2D网络游戏开发(网络篇)(九) 作者:akinggw 前言 转眼之间,就来到了这一系列教程的第九课来了,事先声明一下,这些文章大多来源于raknet的官方网站或者例程。如果你觉得我的文章有地方看不懂...
  • akinggw
  • akinggw
  • 2006年06月22日 11:44
  • 1505
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2D网络游戏开发(网络篇)(七)2
举报原因:
原因补充:

(最多只允许输入30个字)