【cocos2d-x 仙凡奇缘-网游研发(2) 角色换线系统】
转载请注明出处: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
cocos2dxQQ交流群:41131516
【cocos2d-x 仙凡奇缘-网游研发(2) 角色换线系统】的更多相关文章
- 【cocos2d-x 仙凡奇缘-网游研发(1) 登录&注册】
转载请注明出处:http://www.cnblogs.com/zisou/p/xianfan01.html 公司的项目总算告一段落了,年前憋到年后,总算要上线了,所以我也有了时间来搞我自己的游戏项目了 ...
- 【cocos2d-x 手游研发小技巧(6)聊天系统+字体高亮】
转载请注明出处:http://www.cnblogs.com/zisou/p/cocos2dxJQ-6.html 聊天系统在手机网游中是最常见的交互工具,大家在一起边玩游戏边聊天岂不乐哉: 废话不多了 ...
- (转)火溶CEO王伟峰:Unity3D手机网游开发
今天看到这篇文章,感觉很不错,尤其是那句“Unity3D的坑我觉得最严重的坑就是没有懂3D的程序员,把Unity当成Office用”. 转自http://blog.csdn.net/wwwang891 ...
- 【cocos2d-x 手游研发----研发思路及感想】
我半年前进入了目前的这家做教育行业的公司(在此之前一直从事原生态开发手游的迷茫之路),学习是一件很快乐的事情,来到这家公司我有了很多时间去学习,不管是公司业务,还是其他技术相关的.于是开始 ...
- 【cocos2d-x 手游研发----地图活起来了】
谈到地图不少人都说要做地图编辑器了,但是我暂时绕过这一步,如果不用寻路地图就不能移动?寻路就是会绕过障碍物的算法. 我做了一个简单的地图的思想,就是地图分层3层:背景层.可行区域层.遮罩层,但是地图就 ...
- 手机网游开发指南 - 需要多NB的技术
Agent`K 似乎在三天打鱼N天晒网.只能呵呵了,懒散的家伙. 移动互联网越来越火,其中的网络游戏更是火,熊熊大火. 作为攻城师的你,作为小投资者的你,作为满脑子创意想要实现的你,肯定在四处打听:手 ...
- 网游中的网络编程系列1:UDP vs. TCP
原文:UDP vs. TCP,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网 ...
- 【cocos2d-x 手游研发----目录】
感谢大家一直支持我写这样一系列的博客,从中我自己也获益良多,cocos2d-x这样一款非常棒的引擎,是值得我们去学习和分享的,谈到分享,那我就把这套写了差不多一两个月的框架给大家开源下载,写的很一般, ...
- 网游中的网络编程3:在UDP上建立虚拟连接
目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网络编程3:在UDP上建立虚拟连接 TODO 二.在UDP上建立虚拟连接 介绍 UDP是无连接的,一 ...
随机推荐
- 'wmic' 不是内部或外部命令,也不是可运行的程序 解决方法
在环境变量中查看变量名Path下的变量值是否有以下讯息? 如没有复制(Ctrl+C).黏贴(Ctrl+V)→确定即可. %SystemRoot%;%SystemRoot%\system32;%Syst ...
- TEXTMETRICW 结构记录
if( flags == DT_RIGHT ) { SIZE Size = {,}; TEXTMETRICW temp; if (font->GetTextMetricsW(&temp) ...
- Unsupported major.minor version 49.0的错误解决
Unsupported major.minor version 49.0的错误解决 Posted on 2011-01-14 16:49 chinaifne 阅读(15840) 评论(0) 编辑 收 ...
- lib文件反汇编
运行vc命令行,输入:dumpbin /disasm xxx.lib > test.txt lib就是obj文件打包起来的,可以用lib.exe解出来,下面是vc环境下的操作,其他环境,看命令行 ...
- vue组件介绍
https://www.cnblogs.com/Leo_wl/p/5863185.html vue.js说说组件 什么是组件:组件是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重 ...
- 2018.09.20 atcoder 1D Reversi(模拟)
传送门 考虑每次摆石头都会消去最外层的一个连续颜色串. 所以只用统计一下有多少段颜色即可. 代码: #include<bits/stdc++.h> using namespace std; ...
- yii2缓存
use yii\caching\Cache;$cache = Yii::$app->cache;$cache['var1'] = $value1; // equivalent to: $cac ...
- 33. Pay Gap for the Brightest Female Graduatea 最聪明的大学女毕业生面临的工资差距
33. Pay Gap for the Brightest Female Graduatea 最聪明的大学女毕业生面临的工资差距 ① When young women were found to ma ...
- 继承方法-->一级一级继承
Grand.prototype.lastName = 'ji'; function Grand(){}; var grand = new Grand(); Father.prototype = gra ...
- git 删除追踪状态
当不小心添加一个不想被git记录等文件时,这个时候就算将该文件记录在了.gitignore里也是没有用的,因为那个文件已经被git记录过了,只有那些从来没有被git记录过的文件(即:自添加进项目后,从 ...