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

作者:admin 日期:2012/01/23 14:46 人气:

作者:akinggw
"2D网游开发",咱有时都认为这个题目包含滴内容太多,要实现起来也太难.于是,咱决议将它分门别类,偶按照俺要实现得一批网络游戏将它分成下面几个部门:
l 客户端
l 网络端
l 服务器端
l 网页端
俺们来讲解一下,咱们分辨要在每个端口完成什么内容:
(1) 客户端 劈开接收网络数据不谈,咋们主要在客户端实现游戏界面哒显示,游戏界面又包括那些呢?比方,游戏舆图滴显示,精灵得显示,UI(用户界面)滴显示,还有就是一些游戏规矩地制订等等.
(2) 网络端 网络端咱们要做些什么呢?偶想主要包括两个方面:在服务器端,从数据库中掏出数据,然后将数据发送给客户端,从客户端得到数据,然后更新数据库;而在客户端,咱们要干些什么呢?从网络中取出数据,然后更新游戏变量,得到游戏变量,然后将它发送给服务器.这里,咋只是谈鸟一下网络端得大概内容,实际中可能还要修改.
(3) 服务器端 服务器端哒主要内容,咱想就是和数据库打交道.因为咱们是通过网站来注册用户,所以,服务器端哒主要内容就是取数据库内容,更新数据库内容.可能会涉及到删数据库内容,但这不常见.
(4) 网页端 网页端实现地重要内容,咱想大略就是用户得注册,修正,信息滴发布,玩家哒交换和互动.
偶在这里或许讲解鸟2D网游开发开发所波及地内容,可能这些内容会跟着实际开发修改,再修改.
偶想咱制作得这个游戏客户端用SDL,网络端用Raknet,数据库用mySQL,网站制造用JSP.
这些内容可能不能算作一篇文章,偶想叫心得还可以.当然,俺也盼望偶地这些心得不会让你误入歧途.
既然这篇心得叫"2D网络游戏开发(网络篇)",偶就不会写上其它滴一些内容,咋会在这以下哒文章中写偶在使用Raknet滴一些感触,同样,偶愿望它对你有用.
反正,偶感到它很有用.
下面,咋们就开端啦。。
大概在这半年时间里,偶接触拉3款网络引擎,它们分离是:
l openTNL ( )
l SDL_net ( )
l Radnet ( )
三款网络引擎都是为游戏设计哒,下面咱来谈一谈俺对三款引擎地见解.
OpenTNL 来自于Torque 3D游戏引擎,对于Torque 地信息,请拜访 .应当讲openTNL是Torque 哒一局部.可以跨平台运行,也有许多丰盛地文档和教程,但它却有一些致命滴弱点mm使用过于庞杂.因为Torque属于那种早期地游戏引擎,所以在OpenTNL中,许多得编码方法都与你所学哒不同,你需要破费良多地时间去学习它.俺想这也是为什么OpenTNL没有做过很多项目标原因.
SDL_net 起源于SDL,也是一批跨平台地网络引擎.SDL_net使用C语言写成,学习起来也简略明得,但SDL_net太年青鸟,只发展拉短短多少年时光.因而,SDL_net还存在太多得BUG(过错),另外缺乏足够地支持文件也是它发展迟缓哒起因,究竟,它太年轻鸟.
Radnet 可以讲是基于上述两款引擎滴长处为一体.它既有OpenTNL滴文档丰硕,又有SDL_net得使用简单.
在接下来地日子里,俺们将讲解如何使用Radnet,让你充足享受网络给你地快感.
Radnet是一堆基于UDP网络传输协议得C++网络库,www.sfoosf.com,答应程序员在她们自己得程序中实现高效得网络传输服务.通常情形下用于游戏,但也可以用于其它项目.
Radnet有以下好处:
l 高机能 在统一台盘算机上,Radnet可以实当初两个程序之间每秒传输25,000条信息;
l 轻易应用 Radnet有在线用户手册,热血传奇1.85客户端 热血传奇1.85补丁下载 热血传奇1.,视频教程.每一批函数和类都有具体得讲授,每一批功效都有本人哒例程;
l 跨平台,当前Radnet支持Windows, Linux, Macs,可以建立在Visual Studio, GCC, Code: Blocks, DevCPP 和其它平台上;
l 在线技巧支持 RakNet有一批活泼哒论坛,邮件列表,[热点]80后20年间玩过哒单机游戏精品推举,你只有给她们发信,她们可以在几小时之内回复你.
l 保险滴传输 RakNet在你哒代码中主动使用SHA1, AES128, SYN,用RSA防止传输受到攻打
l 音频传输 用Speex编码解码,8位哒音频只要要每秒500字节传输.
l 远程终端 用RakNet,你能远程管理你得程序,包括程序滴设置,密码滴管理和日志滴管理.
l 目录服务器 目录服务器容许服务器列举她们自己须要得客户端,并与她们衔接.
l Autopatcher Autopatcher系统将限度客户端传输到服务端地文件,这样是为拉避免一些分歧法滴用户将一些不正当滴文件传输到服务端.
l 对象重载系统
l 网络数据压缩 BitStream类许可紧缩矢量,矩阵,四元数和在-1到1之间地实数.
l 远程功能调用
l 强壮地通信层 可以保障信息依照不同地信道传输
RakNet支持两种版权,如果你是做免费游戏,RakNet将是免费滴.相反,你必需支付必定哒用度.
从这里你可以下载到最新哒RakNet:

在上一章中,偶简单滴讲解得什么是Raknet,它有那些利益.在这一章中,咋们将讲解如何在IDE中配置Raknet,并将测试一些程序.
因为Raknet得作者使用地是VC++.NET,所以在作者地主页上,她详细地讲解咯如何在VC++.NET中配置Raknet,如果你使用地VC++.NET,可以参看上面滴文章.
而偶使用哒是DC++,因此,偶将讲解如何在DC++中配置Raknet.如果你使用得是VC6,偶倡议你即时进级到.NET.因为在VC6中配置很麻烦,Raknet中哒许多函数库,它都没有,需要从新装置,网页足球游戏,其中就包括STL.
将Raknet.zip解压后,并不能直接使用,因为它没有LIB文件,这需要你重新编译.在Raknet文件下,有多个项目文件,有VC哒和DC得.俺们需要地就是DC哒.如果你先安装得DC++,那立刻你就能看见DC哒项目文件图标.
翻开它,然后按"F9",编译文件.我们用脑子想一想胜利地话,你将在Raknet文件中发明以RakNet.a为名称哒文件,这就是DC++使用哒库文件.
在VC中,库文件扩大名是以LIB结尾,而在DC中是以A结尾.
将你哒RakNet.a拷贝到你滴DC++文件中LIB目录下,地址参考:c:dev-cpplib.
然后将解压后滴RakNet文件中滴include目录下滴所有文件拷贝到DC++文件中include目录下,地址参考:c:dev-cppinclude.
到现在为止,俺们滴文件拷贝算是完成,然后打开DC,让生涯象网页一样丰盛多彩,新建一批项目.
而后建立一些空地名目:
在"Project"中抉择"Project Option".
在"Parameters"表中"Linker"选项中增加下面地语句:
lib/RakNet.a
lib/libws2_32.a
然后取舍OK.
项目配置完成.
然后新建一批源代码文件,改名为main.cpp.
打开一群Raknet得例子,门路参考为:
E:RakNetSamplesCode SamplesChat Example
打开一批C++文件,如:Chat Example Server.cpp.
将Chat Example Server.cpp中滴内容全体拷贝到main.cpp文件中.
这是一些服务器文件,按"F9",编译后,显示结果如下:
如果你哒程序执行结果如上图,阐明你已经配置好鸟;如果不,可能你在某个处所犯错啦,请当真检讨一下.
下一节中,咱们将讲解RakNet中滴函数.
在前面滴章节中,咋们已经讲解咯Raknet是什么,如何在DC中配置Raknet,并测试鸟偶们滴第一堆程序.
在这一篇中,七龙珠游戏,偶们将讲解Raknet地函数,并将写出咱们哒第一程序.
由于Raknet是基于Berkeley Sockets和Winsock开发哒,所以它支撑WINDOWS系统andLINUX体系.能够在局域网,因特网上运行.
当今得游戏大多支持两种模式地网络连接:平等模式和客服端/服务器模式.实在,在现今地在线休闲游戏中,这两种模式都支持.
Raknet支持上述得两种模式.
在网络上,你和我传输信息个别都是依附TCP/IP协议哒,而TCP/IP协定中传输信息滴协议又包含TCP和UDP.
TCP是指哒什么呢?它是指地面向连接滴虚电路协议.也就是讲,它在发送数据之前,要和用户建立连接,并始终坚持和用户连接,然后发送数据,并一直讯问用户是否收到正确哒数据,如果不准确,就重发,直到正确为止.
UDP又是指哒什么呢?它是指用户数据报协议,它在发送数据之前,先和用户建立连接,连接建立好以后,并不一直保持和用户得连接,然后发送数据,也不论对方是否收到数据,然后关闭连接.
从上面哒描写可以看出TCP是相称牢靠地一种连接方式,但它并不合适于游戏中.你可以想一下,如果一批玩家和服务器建立TCP连接,那么要等到这个用户断开和服务器哒连接当前,其它用户才干使用服务器.这显然是不行哒.
而UDP能做到和多个用户同时通讯.例如,一堆玩家要获得她得个人材料,然后她向服务器发出一群恳求,服务器用UDP答复她,并封闭和她哒连接;服务器然后就可以处置其余玩家得信息拉.
俺们在本例中要使用三个头文件:
RakClientInterface.h
RakNetworkFactory.h
RakServerInterface.h
第一批头文件包括啦建立客服端所需要滴信息,其中包括客服真个建立,连接和数据滴发送和接受.
第二个头文件用于治理咋们在程序中使用地类,包括类内存调配和类内存地开释.
第三个头文件用于建立服务器所需用哒信息,包括服务器滴建立,连接和数据滴发送和吸收.
char str[512];
RakClientInterface *rakClientInterface;
RakServerInterface *rakServerInterface;
str[512]是用来断定咱们是要建立服务器仍是客户端.接下来就申明一些客户端实例和一些服务器实例.
printf("(C)客服端 (S)服务器?n");
gets(str);
if (str[0]=='c')
{
rakClientInterface=RakNetworkFactory::GetRakClientInterface();
rakServerInterface=0;
printf("客服端已经树立.");
}
else
{
rakClientInterface=0;
rakServerInterface=RakNetworkFactory::GetRakServerInterface();
printf("服务器已经建立.");
}
得到一批输入值,如果输入值为c,就建立客户端,然后将服务器实例设置为空,如果输入值为其它,就建立服务器,然后就将客户端实例设置为空.
RakNetworkFactory::GetRakClientInterface(); 初始化一堆客户端实例,为它分配内存;
RakNetworkFactory::GetRakServerInterface(); 初始化一堆服务器实例,为它分配内存;
最后,程序履行实现,咋们就需要释放掉咱们方才分配地内存.
if (rakClientInterface)
RakNetworkFactory::DestroyRakClientInterface(rakClientInterface);
else if (rakServerInterface)
RakNetworkFactory::DestroyRakServerInterface(rakServerInterface);
完全滴程序代码如下:
#include "stdio.h"
#include "conio.h"
#include "raknet/RakClientInterface.h"
#include "raknet/RakNetworkFactory.h"
#include "raknet/RakServerInterface.h"
int main(void)
{
char str[512];
RakClientInterface *rakClientInterface;
RakServerInterface *rakServerInterface;
printf("(C)客服端 (S)服务器?n");
gets(str);
if (str[0]=='c')
{
rakClientInterface=RakNetworkFactory::GetRakClientInterface();
rakServerInterface=0;
printf("客服端已经建立.");
}
else
{
rakClientInterface=0;
rakServerInterface=RakNetworkFactory::GetRakServerInterface();
printf("服务器已经建破.");
}
// TODO - Add code body here
getch();
if (rakClientInterface)
RakNetworkFactory::DestroyRakClientInterface(rakClientInterface);
else if (rakServerInterface)
RakNetworkFactory::DestroyRakServerInterface(rakServerInterface);
return 0;
}
程序执行成果如图,你可以建立客户端或服务器:

上一篇:职内网冒险小游戏精选(二)
下一篇:睡前瑜伽


本站热点文章

本站随机文章