360ITO技术社区
  • 首页
  • 文章
  • 快讯
  • 讨论
  • 问答
  • 小贴士
  • 代码块
  • 开源
  • 老论坛
登录 | 注册

360ITO技术社区  > 文章

订阅文章

从零开始学社交游戏开发(九)

smallghost 发布于 7年前 ( comment 0条评论  查看:5442  收藏:0 )
前面我们已经将服务端部署好了,接下去我们可以继续前端的开发工作。

服务端相关服务启动:

1、先启动虚拟机:在E:\workspace\devel_env目录下执行vargrant up命令,如下图:


2、登录Linux系统:通过XShell登录,如下图:



3、启动redis服务,需要启动3个,分别是用户数据、消息和回话:
  $ cd /work/redis_run/user_data/    (注:一定要先到这个目录下面)
  $ sh run.sh
  $ cd /work/redis_run/user_message/
  $ sh run.sh
  $ cd /work/redis_run/user_session/
  $ sh run.sh


4、启动村神游戏服务:
       $ cd /work/projects/cunshen/service/
  $ workon cunshen
  $ python webapp.py debug



以后每次服务端关闭后都要执行上面4步把服务端相关需要的服务器启动起来。

接下来继续开始前端开发。玩家登录游戏后,服务端会返回一堆数据,我们就从这堆数据下手,首先介绍一下有那些数据:
1、玩家游戏数据 - uid(玩家的uid,这个很重要,以后所有和服务端相关的通讯都要用到这个)、神力、神币、声望等等...(很多...,后面会介绍)
2、服务器时间  -  服务端时间,在有和时间相关的地方都要用到这个(例如:村民打怪、割草时间等...)
3、地图数据 - 游戏地图数据记录那里是小草,那里是大树呀...
4、村民数据 - 描述村子里的每个村民
5、好友数据 - 你的好友相关信息
6、礼品栏数据 - 好友送你的礼物都放在这个里面
7、这里省略1万字....呵呵呵
 

玩家数据处理:

   玩家相关数据项介绍:
 神 力  - 每放置一个单元神力减一,神力用完了可以用道具补充或者等时间恢复。
    游戏年  - 玩家在游戏里玩了多长时间。
    声 望  - 声望多了村民就多了,每合成一个建筑都有声望获得。
 收 礼  - 这个数据控制好友是不是可以再给你送礼物。
 慷 慨  - 这个数据控制你是不是可以再给好友送礼物。
 偷 盗  - 每天都能到好友那里偷点东西。
 
在VGCommon工程里面创建一个PlayerData类,所有和玩家的数据都保存在这个类里面。



PlayerData是一个单列模式,setData方法就是保存服务端传过来的数据,具体代码太多就补贴出来了,可以到这里下载源码大家自己看看。


服务器时间处理:


服务器时间只要先保存到 JFApp.serverTime中,以后只要通过JFApp.curServerTime就可以使用获取到服务器时间了,计算神力恢复,村民工作时间等等就都靠他了。(这个时间会和服务器时间有点误差,对于我们这两种类型的游戏来说问题不是很大)。

保存服务器时间:


地图数据处理:

通过地图数据的描述,我们就可以把游戏场景搭建起来了。首先我们先来了解一下每个单元都有那些属性:
 类 型   - 是什么类型的单元(例如:小草、虫、工厂、神马、野猪等等...,具体可以看TVGDefine.as里面的常量定义)
 等 级   - 单元的等级,每合成一次就升一级。(例如:小草是一级,大于2个小草合成2级的大草)
 所属链   - 单元是属于那个链的(社会、艺术、科技和马系)
 次 序   - 放置的次序,合体算法中会要用到这个次序
 坐 标   - 在地图中的格子位置
 黑 影   - 单位是不是黑影(黑影不能升级,去除黑影的办法就是合出的单元)
 闪 光   - 闪光单位在合成的时候会有跳级的作用。
 
下面是第一次玩家进入游戏时的地图数据,第一个是值,第二个是次序:

python代码:


maps = [
            # [值,次序]
            [100,1],  [100,2],  None,     None,     None,None,[901,0],[908,0],[909,0],[902|0xA0000,0],
            [102,3],  None,     [101,4],  [100,8],  None,None,[901,0],[908,0],[910,0],[909,0],
            None,     None,     None,     [100,9],  None,None,[902|0xA0000,0],[902|0xA0000,0],[909,0],[902|0xA0000,0],
            [103,5],  [100,6],  [100,7],  None,     [100,12],[100,3],[901,0],[908,0],[902|0xA0000,0],[910,0],
            None,     None,     None,     [100,10], None,None,[904,0],[908,0],[909,0],[902|0xA0000,0],
            None,     None,     None,     [100,11], None,None,[901,0],[911,0],[911,0],[909,0],
            [901,0],[901,0],[910,0],[901,0],[904,0],[902|0xA0000,0],[901,0],[902|0xA0000,0],[909,0],[902|0xA0000,0],
            [902|0xA0000,0],[904,0],[908,0],[902|0xA0000,0],[908,0],[908,0],[911,0],[908,0],[909,0],[909,0],
            [902|0xA0000,0],[902|0xA0000,0],[909,0],[909,0],[902|0xA0000,0],[909,0],[909,0],[909,0],[910,0],[902|0xA0000,0]
]



现在我们开始保存地图数据,先在game_data包下面创建一个TMapObj类和一个MapData类,TMapObj对应一个地图单元,MapData包含地图上的所有单元,如下图:


在onSysEnterComplete方法中调用setData方法保存地图数据,代码:
MapData.Instance.setData(arg_data.map_objs);
setData方法中将地图数据解析成TMapObj类对象并存到FObjs里面,代码如下:
public function setData(arg_data:Array):void {
    var mapObj:TMapObj;
    onClear();
    var count:int = arg_data.length;
    for (var i:int = 0; i < count; i++) {
        if (arg_data[i] != null) {
            mapObj = new TMapObj();
            mapObj.setValue(arg_data[i][0],arg_data[i][1],i);
            FObjs[i] = mapObj;
        }
    }
}

TMapObj的setValu方法有3个参数:
  1、arg_value - 这个整形变量中存放着3种类型的数据,如下图:


  2、arg_order   - 单元次序,合体算法中会要用到这个次序
  3、arg_key   - 通过这个参数可以计算出单元在格子里面的X和Y坐标
代码:
public function setValue(arg_value:uint,arg_order:int,arg_key:int):void {
    _FValue = arg_value;
    FType = getType();                              // 类型
    var point:Point = MapData.keyToCoord(arg_key);
    FOrder = arg_order;                          // 次序(每次放置一个单位,次序都会+1)
    FGridX = point.x;                               // 格子位置X
    FGridY = point.y;                               // 格子位置Y
    FShadows = getShadows();                // 黑影 0:不是黑影 1:是黑影
    FFlash = getFlash();                            // 闪光 0:不闪光 1:闪光
}
我们地图是 10 X 9 的格子大小,有通过arg_key我们就可以计算出key到坐标的对应关系,下面写出两个方法:
1、Key 转 坐标
public static function keyToCoord(arg_key:int):Point {
    var result:Point = new Point();
    result.x = int(arg_key % cfg.MAP_WIDTH);
    result.y = int(arg_key / cfg.MAP_WIDTH);
    return result;
}

2、坐标 转 Key
public static function coordToKey(arg_x:int, arg_y:int):int {
    return arg_y * cfg.MAP_WIDTH + arg_x;
}


呼呼,地图数据都构建好了,接下来应该把场景搞定!先把美术资源都加载进来(在res目录下可以看到多出res002 - res004几个美术资源包),在系统配置文件中按下图配置好:


游戏场景相关代码放在GameScene类中,我们需要通过SceneManager来获取到GameScene。



在ISceneManager中添加一个get把GameScene暴露出来。
代码:
function get gme_scene():IGameScene;



game_scene方法实现:
public function get game_scene():IGameScene {
    return FGameScene;
}



IDEA实在是太好用了,可以节省很多时间,在实例化game_scene方法时,只要在SceneManager点一下鼠标光标,按下Alt+Enter,IDEA就会自动帮我们完成需要的工作。


 

在IGameScene添加onUpdate方法,这个方法会根据MapData中内容更新场景。


onUpdate方法中需要做的工作就是将数据解析成对应的单元,怎么根据不同类型来构建不同单元呢?大家可能会想到下面这种办法:
switch(type) {
    case TVGDefine.ITEM_XIAO_CAO: {
        // 创建小草
    }
    break;
    case TVGDefine.ITEM_DA_CAO: {
        // 创建大草
    }
    break;
}

这种办法是不是太不专业了?如果有1000种或更多种类的建筑呢?不把我们这些码农给累死了。所以绝对不能这么做。我这里采用词典来匹配创建不同类型的单元。
在村神游戏我将单元分为2大类,分别称为普通单元和特殊单元(为什么说是特殊单元呢?就是这些单元的处理逻辑很特殊,每个单元都有自己独特的处理逻辑。)。下图显示了游戏里将要出现的单元:


从图中可以看到就UnitObj一个是普通单元(普通单元就是参与合成的单元)。现在我们创建了一个GameSceneItemPool类来负责游戏场景所有单元的构造。
首先创建registerClass方法,这个方法作用就是注册游戏的特殊单元。如下图:


今天先写到这里,休息一会...


从零开始学社交游戏开发(五)

从零开始学社交游戏开发(六)

从零开始学社交游戏开发(七)

从零开始学社交游戏开发(八)







0 有用 0 无用
本站原创,欢迎转载;尊重他人劳动,转载时保留以下信息:
本文转自:360ITO技术社区
原文标题:从零开始学社交游戏开发(九)
原文地址:http://www.360ito.com/article/618.html
360ito.com
社交游戏 Flash

共有0个评论 我要评论»

按时间排 按有用数排 按支持数排

网友回复/评论仅代表其个人看法,并不表明本社区同意其观点或证实其描述。

请尽量让自己的回复能够对别人有帮助

1.不欢迎无意义的回复/评论和类似“顶”、“沙发”之类没有营养的文字
如果只是想简单的表个态,请点 有用无用支持反对 等按钮
2.发言之前请再仔细看一遍文章,或许是您遗漏、误解了,理性讨论、切莫乱喷
3.严禁发布违法、违规的信息,请勿到处招贴广告、发布软文;
4.如果您发现自己的回复/评论不见了,请参考以上3条
5.不停制造违规、垃圾信息的,账户将被禁止

热门标签

  • android 20
  • Flash 15
  • 游戏 12
  • Linux 12
  • Python 11
  • 工作笔记 11
  • 社交游戏 7
  • delphi 5
  • jquery 5
  • 编程 4
  • 谷歌 4
  • git 4
  • Centos 4
  • JavaScript 3
  • 开发者 3
  • C/C++ 3
  • 安全 2
  • 代码 2
  • 浏览器 2
  • 移动应用 2

相关文章

周热点

  • 5天前qifei233333333333 (65)

月热点

  • 4周前qifei233333333333 (229)
  • 3周前qifei233333333333 (152)
  • 2周前qifei233333333333 (143)
  • 1周前qifei233333333333 (112)
  • 1周前qifei233333333333 (92)
  • 5天前qifei233333333333 (65)
Copyright ©2011-2012 360ITO技术社区 All Rights Reserved. | 关于 | 联系我们 | 杭州精创信息技术有限公司 浙ICP备09019653号-26|
▲