ET学习笔记之五星麻将2

2023-10-09 00:59
文章标签 学习 笔记 et 麻将 五星

本文主要是介绍ET学习笔记之五星麻将2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

五星麻将2客户端游戏大厅

    • 前言
    • 游戏大厅
      • 大厅通道 LobbyAisle
      • 大厅UI
      • 灯笼摇晃动画
      • 匹配房间
      • 创建房间
      • 加入房间
      • 作者的话

前言

其实越看ET的代码,越觉得自己的知识储备不够,好多地方只能浅尝辄止,这也是半路出家当和尚的无奈。
今天是国庆节,一边看国庆直播,一边写这篇笔记,不禁感叹我天朝之伟大。
泱泱大国,不容小觑。有幸见证这样的旷世直播,真是了不起!
胸中澎湃的浩然正气,似乎无法用文字来描述。
看完直播,对我们的未来也更加期待,虽然我们还需要更加努力,毕竟川普之流还在敌视我们,香港在躁动,台湾还没有收复,脱贫尚未完成……
但是我相信,如果我们的技术足够强大,我们终将Free。
所以为了得到Free,继续努力下去。
老实讲,川普和天朝开战真是愚不可及之事,他的政治生涯恐怕会因此黯然失色。

游戏大厅

上一篇我们已经可以进入游戏大厅界面了,如下图所示:
游戏大厅
我们先来追溯进入游戏大厅的过程,在KCPUseManage发起连接之前,由ET的事件机制调用了Awake方法:

        private KCPStateManage _mStateManage;public void Awake(){Ins = this;_mStateManage= this.GetComponent<KCPStateManage>();}

Awake完成了单例模式的同时,也缓存了KCPStateManage的引用,稍后我们会进入该类。在上一篇的LoginAndConnect登录连接过程中,这个被缓存的引用完成了赋值操作:

 Action<G2C_GateLogin> connectSuccesAction = _mStateManage.ConnectSuccess;//连接成功

该事件在LoginAndConnect最后,登录成功返回确切消息后又被调用:

                //发起连接成功事件connectSuccesAction(g2CLoginGate);

这行代码实际上调用了KCPStateManage的ConnectSuccess方法:

        //连接成功public void ConnectSuccess(G2C_GateLogin g2CGateLogin){Log.Debug("连接成功");pKCPNetWorkState = KCPNetWorkState.Connect;pConnectSuccessCall?.Invoke(g2CGateLogin);}

ConnectSuccess方法中有个?号,其实是个空值判定的高级写法,等价于:

if(pConnectSuccessCall!=null)pConnectSuccessCall.Invoke(g2CGateLogin);

而该事件早就被订阅了,可以追溯到KCPUseManage被添加的时候,追溯到Init中Game.Scene.AddComponent<KCPUseManage>();//KCP使用组件,因为AddComponent而触发ET的AwakeSystem,通过KCPUseManage的Awake又self.AddComponent<KCPLocalizationDispose>();,又触发KCPLocalizationDispose的Awake,一系列ET事件机制的连锁反应。
蝴蝶的翅膀轻轻扇动,就在大洋彼岸掀起了龙卷风。
Anyway,通过事件机制pConnectSuccessCall在KCPLocalizationDispose中被订阅了:

        public void Awake(){KCPStateManage.Ins.pConnectLostCall += ConnectLostEvent;KCPStateManage.Ins.pAgainConnectFailureCall += AgainConnectFailureEvent;KCPStateManage.Ins.pStartConnectCall += StartConnectEvent;KCPStateManage.Ins.pStartReconnectionCall += StartReconnectionEvent;KCPStateManage.Ins.pConnectFailureCall += ConnectFailureEvent;KCPStateManage.Ins.pConnectSuccessCall += ConnectSuccessEvent;KCPStateManage.Ins.pAgainConnectSuccessCall += AgainConnectSuccessEvent;}

实际上订阅了一大堆KCPStateManage的状态事件,只要对应的事件触发,这里对应的方法就会调用:

        //连接成功private void ConnectSuccessEvent(G2C_GateLogin g2CGateLogin){UIComponent.GetUiView<LoadingIconPanelComponent>().Hide();User user = g2CGateLogin.User;Game.Scene.GetComponent<UserComponent>().SetSelfUser(user); ;Game.Scene.GetComponent<ToyGameComponent>().StartGame(ToyGameId.Lobby);SessionComponent.Instance.Session.AddComponent<HeartbeatComponent>();//添加心跳组件 }

连接成功后,先隐藏了负责显示加载的UI面板LoadingIconPanel,然后获取用户User信息并进行设置。
接着通过StartGame方法进入大厅的通道,同时开始心跳。

大厅通道 LobbyAisle

之前已经讲过,五星麻将都是通过通道来切换场景的,可以在下图的位置找到相关代码:
通道
在执行StartGame(ToyGameId.Lobby);时,最终调用的就是LobbyAisle的StartGame方法:

        public override void StartGame(params object[] objs){base.StartGame();Log.Debug("进入大厅");UIComponent.GetUiView<FiveStarLobbyPanelComponent>().Show();}

至此进入大厅的整个流程已经追溯完了。

大厅UI

加载UI以后,首先是要缓存引用:

            ReferenceCollector rc = this.GetParent<UI>().GameObject.GetComponent<ReferenceCollector>();mMuChuangViewGo = rc.Get<GameObject>("MuChuangViewGo");mRecordPerformanceBtn = rc.Get<GameObject>("RecordPerformanceBtn").GetComponent<Button>();mRightBtnViewGo = rc.Get<GameObject>("RightBtnViewGo");mUserInfoViewGo = rc.Get<GameObject>("UserInfoViewGo");mTopBtnViewGo = rc.Get<GameObject>("TopBtnViewGo");mBroadcastViewGo = rc.Get<GameObject>("BroadcastViewGo");mLobbyBgClip = rc.Get<AudioClip>("lobbybgMusic");InitPanel();

后面就是一些UI初始化的操作,比较基础的知识点,所以我就不啰嗦了。
其中SdkCall是微信开放平台对应的接口,调用一些社交方面的功能,例如用户信息、定位、朋友圈等。

灯笼摇晃动画

其实很多2D游戏的UI都是带动画效果的,这样显得整个界面很有生机,五星麻将大厅的灯笼就有随风飘动的效果,这个其实是很简单的动画,我们甚至可以放一个风车在里面转动。

public class LanternAnim{private GameObject _AigletGo;public GameObject gameObject;public LanternAnim(GameObject go){gameObject = go;_AigletGo = go.FindChild("AigletGo").gameObject;PlayAnim();}public const float LanternRange = 3.00f;//灯笼的摇晃幅度public const float AigletRange = 18.00f;//吊坠的摇晃幅度private Vector3 _LanternVector = new Vector3(0, 0, 0);private Vector3 _AigletVector = new Vector3(0, 0, 0);private static int RangePlus = 1;private bool isAnimIn;public async void PlayAnim(){if (isAnimIn){return;}isAnimIn = true;while (gameObject.activeInHierarchy){_LanternVector.z = (float)RandomTool.Random(LanternRange/2, LanternRange) * RangePlus;_AigletVector.z = (float)RandomTool.Random(AigletRange/2, AigletRange) * RangePlus;gameObject.transform.DOLocalRotate(_LanternVector, 3f);_AigletGo.transform.DOLocalRotate(_AigletVector, 3f);RangePlus = RangePlus * -1;await ETModel.Game.Scene.GetComponent<TimerComponent>().WaitAsync(2000);}isAnimIn = false;}}

这个很简单,用一个协程来调用DOLocalRotate,这是属于DOTween插件的transform扩展方法。
我们的游戏如果有在UI上挂灯笼,也完全可以用得上这段代码。

匹配房间

当点击大厅灯笼上的匹配房间按钮时,对应的UI事件就触发了:

        public void MatchBtnEvent(){UIComponent.GetUiView<MatchingRoomPanelComponent>().Show();}

这时就弹出了匹配房间的面板,如图所示:
匹配房间面板
这里的初级场、中级场、高级场是根据配置生成的,这里同样使用了协程:

        private async void InitRoomList(){if (_MatchRoomConfigs==null){await RequestMatchRoomConfigs();}Transform roomItemParent = mRoomItemGo.transform.parent;_RoomLists=roomItemParent.CreatorChildAndAddItem<MathRoomItem, MatchRoomConfig>(_MatchRoomConfigs);}

如果匹配房间配置没有,就会请求服务器:

        //想服务器请求 所有匹配房间配置private RepeatedField<MatchRoomConfig> _MatchRoomConfigs;private async Task RequestMatchRoomConfigs(){L2C_GetMatchRoomConfigs l2CGetMatchRoomConfigs = (L2C_GetMatchRoomConfigs)await SessionComponent.Instance.Call(new C2L_GetMatchRoomConfigs() { ToyGameId = ToyGameId.CardFiveStar });_MatchRoomConfigs = l2CGetMatchRoomConfigs.MatchRoomConfigs;}

RepeatedField相当于是List列表,从服务器得到这些配置列表后,就可以创建对应的按钮了。

        public void EnterRoom(){CardFiveStarAisle.MatchingEnterRoom(mData.MatchRoomId,mData.RoomConfigs);}

点击对应的按钮就会进入对应MatchRoomId的房间,也就是上面的EnterRoom方法,该方法是和按钮事件绑定的,这属于是基本操作了。下面开始进入到房间,房间的玩法逻辑已经不再大厅范畴,请看后文。

创建房间

点击创建房间那个灯笼,就触发了下面的方法:

        public void CreateRoomBtnEvent(){UIComponent.GetUiView<CreateRoomPanelComponent>().ShowCraterRoomPanel(ShowCraterRoomPanelType.NormalCraterRoom, CardFiveStarAisle.CreateRoom);}

弹出对应的窗口,如下图所示:
创建房间

加入房间

加入房间同上,都是些UI按钮事件,逻辑简单,这里就不赘述了。如果这方面有疑惑,应该学习下对应的教程。当然,大厅的功能是比较全面的,全部写下来会很啰嗦,那样的话可以录制视频教程了。
所以,在这里就此打住好了,已经起到抛砖引玉的效果了,看看源代码都可以顺藤摸瓜了。
之前有做过麻将游戏的开发,所以游戏逻辑对于我来说,都十分熟悉了。不太熟悉的只是ET框架而已,所以五星麻将就写到这一篇作为结束篇,如果大家想学习麻将的逻辑,请评论点赞。
设置一个Flag在这里好了,评论或点赞数超过100的话,我就把五星麻将完整的麻将逻辑梳理出来。
麻将游戏对于我个人来说,完全是得心应手的事情,这是我不愿意写下去的原因,成长收益不高。但是大家想学习这方面的知识的话,我也是个助人为乐的人,所以根据大家的意愿来吧。
时间是宝贵的,祝大家国庆节快乐,愿祖国繁荣昌盛,早日实现中华民族的伟大复兴!
我们这些程序猿也要继续努力啊!

作者的话

Alt

如果喜欢可以点赞支持一下,谢谢鼓励!如果有什么疑问可以给我留言,有错漏的地方请批评指证!
技术难题?加入开发者联盟:566189328(QQ付费群)提供有限技术探讨,以及,心灵鸡汤Orz!
当然,不需要技术探讨也欢迎加入进来,在这里劈柴、遛狗、聊天、撸猫!( ̄┰ ̄*)

这篇关于ET学习笔记之五星麻将2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/169218

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件