联机游戏教程(过渡篇)
Autukill 发表于 2014-06-11 09:55:47 2467

本帖最后由 Autukill 于 2014-6-21 17:13 编辑

作者:Autukill 网站:www.gamemake.org 2014年6月9日
[align=left]本系列教程的目标是:实现基于Game Maker:Studio 及C#(Server)的局域联机、网络游戏。[/align]
[align=left][hr]
[/align][align=left]【上篇回顾】[/align][align=left]讲解了几个名词以及服务端、客户端间的关系[/align]
[align=left]【本篇内容】[/align][align=left]为了平缓难度,先从编写最简单的客户端、服务器讲起。[/align]
[align=left]【简单例子】[/align][align=left]Word:http://pan.baidu.com/s/1i3Lxq9B[/align][align=left]源文件(本人使用GMS EA 1.99.97):http://pan.baidu.com/s/1jbO6q 密码:3l5z[/align]

[align=left]先搭建服务器。[/align]
[align=left]Create 事件:[/align]
[table]
[tr][td=568][align=center][align=left]server_id = network_create_server( network_socket_tcp , 6510 , 32 );[/align][/align][/td][/tr]
[/table]
[align=left]创建一个服务器,并把这个服务器的ID存在变量server_id中,异步调用事件中,将用到这个ID,并作为网络通讯中的一个终端。[/align]
[align=left]我们可以创建多个服务器,并通过端口来区分。[/align]
[align=left]network_socket_tcp,上一篇中我没有提到这个名词,它是Socket通讯协议中的一种。常用的有TCP和UDP,上一篇提到的广播数据就是基于UDP,其优缺点比较网上也将多。[/align]
[align=left]如果返回值小于0,则说明创建服务器失败,并关闭程序。[/align]
[table]
[tr][td=568][align=left]if ( server_id < 0 ) [/align][align=left]{[/align][align=left] show_message("服务器创建失败,请同时修改服务器和客户端的端口");[/align][align=left] game_end();[/align][align=left]}[/align][/td][/tr]
[/table]
[align=left]全局变量存储玩家数量:[/align]

[table]
[tr][td=568][align=left]global.player_number=0;[/align][/td][/tr]
[/table]
[align=left]服务器创建好了,接下来处理客户端的通讯。[/align]
[align=left]Asynchronous--Network 事件:[/align]
[align=left]这里,我强调一次异步调用,它不同于同步调用和回调。异步调用无需等待被调函数的返回值就让程序继续执行的方法。对于GMS的网络通讯,由客户端在通讯操作时触发。比如客户端发送数据,连接,断开等时触发。[/align]
[align=left]取得客户端进行网络通讯时所连接的服务器ID(因为我们能够创建多个服务器) [/align]
[table]
[tr][td=568][align=left]var _id = ds_map_find_value(async_load, "id");[/align][/td][/tr]
[/table]

[align=left]选择客户端连接的服务器是哪个? [/align]
[table]
[tr][td=568][align=left] if( _id == server_id)[/align][align=left] {[/align][align=left] //取得通讯的类型:连接,断开,数据[/align][align=left] var _type = ds_map_find_value(async_load,"type")[/align]
[align=left] switch _type[/align][align=left] { [/align][align=left] // 玩家连接服务器,玩家数量+1[/align][align=left] case network_type_connect:global.player_number++ [/align][align=left] break;[/align]
[align=left] // 玩家断开服务器,玩家数量-1[/align][align=left] case network_type_disconnect:global.player_number--[/align][align=left] break;[/align]
[align=left] //玩家发送数据给服务器,这里我们不做处理[/align][align=left] case network_type_data:[/align][align=left] break; [/align][align=left] }[/align][align=left]}[/align]
[/td][/tr]
[/table]
[align=left]如果还有其他服务器:[/align]
[table]
[tr][td=568][align=left]if( _id == server_id2)[/align][align=left]{ [/align][align=left] //someStuff! [/align][align=left]}[/align][/td][/tr]
[/table]
[align=left]一个简单服务器已经编写完成。[/align]
[align=left]客户端相对更容易。[/align]
[align=left]Create 事件:[/align]
[table]
[tr][td=568][align=left] //创建Socket,网络通讯中的一个终端,类似电话系统中的手机[/align][align=left] client_socket = network_create_socket(network_socket_tcp);[/align]
[align=left] //如果返回值小于0,则说明连接失败,检查IP和端口号是否为指定的服务器。[/align][align=left] //调用这个函数后,将触发服务器的异步调用事件,处理玩家的连接。[/align][align=left] error = network_connect(client_socket,"192.168.1.108",6510)[/align]
[align=left] if error<0[/align][align=left] {[/align][align=left] show_message("network_connect()返回值<0,无法到连接服务器,游戏结束");[/align][align=left] game_end();[/align][align=left] }[/align][align=left] else[/align][align=left] {[/align][align=left] show_message("network_connect()返回值>=0,成功连接服务器");[/align][align=left] }[/align][/td][/tr]
[/table]
当游戏结束时,又触发服务器的异步事件断开客户端连接。
其中有很多东西,GMS帮我们自动处理了。

[align=left]通过学习这个简单网络通讯,相信你对这个流程更加理解了。[/align]
[align=left]【下篇内容】[/align][align=left]仍以官方Demo为主,深入讲解Demo中,客户端与服务器进行网络通讯时的操作方式。[/align][align=left]结束GMS间的内网联机的教程,之后讲解其他类型的联机。[/align]


最新回复 (4)
  • 红色激情 发表于 2014-06-12 07:45:14
    0 2
    好深奥啊:Q
  • Autukill 发表于 2014-06-12 08:06:29
    0 3
    Quote红色激情 发表于 2014-6-12 07:45
    好深奥啊


    别卖萌,哪里不懂,我好修改
  • shamoyuu 发表于 2015-07-19 06:22:28
    0 4
    请问GMS EA和GMS的有什么区别?