网易ITOWN平台架构

发布时间:2011-01-04 15:31:58   来源:文档文库   
字号:

一、开发包介绍

开发包简要介绍

目标

  iGate开发包主要用于开发中小型游戏,提供2d3d游戏的解决方案。通过开放平台,为游戏开发者提供各种技术以及功能支持,帮助开发者便捷地开发出优质的游戏,接入iTown平台运营,通过多样化奖励保障开发者的收益;同时,让iTown平台的内容更加丰富,把iTown打造成一个丰富的中小游戏平台,从而达到双赢的目的。

我们提供
  Gamefans 庞大、共享的玩家群体——你只需专注游戏开发,我们负责游戏的发布、推广与运营。

  Assistance 专业、优质的服务支持——我们有专门的团队对开发包进行持续开发,解答开发者问题。

  Tools 免费、强大的开发工具——我们提供游戏开发相关的多个编辑器;预先构建游戏框架逻辑;并提供游戏附属的好友、聊天、排行榜等各种社交功能。

  Earnings 丰厚、持续的经济回报——上线奖金、在线人数奖励、收入分成,多样化的奖励制度给您保障与前景。

你只需
  Idea 专注开发游戏核心玩法,轻松开启成功大门。


开发包结构图
iTown游戏服务器结构图:


点图放大

  *右侧框起来的范围是sdk功能空间

  *3方游戏通过SDK开发包制作并提交接入到iTown游戏平台。


点图放大


开发包有什么
  12D引擎以及相关编辑器
  2、游戏服务器引擎
  3iTown平台功能接口(好友获取、聊天功能、聊天频道的接口、游戏启动和退出接口、扣费接口、成就相关接口、游戏排行接口)
  4、相关文档及接口

开发包接口版本
  开发包会有一个版本号,通常,不同版本的SDK会对已发布的接口进行兼容。
    *如果是2d/3d引擎接口出现不兼容情况,我们会再提供另外一个接口,一定时期后再删除旧有接口,来尽量保证接口兼容性。
    *iTown平台提供的功能接口会同时提供各不同版本的API接口来保证兼容性。

开发流程


二、服务器端详解

服务器总体结构

我们提供的游戏平台的单组服务器结构, 结构如图:

上图是一组游戏服务器(gameserver), 一个游戏可以有多组这样的游戏服务器. 一个游戏进程, 就是玩家看到的一个游戏频道(channel), 游戏进程里,我们分成大厅”, “房间”, 如下图:

作为第三方的游戏开发者, 只需要实现房间逻辑。
其他由iGate游戏平台提供。


平台数据

数据存储, 我们分两部分, 一部分是平台提供的数据, 一部分是游戏的数据。其中, 游戏的数据, 我们提供基本数据存储, 如果存储空间不够, 支持游戏自己建表。

平台数据
平台提供以下数据, 供游戏共享:
1)角色基础数据
角色基础数据有:
账号(urs)
账号唯一id(aid)
账号的禁止权限(banlvl)
账号的gm权限(gmlvl)
角色唯一id(uid)
角色昵称(nickname)
角色性别(sex)
角色avatar(avatar)
角色所带的宠物(pet)
付费元宝(ybpay) ==> 晶币(ybpay) (付费点卡换成的钱)
免费元宝(ybfree) ==> 赠卷(ybfree) (免费点卡换成的钱和系统赠送的钱)

2)成就数据
成就id(ch_id):成就ID
游戏id(gamei):对应哪个游戏的成就。
玩家id(uid):玩家UID
获得成就的时间(get_time):获得某个成就的时间

3)排行榜数据
积分(score):广泛意义上的分数,大量游戏都有可能用到。(可选)
胜局(win_count):胜利局数。(可选)
平局(draw_count):平局局数。(可选)
负局(lose_count):负局局数。(可选)
掉线(break_count):掉线局数。(可选)
自定义1(tag1):游戏自定义数据1,供游戏排行扩展用。(可选)
自定义2(tag2):游戏自定义数据2,供游戏排行扩展用。(可选)
自定义3(tag3):游戏自定义数据3,供游戏排行扩展用。(可选)
自定义4(tag4):游戏自定义数据4,供游戏排行扩展用。(可选)
自定义5(tag5):游戏自定义数据5,供游戏排行扩展用。(可选)
自定义6(tag6):游戏自定义数据6,供游戏排行扩展用。(可选)

4)好友数据
好友分组(setname):好友所在分组
在线状态(online):好友是否在线
游戏状态(games):好友在玩游戏吗?在玩什么游戏?

5)与其他游戏和社区交互的数据(尚未开放)

游戏基本数据

目前, 提供的每个玩家的游戏基本数据有:

1)基本信息
包括:
   coin 游戏自己的游戏币
   score 分数
   win_count 胜局
   draw_count 平局
   lose_count 败局
   break_count 逃跑的局数

2)道具信息
每个玩家允许有多个道具, 其中每个道具格式如下:
   itemtype 道具类型
   count 道具数量
   timeitem 是否时效性道具
   buytime 购买时间
   deadtime 过期时间
   msg 64字节的存储空间
   value int存储空间
   status 状态

3)额外存储空间
每个玩家有16256字节的存储空间(buf), 命名分别为:buf0-buf15. 其中, buf10-buf15暂时被利用为公共存储空间. 因此游戏能使用的实际是:buf0-buf9

游戏额外数据

如果平台数据、游戏基本数据, 依然无法满足游戏的存储需求, 游戏可以自己创建数据库表进行存储(具体会在下个版本详细说明)。


快速开发步骤

消息的定义

消息我们分三种:
   公共大厅的消息(这个由igate游戏平台实现)
   游戏大厅的消息(目前这个暂时不开放)
   游戏房间的消息
因此游戏需要定义的是游戏房间里的消息.

如何定义消息
例子:
所有房间的消息, 定义在一个字典中, 如例子中的"msg_define_map", 字典中的每个元素, 是一个消息. 每个消息, 包括消息名称(msg_define_map中的key)和它对应的消息定义(msg_define_map中该key对应的value). 消息名称必须是字符串, 比如例子中的"sc_player_info", "sc_many_players". 消息定义, 是一个字典, 它的key为此消息的各字段, 必须为字符串, 其中必须至少含有一个名为"_type"的字段. "_type", 是一个0x0000 - 0xFFFF的整型, 是这个消息的消息编号, 它的值必须唯一. key对应的value, 是这个字段的消息类型. 目前支持的类型有下表中的Format:

当消息类型的字符串不在上述列表中定义的字段时, 则被认为是自定义消息. 自定义消息, 格式为: 是一个list, list的每个元素为自定义消息类型. 如例子中的"sc_many_players"消息的"playerlist"字段, 格式为"sc_player_info", 表示: playerlist字段是一个list, 每个元素都是"sc_player_info".

如何生成消息
定义好消息并初始化(调用hall_callback. register_game_room_msgdefine_and_callback初始化)之后, 可通过hall_callback. get_game_room_msgmgr()获得消息管理器.

然后可以通过消息管理器, 生成消息. 比如:

或者:

通过msgmgr.XXXXX(xxxx是你定义的消息的名称), 将得到一个消息对象. 如果没有指定每个字段的初始值, 每个字段都会赋予默认值(数字是0, 字符串是’’). 此消息对象有的字段就是你在消息中定义的字段.

如何发送消息


生成了消息对象msg之后, 可以通过msg.to_string() 得到字符串.
data = msg.to_string()
data即可通过网络接口发送给客户端。

游戏初始化

我们提供的接口中, hall_object, 是一个房间的基类, 需要你重载, 以实现房间逻辑. hall_callback是初始化时提供给你的一些调用接口, 以进行游戏初始化.

重载房间逻辑
实现房间逻辑, 需要通过重载hall_object.HallRoom类来实现.
此类提供的接口, 请查看相关接口文档.

服务器初始化
首先在开发目录下, 创建一个名为room_extend.py的文件. 在该文件中调用hall_init.use_hall():

即可使用iGate游戏平台提供的公共服务.

你可以重写hall_callback.init, 以实现服务器启动时做游戏的进程的初始化. 在初始化中, 你至少需要按顺序做以下两件事情:

1. 设定房间逻辑的消息定义和相关的回调
  消息定义, 则是上面介绍的msg_define_map
  相关回调是一个字典, 消息类型作key, 该消息对应的处理函数做value. 其中, 消息类型即msg_define_map中每个消息里的_type”. 处理函数的参数必须分别是: room, player, msg. room, 是该玩家所在的房间的对象, player是通过room.get_player_by_uid得到的对象, msg是客户端发来的消息对象。

假设已经定义了消息: msg_define_map, 定义了对应的处理函数:event_callback_map. 则可通过以下方式设定消息和回调:
hall_callback. register_game_room_msgdefine_and_callback(
msg_define_map, event_callback_map )

2. 设定游戏模式和对应的房间类
游戏可以有多个模式, 每个模式可以对应不同的房间类. 通过以下方式设定:
hall_callback. set_class_define(class_define_map)
其中, class_define_map格式为: {
gamemode: (minnum, maxnum, roomclass),
}
key为游戏模式(int), value(该房间的最小人数, 最大人数, 房间类)
设定后, 当玩家要创建房间时, 会根据指定的模式, 生成相关的房间对象.

房间与大厅的交互说明

创建房间
(玩家主动请求创建,或系统主动创建)
根据创建房间的模式, 创建你设定的房间类对象

玩家进入房间
"大厅"会调用room.on_player_enter_room函数
(此函数需要你重载)

收到客户端游戏消息
服务器会回调该消息的回调函数, 传入的参数是:
room(该玩家所在房间对象)
player(通过room.get_player_by_hid取到的玩家对象)
msg(客户端发来的消息对象)
(消息回调函数是你在初始化时设定的)

玩家准备状态改变时
(如果你的游戏有准备这一概念时, 才需要走这一步)
你需要主动调用:room.set_player_ready
(主动调用, 大厅就可以知道玩家当前状态)

游戏开始时
你需要主动调用room.set_game_start
(主动调用, 大厅才知道此房间已经开始游戏,
游戏开始后, 大厅就不会再让其他玩家进入此房间,
大厅中的玩家就会看到此房间的状态是开始状态)

游戏结束时
你需要主动调用room.set_game_end
(主动调用, 大厅才知道此房间游戏没有开始,
游戏没开始, 如果不满员, 大厅就会允许其他玩家进入此房间,
大厅中的玩家就会看到此房间的状态是等待状态)

玩家主动离开房间
玩家主动离开此房间.
你需要主动调用room.tell_hall_player_leave_room以告知大厅.
(必须调用, 这样大厅才知道玩家离开房间,回到大厅,
否则玩家在大厅的状态一直是: “在房间中”,
会导致该玩家无法再进入任何游戏)

玩家被动离开房间
(比如玩家断线等, 或游戏告知大厅玩家离开)
大厅会调用room.on_player_leave_room函数
(此函数需要你重载)

清空房间
当该房间的所有玩家都离开后
大厅会调用room.clean函数来清空
(根据需要重载clean函数,
以释放房间的相关资源, 避免内存泄漏)


三、客户端详解

房间与大厅的交互说明

创建房间
(玩家主动请求创建,或系统主动创建)
根据创建房间的模式, 创建你设定的房间类对象

玩家进入房间
"大厅"会调用room.on_player_enter_room函数
(此函数需要你重载)

收到客户端游戏消息
服务器会回调该消息的回调函数, 传入的参数是:
room(该玩家所在房间对象)
player(通过room.get_player_by_hid取到的玩家对象)
msg(客户端发来的消息对象)
(消息回调函数是你在初始化时设定的)

玩家准备状态改变时
(如果你的游戏有准备这一概念时, 才需要走这一步)
你需要主动调用:room.set_player_ready
(主动调用, 大厅就可以知道玩家当前状态)

游戏开始时
你需要主动调用room.set_game_start
(主动调用, 大厅才知道此房间已经开始游戏,
游戏开始后, 大厅就不会再让其他玩家进入此房间,
大厅中的玩家就会看到此房间的状态是开始状态)

游戏结束时
你需要主动调用room.set_game_end
(主动调用, 大厅才知道此房间游戏没有开始,
游戏没开始, 如果不满员, 大厅就会允许其他玩家进入此房间,
大厅中的玩家就会看到此房间的状态是等待状态)

玩家主动离开房间
玩家主动离开此房间.
你需要主动调用room.tell_hall_player_leave_room以告知大厅.
(必须调用, 这样大厅才知道玩家离开房间,回到大厅,
否则玩家在大厅的状态一直是: “在房间中”,
会导致该玩家无法再进入任何游戏)

玩家被动离开房间
(比如玩家断线等, 或游戏告知大厅玩家离开)
大厅会调用room.on_player_leave_room函数
(此函数需要你重载)

清空房间
当该房间的所有玩家都离开后
大厅会调用room.clean函数来清空
(根据需要重载clean函数,
以释放房间的相关资源, 避免内存泄漏)

2D Core Objects

2D引擎——2D资源有机地组合在一起,2D资源包括静态图片(txg)、动画(sp2)2D模型(2dm)、粒子。

基本元素
2D引擎中,一切资源的使用都是以贴图为基础,而对于贴图的管理,则是用txg文件的方式管理,因此贴图是最基本的元素 一张大的图片(tga),里面切割为若干个小图片。txg文件内容如下:

用法:
tg = render.texture_group(txg文件)
tex = tg.get_clip(Clip名字) # tex则为贴图对象。

静态图片
用法:image = world2d.image2d("", tex)

动画

类似gif的动画形式,把每帧的图片按顺序播放。 sp2文件格式如下:

用法:sprite = world2d.sprite2d(sp2文件)

2D模型
利用2D模型编辑器编辑出来的文件。里面包含了挂接系统、轨迹系统、动作组合。 用法: model = iworld2d.2dmodel(2dm文件)

2D粒子系统
选定粒子贴图,选好参数,go!

场景(canvas
一切2D对象,需要挂在场景上才能生效。 用法: world2d.canvas.add_object(2dobj)

初始化时可以设置一共生成多少个背景层。

layer_id越大,越靠前,相同的layer_id,则以rlevel为准,rlevel越大越前,如果rlevel相同,则以生成顺序为准,越迟生成越前。

改变某个对象的层次,可以用obj.set_layer(layer_id),或者生成时的参数增加layer_id 。如果layer_idNone,则取中间的背景层。

镜头/坐标系
需要注意的是,image2d/sprite2d/模型都有key_point的,引擎的key_point默认是0,0,是在图片的中心点,通过iworld2d生成的图片对象,key_point已经改成左上角了。

可以控制镜头的位置,还有远近(也就是透视镜头的可视范围)。用法: world2d.canvas.view_region_center(位置)
world2d.canvas.view_region_size(大小)

编辑器

资源管理
首先建立2D资源目录,建议都放在项目名/res/world2d下其中再分:
基本贴图资源——项目名/res/world2d/txg/...
sp2资源——项目名/res/world2d/sprite/...
模型资源——项目名/res/world2d/2dmodel/...
粒子资源——项目名/res/world2d/particles/...

image编辑器(txg)
把各种零散图片资源整合成一张大图,便于管理(支持格式bmp/jpg/png/tga/dds),输出是一张大图(tga/png/dds)和一个管理文件。

sprite编辑器(sp2)
把一个txg文件中的若干个clip按顺序组合在一起,每次播放一张。

2D模型编辑器(2dm)
可以添加image/sprite,并生成树状的挂接关系。然后按关键帧的方式编辑好轨迹,组合成一套套动作。

2D粒子编辑器
实时生成2D粒子,通过调整粒子大小/时间/颜色/贴图/运动轨迹等等,变化出各种各样的粒子效果。

接口手册

http://igate.163.com/kfsc/api/api/index.html

本文来源:https://www.2haoxitong.net/k/doc/a75ba94efe4733687e21aa40.html

《网易ITOWN平台架构.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式