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串,在GameCharacterGamePlayer里面进行了覆盖,添加进新的内容。
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();}

同样的道理,没有对应角色就创建一个。

现在可以为从GameObjectGameCharacter一直到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);}
……

新添加的成员如果要想被客户端收到,记得修改GamePlayerToJson方法:

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#服务端的微信小游戏——多人在线角色扮演(十一)相关推荐

  1. C#服务端的微信小游戏——多人在线角色扮演(六)

    C#服务端的微信小游戏--多人在线角色扮演(六) 地图上来了只小狗 优化代码 用内容清单来实现地图的刷新,根据开发需求的细化来优化代码结构. --茂叔 地图上来了只小狗 上一篇里,我们成功让游戏世界有 ...

  2. C#服务端的微信小游戏——多人在线角色扮演(一)

    C#服务端的微信小游戏--多人在线角色扮演(一) 前言 平台选择 前端 后端 开发语言 准备工作 开发目标 软件开发重在思路,其他都可以看文档的-- --茂叔 前言 一个人,从0开始,开发一个打怪练级 ...

  3. C#服务端的微信小游戏——多人在线角色扮演(十四)

    C#服务端的微信小游戏--多人在线角色扮演(十四) 服务器端 客户端 名字不是自己定义的,但人生却可以 --茂叔 为了实现让用户选择角色的姓名和性别,我们需要这样一个界面: 服务器端 要实现这个功能, ...

  4. 基于控制台的多人在线角色扮演游戏(类似MUD)项目

    项目名称:DragonFighter3 项目时间:2014/4/xx 编译环境:VS2008 DragonFighter3 是一款基于windows控制台的多人在线角色扮演游戏,是我在学习网络编程时候 ...

  5. 3D多人在线角色扮演游戏《木牛流马》概念案(一门课的半期作业)

    木牛流马 3D多人在线角色扮演游戏(MMORPG) All work Copyright ©2004 by  杨愚 二○○四年九月 基本概念 玩家通过将各种"机体部件"组装成一架一 ...

  6. 高性能游戏服务器架构设计,一种高性能大型多人在线角色扮演游戏服务器架构设计.doc...

    一种高性能大型多人在线角色扮演游戏服务器架构设计 一种高性能大型多人在线角色扮演游戏服务器架构设计摘要:大型多人在线角色扮演游戏(Massively Multiplayer Online Role P ...

  7. Silverlight开发MMORPG大型多人在线角色扮演游戏(团队项目)

    MMORPG,是英文"Massive Multiplayer Online Role Playing Game"的缩写,意为"大型多人在线角色扮演游戏".是电脑 ...

  8. 帧同步_微信小游戏接入“熊孩子噩梦”健康系统 帧同步能力上线

    3月31日,微信小游戏官方公众号"做个小游戏"发文宣布全新面向未成年人保护的健康系统已经上线,该系统联动"成长守护平台"的功能,可以更好助力家长群体对于未成年人 ...

  9. 微信小游戏直播在Android端的跨进程渲染推流实践

    本文由微信开发团队工程师"virwu"分享. 1.引言 近期,微信小游戏支持了视频号一键开播,将微信升级到最新版本,打开腾讯系小游戏(如跳一跳.欢乐斗地主等),在右上角菜单就可以看 ...

最新文章

  1. 致青春VS杜蕾斯,用QQ空间电影大数据解读关联性
  2. 【攻防世界010】re1-100
  3. windows 检测无键鼠操作时间_HP快速卡简易操作流程
  4. 解决eclipse 中文乱码问题
  5. service 层 拼接的html 代码如何直接返回_代码分层的设计之道
  6. Android官方开发文档Training系列课程中文版:构建第一款安卓应用之工程创建
  7. Django基础学习笔记:初识MTV模式
  8. 120 - 算法 - 枚举 周期性跳转 openjudge:4148生理周期
  9. Qt初学者的一些学习方法、参考资料
  10. android 自定义listview 多列,android listview的多列模版实例代码
  11. 解决cuda官网安装包下载速度慢的问题
  12. MySql 语法(完整版)
  13. matlab 模型运行速度,用matlab求解超效率DEA模型运行结果的辨认
  14. 六大危害不容忽视 笔记本外接显示器杂谈
  15. 个人简历模板,非常漂亮,docx格式,用word可自行修改
  16. Mysql数据库日期查询
  17. 电视剧《勇敢的心》观后感
  18. 北大清华联手开设通用人工智能实验班,「顶级AI科学家」朱松纯领衔
  19. 一、计算机的基础知识
  20. 小程序记账项目源码-采用云开发

热门文章

  1. Group DETR
  2. Aquatox水环境与水生态模型应用教程
  3. 订单突破10000+,仅花1小时,APPx独家深入剖析背后的秘密!
  4. ThunderBoard与EFR32MG初印象-Silabs厦门workshop笔记
  5. 【双亲委派机制详解】
  6. JVM垃圾回收机制GC理解
  7. 荣耀9x会更新鸿蒙吗,荣耀9x会搭载鸿蒙系统吗?荣耀9x搭载鸿蒙系统的时间是什么...
  8. web前端期末大作业 html+css+javascript化妆品网页设计实例 企业网站制作
  9. 追女孩子非常火的一片文章
  10. 邯郸计算机一级 考点,邯郸计算机等级(一级)考试培训-创硕教育