C#服务端的微信小游戏——多人在线角色扮演(十一)
C#服务端的微信小游戏——多人在线角色扮演(十一)
- 账号
- 角色生成
- 角色名字生成
账号是现实世界对用户的描述,而角色则是游戏世界当中用户的体现。
——茂叔
账号
上一篇,我们利用微信的api完成了用户的登录工作,那现在,我们来处理用户的账户和角色信息。
首先,我们在type.cs
里面为用户的账户建立一个类。
public struct Account{public uint AID;//账户的编号public string openid;//微信的标识public string nickname;public DateTime CreateTime;public DateTime LastLogin;}
很简单吧。然后我们在GameServer
里面去定义一个账号池,并在构造函数初始化,用来暂时储存账号信息。
……
public List<Account> AccountPool;public GameServer(MainForm monitor){Status = 0;Monitor = monitor;LOG("GameServer创建成功");gGame = new Game(LOG);gGame.Name = "像素寒冷";AccountPool = new List<Account>();……
然后在GameServer
类的ParseClientCommand
方法里面,对GameCommand.LOGIN
指令做一些修改,检查有没有对应openid
的账号,没有就立即创建一个放进我们账号池里面。然后去取得对应账号的用户角色回传给客户端。
……
case GameCommand.LOGIN:{string requeststr = "https://api.weixin.qq.com/sns/jscode2session?appid=" + G.AppID + "&secret=" + G.Secret + "&js_code=" + data + "&grant_type=authorization_code";HttpWebRequest wxRequest = (HttpWebRequest)WebRequest.Create(requeststr);wxRequest.Method = "GET";wxRequest.Timeout = 6000;HttpWebResponse wxResponse = (HttpWebResponse)wxRequest.GetResponse();Stream stream = wxResponse.GetResponseStream();StreamReader reader = new StreamReader(stream);string res = reader.ReadToEnd();stream.Close();reader.Close();JObject json = JObject.Parse(res);if (json.TryGetValue("openid", out JToken openid)){Account account;lock (AccountPool){account = AccountPool.Find(x => x.openid == openid.ToString());if (account.openid == null){account = new Account(){AID = (uint)G.RND(10000000, 99999999),openid = openid.ToString(),CreateTime = DateTime.Now};while (AccountPool.Exists(x => x.AID == account.AID)){account.AID = (uint)G.RND(10000000, 99999999);}AccountPool.Add(account);}account.LastLogin = DateTime.Now;}JObject playerjson=gGame.GetPlayerJsonWithAccountID(account.AID);((GameConnection)connection).SendMessage(cmd, playerjson.ToString());}}break;
……
因为客户端需要接受的是Json对象,所以我们为GameObject
定义了一个ToJson
方法,用以获得其Json串,在GameCharacter
和GamePlayer
里面进行了覆盖,添加进新的内容。
GameObject
public virtual JObject ToJson(){JObject ClientJSON = new JObject();ClientJSON.Add("Name", Name);ClientJSON.Add("Status",(int)Status);ClientJSON.Add("ImgFileID", ImgFileID);ClientJSON.Add("ImgID", ImgID);ClientJSON.Add("StatusStep", StatusStep);ClientJSON.Add("Dir", (int)Dir);return ClientJSON;}
GameCharacter
public override JObject ToJson(){JObject ClientJSON = base.ToJson();ClientJSON.Add("Gender", Gender);ClientJSON.Add("Level", Level);ClientJSON.Add("Exp", Exp);ClientJSON.Add("HP", HP);ClientJSON.Add("Max_HP", Max_HP);ClientJSON.Add("Energe", Energe);ClientJSON.Add("Max_Energe", Max_Energe);ClientJSON.Add("Hungry", Hungry);ClientJSON.Add("Max_Hungry", Max_Hungry);ClientJSON.Add("Attack_Point", Attack_Point);ClientJSON.Add("Defence_Point", Defence_Point);ClientJSON.Add("Attack_Point_Extra", Attack_Point_Extra);ClientJSON.Add("Defence_Point_Extra", Defence_Point_Extra);ClientJSON.Add("Speed", Speed);return ClientJSON;}
GamePlayer
public override JObject ToJson(){JObject ClientJSON = base.ToJson();ClientJSON.Add("AID", AID);ClientJSON.Add("PlayerID", PlayerID);return ClientJSON;}
这样通过ToJson
方法获得的数据,发回客户端的数据就都是Json格式的了。
角色生成
在Game
类里面也定义一个角色池,用来储存角色。再新建一个方法用来取得对应账号的游戏角色Json值:
……
private List<GamePlayer> PlayerPool;
public Game(Action<string> LOGFUN = null){G.GlobeTime = 0;gWorld = new GameWorld(LOGFUN);PlayerPool = new List<GamePlayer>();RunThread = null;IsRunning = false;
……
public JObject GetPlayerJsonWithAccountID(uint AID){GamePlayer player;lock (PlayerPool){player = PlayerPool.Find(x => x.AID == AID);if (player == null){player = new GamePlayer(){AID=AID,PlayerID = (uint)G.RND(10000000, 99999999),CreateTime = DateTime.Now };while (PlayerPool.Exists(x => x.PlayerID == player.PlayerID)){player.PlayerID = (uint)G.RND(10000000, 99999999);}player.Name = "@";PlayerPool.Add(player);}}return player.ToJson();}
同样的道理,没有对应角色就创建一个。
现在可以为从GameObject
,GameCharacter
一直到GamePlayer
的对象添加一些与游戏相关的成员了。修改之后的成员如下:
GameObject
……
public string Description;public ExistenceID MapEID;public byte X;public byte Y;public ObjectCategory Category;public ObjectClassID ClassID;public ObjectStatus Status;public byte StatusStep;public byte ImgFileID;public byte ImgID;public bool CanPass;public GameObject[] Inventory;public ExistenceID OwnerEID;public Direction Dir=Direction.NONE;
……
GameCharacter
……
public byte Gender = 0;//0-female, 1-malepublic uint Level = 1;//等级public uint Exp = 0;//经验public byte HP = 100;//血public byte Max_HP = 100;//血的最大值public byte Energe = 100;//体力public byte Max_Energe = 100;//体力最大值public byte Hungry = 100;//饥饿public byte Max_Hungry = 100;//饥饿最大值public ushort Attack_Point = 1;//攻击public ushort Defence_Point = 1;//防御public ushort Attack_Point_Extra = 1;//攻击附加,装备了武器什么的public ushort Defence_Point_Extra = 1;//防御附加public byte Speed = 128;private byte SpeedBuff = 0;
……
这些与游戏相关的成员,是不是一看就懂啊~哈哈!
GamePlayer
……
public uint AID = 0;//对应账号编号public uint PlayerID = 10000000; public DateTime CreateTime = DateTime.Now;
……
玩家的角色对象把账号信息也带上。
在客户端那边的命令解析方法里,把服务端传回的信息log出来:
net.js
function parseMessage(msg) {if (msg.command == 1) //这是初次连接成功传回的结果{_g.COMMAND = JSON.parse(msg.data);login()} else {switch (msg.command) //其他命令的处理结果{case _g.COMMAND.LOGIN:console.log(msg.data)break;}}
}
调试一下看看效果:
客户端已经收到了。在客户端定义一个全局对象,用来储存玩家的信息,还记得我们的_g
么?就定义在里面:
global.js
GameGlobal._g = {COMMAND: undefined,WEBSOCKET_URL : 'ws://localhost:666/',DEVICEWIDTH: undefined,DEVICEHEIGHT:undefined,Player:{}//玩家对象}
然后把收到的信息装进去,通过wx.getUserInfo
把最新的微信昵称和头像也装进去:
net.js
case _g.COMMAND.LOGIN: _g.Player=JSON.parse(msg.data)wx.getUserInfo({success(res){_g.Player.nickName = res.userInfo.nickName_g.Player.avatarUrl = res.userInfo.avatarUrl}})console.log(_g.Player)break;
名字缺省为@,这是RogueLike的习惯……从ASCII时代开始,这个字符就在RogueLike游戏里面代表玩家。
不过我们这个游戏应该让玩家选择一个中国风的名字才对啊。
角色名字生成
所以,我们的客户端如果发现玩家的名字是@,就应该启动名字选择的界面,以便选一个堂堂正正的中国名字。
考虑到游戏整体氛围的因素,我们不让玩家自己输入名字,而是在服务器端生成几个名字,让玩家来选择。
给GamePlayer
添加一个成员用来储存备选名字,然后在Game
类定义一个MakeNames
来随机生成4个备选名字,并在生成新角色后调用它。这里需要用到通过PlayerID
获取角色对象的方法,新增一个,很简单的。
GamePlayer.cs
……
public string[] NameList = new string[4];//提供四个备选名字
……
Game.cs
……
public JObject GetPlayerJsonWithAccountID(uint AID){GamePlayer player;lock (PlayerPool){player = PlayerPool.Find(x => x.AID == AID);if (player == null){player = new GamePlayer(){AID=AID,PlayerID = (uint)G.RND(10000000, 99999999),CreateTime = DateTime.Now };while (PlayerPool.Exists(x => x.PlayerID == player.PlayerID)){player.PlayerID = (uint)G.RND(10000000, 99999999);}player.Name = "@";PlayerPool.Add(player);MakeName(player.PlayerID);//生成备选名字}}return player.ToJson();}
……
public void MakeName(uint PlayerID){string[] names = new string[4];string[] fname = new string[] {"赵", "钱", "杨", "孙", "李","周", "吴", "郑", "王", "黄","罗", "封", "袁", "崔", "龙","熊", "沈", "马", "蓝", "洪","白","雷","诸葛","穆","冯","鞠","刁","陈","张","蔡","公孙", "司马", "独孤", "上官", "皇甫" };string[] lname = new string[] {"阿大", "二", "三", "四", "剑", "勇", "霸", "飞", "雪", "长丰", "峰", "啸天", "云","十三", "九玄", "擎天", "文", "心", "六郎", "五姑", "玲", "云飞", "嫣然", "贤", "子豪", "易","尚", "诚", "仁", "元虎", "智", "朗", "猛", "可", "明山", "瑞蒲", "吉宏", "志远", "海","峰", "卫贤", "义侠", "云鹤","礼", "瑜", "美", "秋"};for (int i = 0; i < 4; i++){int fid = G.RND(0, fname.Length - 1);int lid = G.RND(0, lname.Length - 1);while (fname[fid] == "" || lname[lid] == ""){fid = G.RND(0, fname.Length - 1);lid = G.RND(0, lname.Length - 1);}names[i] = fname[fid] + lname[lid];fname[fid] = "";lname[lid] = "";}GamePlayer player = GetPlayerByPlayerId(PlayerID);if (player != null && player.PlayerID == PlayerID){names.CopyTo(player.NameList, 0);}}private GamePlayer GetPlayerByPlayerId(uint PlayerID){return PlayerPool.Find(x=>x.PlayerID==PlayerID);}
……
新添加的成员如果要想被客户端收到,记得修改GamePlayer
的ToJson
方法:
public override JObject ToJson(){JObject ClientJSON = base.ToJson();ClientJSON.Add("AID", AID);ClientJSON.Add("PlayerID", PlayerID);ClientJSON.Add("NameList", JArray.FromObject(NameList));return ClientJSON;}
再次调试
好了,用户对象已经生成完毕了,下一步,我们要让用户选择性别和姓名,这就涉及到客户端用户界面的实现了。
截止这一篇的全部代码,请大家去我的GitHub下载:
>>第十一篇代码连接<<
上一篇:C#服务端的微信小游戏——多人在线角色扮演(十)
下一篇:C#服务端的微信小游戏——多人在线角色扮演(十二)
C#服务端的微信小游戏——多人在线角色扮演(十一)相关推荐
- C#服务端的微信小游戏——多人在线角色扮演(六)
C#服务端的微信小游戏--多人在线角色扮演(六) 地图上来了只小狗 优化代码 用内容清单来实现地图的刷新,根据开发需求的细化来优化代码结构. --茂叔 地图上来了只小狗 上一篇里,我们成功让游戏世界有 ...
- C#服务端的微信小游戏——多人在线角色扮演(一)
C#服务端的微信小游戏--多人在线角色扮演(一) 前言 平台选择 前端 后端 开发语言 准备工作 开发目标 软件开发重在思路,其他都可以看文档的-- --茂叔 前言 一个人,从0开始,开发一个打怪练级 ...
- C#服务端的微信小游戏——多人在线角色扮演(十四)
C#服务端的微信小游戏--多人在线角色扮演(十四) 服务器端 客户端 名字不是自己定义的,但人生却可以 --茂叔 为了实现让用户选择角色的姓名和性别,我们需要这样一个界面: 服务器端 要实现这个功能, ...
- 基于控制台的多人在线角色扮演游戏(类似MUD)项目
项目名称:DragonFighter3 项目时间:2014/4/xx 编译环境:VS2008 DragonFighter3 是一款基于windows控制台的多人在线角色扮演游戏,是我在学习网络编程时候 ...
- 3D多人在线角色扮演游戏《木牛流马》概念案(一门课的半期作业)
木牛流马 3D多人在线角色扮演游戏(MMORPG) All work Copyright ©2004 by 杨愚 二○○四年九月 基本概念 玩家通过将各种"机体部件"组装成一架一 ...
- 高性能游戏服务器架构设计,一种高性能大型多人在线角色扮演游戏服务器架构设计.doc...
一种高性能大型多人在线角色扮演游戏服务器架构设计 一种高性能大型多人在线角色扮演游戏服务器架构设计摘要:大型多人在线角色扮演游戏(Massively Multiplayer Online Role P ...
- Silverlight开发MMORPG大型多人在线角色扮演游戏(团队项目)
MMORPG,是英文"Massive Multiplayer Online Role Playing Game"的缩写,意为"大型多人在线角色扮演游戏".是电脑 ...
- 帧同步_微信小游戏接入“熊孩子噩梦”健康系统 帧同步能力上线
3月31日,微信小游戏官方公众号"做个小游戏"发文宣布全新面向未成年人保护的健康系统已经上线,该系统联动"成长守护平台"的功能,可以更好助力家长群体对于未成年人 ...
- 微信小游戏直播在Android端的跨进程渲染推流实践
本文由微信开发团队工程师"virwu"分享. 1.引言 近期,微信小游戏支持了视频号一键开播,将微信升级到最新版本,打开腾讯系小游戏(如跳一跳.欢乐斗地主等),在右上角菜单就可以看 ...
最新文章
- 致青春VS杜蕾斯,用QQ空间电影大数据解读关联性
- 【攻防世界010】re1-100
- windows 检测无键鼠操作时间_HP快速卡简易操作流程
- 解决eclipse 中文乱码问题
- service 层 拼接的html 代码如何直接返回_代码分层的设计之道
- Android官方开发文档Training系列课程中文版:构建第一款安卓应用之工程创建
- Django基础学习笔记:初识MTV模式
- 120 - 算法 - 枚举 周期性跳转 openjudge:4148生理周期
- Qt初学者的一些学习方法、参考资料
- android 自定义listview 多列,android listview的多列模版实例代码
- 解决cuda官网安装包下载速度慢的问题
- MySql 语法(完整版)
- matlab 模型运行速度,用matlab求解超效率DEA模型运行结果的辨认
- 六大危害不容忽视 笔记本外接显示器杂谈
- 个人简历模板,非常漂亮,docx格式,用word可自行修改
- Mysql数据库日期查询
- 电视剧《勇敢的心》观后感
- 北大清华联手开设通用人工智能实验班,「顶级AI科学家」朱松纯领衔
- 一、计算机的基础知识
- 小程序记账项目源码-采用云开发
热门文章
- Group DETR
- Aquatox水环境与水生态模型应用教程
- 订单突破10000+,仅花1小时,APPx独家深入剖析背后的秘密!
- ThunderBoard与EFR32MG初印象-Silabs厦门workshop笔记
- 【双亲委派机制详解】
- JVM垃圾回收机制GC理解
- 荣耀9x会更新鸿蒙吗,荣耀9x会搭载鸿蒙系统吗?荣耀9x搭载鸿蒙系统的时间是什么...
- web前端期末大作业 html+css+javascript化妆品网页设计实例 企业网站制作
- 追女孩子非常火的一片文章
- 邯郸计算机一级 考点,邯郸计算机等级(一级)考试培训-创硕教育