转载请注明出处:http://www.cnblogs.com/zisou/p/xianfan01.html

做一款游戏就先得制作好策划文档,和基本的人物世界构架的设计,然后架空在这样一个虚拟的世界中每一个环节都需要考虑到。

这些设计节点,都是环环相扣,相互影响依赖的关系;那么我想让我认识的同学,朋友一起相约到游戏世界中,并且能看到他和

他做交互呢?仙凡游戏的定义就是一款弱联网的游戏(HTTP为主要连接方式),那么弱联网怎么做这样一个交互非常强得功能呢?

看似不可能,不过作为手游,一切可以从简接近去模仿那种效果;

仙凡奇缘这款游戏的角色系统主要有这样一些功能:

人物基本信息

1,角色名称,性别,级别,称谓,账户ID,血,蓝,攻击,防御,攻速,经验值,移动速度;

2,技能ID(4个3个基本,一个必杀技),乘骑状态,坐骑ID,法宝ID,防具ID,首饰ID,背包格子数;

3,人物坐标,所在地图ID,所在地图坐标,场景名称等;

有很多没有列举出来,多达几十个字段的人物信息表,人物属性现在非常清晰了,每个字段都有它的功能;

详细说一下我自己对服务器端设计的架构:

1,服务器提供.aspx的post请求页面;由于C#有强大的托管机制,可以请求过程中运用反射+工厂

给服务器减轻了多人请求复杂数据,查询SQL速度快带来的优越;

2,socket辅助,提供心跳连接,和发送部分即使消息;

客户端通过http登陆后,会建立一个强连接socket连接我们的sockeserver服务器端,只是保持心跳,服务器,会一直

发送客户端心跳信息;实际上这块功能只是出发一些即时消息使用,如果玩家断线,失去连接,照样可以玩游戏,因为

主要通信还是http处理的主要业务;

看一个登陆模块的服务器代码,我在mac上用的是MonoDevelop开发环境,来开发服务器:

客户端创建角色:

ok,这就是基本创建角色部分;在之后进入游戏之后玩家就需要登陆了,登陆进入游戏前已经拿到了人物信息;

接下来就是进入场景之后,需要同步一次玩家(只同步一次即可),不需要玩家每一次的操作都去同步,那样

HTTP根本做不到,那么我们就把这个模拟出来,客户端同步其他玩家时,拿到其他玩家,在服务器上最后一次

切场景的坐标,然后进行本地客户端的AI操作,进行简单的移动即可;

部分代码如下:

void Maps_XianFanTing::UpdataPlayerList(float time)
{
CCPoint randomrange = ccp(,);
CCPoint randomrange2 = ccp(,);
vector<MainRoledata> rolelist = GlobalInfo::getInstance()->get_playerlist();
for (int i = ROLE_PLAYERLIST; i <ROLE_PLAYERLIST+rolelist.size(); i++)
{
int add_x = (int)(CCRANDOM_MINUS1_1()*randomrange.x);
int add_y =(int)(CCRANDOM_MINUS1_1()*randomrange.y);
float acttodo = CCRANDOM_MINUS1_1();
CCPoint npc_nowp =randomrange2;
CCPoint role_move_pc = ccp(npc_nowp.x+add_x,npc_nowp.y+add_y);//此处需要通过地图的视角把人物移动的坐标转化一下。
if(this->getChildByTag(i)!=NULL)
{
if(acttodo>)
{
this->getChildByTag(i)->setZOrder();
SpiritsPlayer::movemethod_Sp((CCSprite*)this->getChildByTag(i),,role_move_pc,rolelist.at(i-ROLE_PLAYERLIST));
}
else
{
this->getChildByTag(i)->setZOrder();
}
}
}
} void Maps_XianFanTing::MapUserListState(float time)
{
//加载其他玩家列表
if(GlobalInfo::getInstance()->getInstance()->get_mapuserlistflag()==true)
{
CCPoint randomrange = ccp(,);
CCPoint randomrange2 = ccp(,);
if(GlobalInfo::getInstance()->get_mapuserlistjsonlist().length()>)
{
vector<MainRoledata> rolelist = JsonPush::ToGetRoleListdata(GlobalInfo::getInstance()->get_mapuserlistjsonlist());
vector<MainRoledata> oldrolelist = GlobalInfo::getInstance()->get_playerlist(); if(oldrolelist.size()>)
{
for (int i = ; i < oldrolelist.size(); i++)
{
if(this->getChildByTag(ROLE_PLAYERLIST+i)!=NULL)
{
this->removeChildByTag(ROLE_PLAYERLIST+i);
}
}
}
if(rolelist.size()>)
{
for (int i = ; i < rolelist.size(); i++)
{ SpiritsPlayer* roles = new SpiritsPlayer(rolelist.at(i),);
int add_x = (int)(CCRANDOM_MINUS1_1()*randomrange.x);
int add_y =(int)(CCRANDOM_MINUS1_1()*randomrange.y);
roles->npc->setPosition(ccp(randomrange2.x+add_x,randomrange2.y+add_y));
this->addChild(roles->npc,,ROLE_PLAYERLIST+i);
}
}
GlobalInfo::getInstance()->set_playerlist(rolelist);
}
GlobalInfo::getInstance()->set_mapuserlistflag(false);
}
}

效果:玩家可以做简单的移动,模仿出了玩家都在线的感觉就行;

换线的思路是在服务器中建立一个地图的分线表,里面的字段只有人物ID和地图ID和所在线ID,如果达到同屏,那就

在换线的时候,切换自己的线的ID,然后同步一次其他玩家数据(同步和自己所在一个线ID)的玩家,客户端做相应

的刷新,同步操作!

刚才我们看到1线人是非常多的,而且服务器根本不可能给我们提供所有玩家同屏信息,那么我约好一个朋友去2线;

就可以同屏看到我的小伙伴了,效果如下图:

上图可以清晰看到,我成功换到了2线,并且服务器给我同步了一次玩家操作,我来到2线后就可以看到想找的小伙伴!

这一篇大概介绍了一下制作这个游戏角色系统功能的详细方法和思路,其实这样看上去弱联网的游戏也能有非常好的

效果,下一篇我会说一下,弱联网情况下聊天制作,聊天同步的操作;

ps:仙凡奇缘官网 http://www.xianfancoco.com

仙凡奇缘开发版1.0已上线:百度云盘下载体验

cocos2dxQQ交流群:41131516

 

【cocos2d-x 仙凡奇缘-网游研发(2) 角色换线系统】的更多相关文章

  1. 【cocos2d-x 仙凡奇缘-网游研发(1) 登录&注册】

    转载请注明出处:http://www.cnblogs.com/zisou/p/xianfan01.html 公司的项目总算告一段落了,年前憋到年后,总算要上线了,所以我也有了时间来搞我自己的游戏项目了 ...

  2. 【cocos2d-x 手游研发小技巧(6)聊天系统+字体高亮】

    转载请注明出处:http://www.cnblogs.com/zisou/p/cocos2dxJQ-6.html 聊天系统在手机网游中是最常见的交互工具,大家在一起边玩游戏边聊天岂不乐哉: 废话不多了 ...

  3. (转)火溶CEO王伟峰:Unity3D手机网游开发

    今天看到这篇文章,感觉很不错,尤其是那句“Unity3D的坑我觉得最严重的坑就是没有懂3D的程序员,把Unity当成Office用”. 转自http://blog.csdn.net/wwwang891 ...

  4. 【cocos2d-x 手游研发----研发思路及感想】

          我半年前进入了目前的这家做教育行业的公司(在此之前一直从事原生态开发手游的迷茫之路),学习是一件很快乐的事情,来到这家公司我有了很多时间去学习,不管是公司业务,还是其他技术相关的.于是开始 ...

  5. 【cocos2d-x 手游研发----地图活起来了】

    谈到地图不少人都说要做地图编辑器了,但是我暂时绕过这一步,如果不用寻路地图就不能移动?寻路就是会绕过障碍物的算法. 我做了一个简单的地图的思想,就是地图分层3层:背景层.可行区域层.遮罩层,但是地图就 ...

  6. 手机网游开发指南 - 需要多NB的技术

    Agent`K 似乎在三天打鱼N天晒网.只能呵呵了,懒散的家伙. 移动互联网越来越火,其中的网络游戏更是火,熊熊大火. 作为攻城师的你,作为小投资者的你,作为满脑子创意想要实现的你,肯定在四处打听:手 ...

  7. 网游中的网络编程系列1:UDP vs. TCP

    原文:UDP vs. TCP,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网 ...

  8. 【cocos2d-x 手游研发----目录】

    感谢大家一直支持我写这样一系列的博客,从中我自己也获益良多,cocos2d-x这样一款非常棒的引擎,是值得我们去学习和分享的,谈到分享,那我就把这套写了差不多一两个月的框架给大家开源下载,写的很一般, ...

  9. 网游中的网络编程3:在UDP上建立虚拟连接

    目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网络编程3:在UDP上建立虚拟连接 TODO 二.在UDP上建立虚拟连接 介绍 UDP是无连接的,一 ...

随机推荐

  1. python内置函数之attr【反射】

    #Auther Bob#--*--conding:utf-8 --*-- #我们来循序渐进的学习反射 import s1 #阶段1# def run():# url = input("请输入 ...

  2. actionBar_Tab导航

    actionBar配合碎片使用  初始化actionBar要注意设置actionbar的导航模式 package com.qf.actionbar04_tab; import java.io.File ...

  3. java的PDF纵横向打印

    PDF默认是纵向打印的,通过rotate()来让其改变为横向打印,一般在打印A4 12*21纸以及发票的时候会用横向打印.横向打印时页面会出现行转列以及列转行的情况,因此在设置页面大小的时候一定要宽度 ...

  4. centos6.6 下 安装 php7 按 nginx方式

    1.安装必要的依赖库 > yum -y install gd zlib libjpeg libjpeg-devel libpng libpng-devel freetype freetype-d ...

  5. springMVC使用@RequestParam用于处理简单类型的绑定

    使用@RequestParam常用于处理简单类型的绑定. value:参数名字,即入参的请求参数名字,如value=“item_id”表示请求的参数区中的名字为item_id的参数的值将传入: req ...

  6. sql server 2008安装的时候选NT AUTHORITY\NEWORK SERVICE 还是选 NT AUTHORITY\SYSTEM ?

    sql server 2008安装的时候选NT AUTHORITY\NEWORK SERVICE 还是选 NT AUTHORITY\SYSTEM ? sql server 2008安装的时候选NT A ...

  7. "我们分手吧。"女的对男的说。 "为什么呢?亲爱的,你不要我了么?" "因为你幼稚。"女的坚定地语气回答道,然后转身准备走。 男的上前踩住女的影子,然后说...

    1."我们分手吧."女的对男的说. "为什么呢?亲爱的,你不要我了么?" "因为你幼稚."女的坚定地语气回答道,然后转身准备走. 男的上前踩 ...

  8. java判断字符串是否为数字,包括负数

    /** * 判断是否为数字,包含负数情况 * @param str * @return */ private boolean isNumeric(String str){ Boolean flag = ...

  9. Axios的基本使用

    Axios的基本使用 介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.在vue 中,用来发ajax请求,与后端交互. 从浏览器中创建 XMLHtt ...

  10. 20155305乔磊2016-2017-2《Java程序设计》第七周学习总结

    教材学习内容总结 第十二章 Lambda 12.1 认识Lambda语法 - Lambda 教材的引入循序渐近.深入浅出 如果使用JDK8的话,可以使用Lambda特性去除重复的信息,例: Compa ...