【游戏客户端】大话slg玩法架构(三)建筑控件

 【游戏客户端】大话slg玩法架构(三)建筑控件

      大家好,我是Lampard家杰~~ 今天我们继续给大家分享SLG玩法的实现架构,关于SLG玩法的介绍可以参考这篇上一篇文章:【游戏客户端】制作率土之滨Like玩法

       PS:和之前一样,本文也只是分享实现思路,并不会贴具体的代码和资源哟

 (一)架构总览

      SLG玩法的实现思路可以划分为四个部分,分别是滚动容器基类的搭建,背景大地图的实现,建筑的生成与刷新,以及玩法优化预加载相关

      上一篇文章我们分享了背景大地图的实现:【游戏客户端】大话slg玩法架构(二)背景地图,现在我们接着分享玩法的重中之重!!!建筑控件的实现逻辑

 (二)建筑控件的实现

(1)控件的结构

      建筑是玩法中的核心逻辑,玩法就呈现在每一个建筑的UI上。因此整理好一个建筑控件的展示结构与层级关系是很有必要的

      比如帮派纷争设计的建筑层级就是:建筑状态底板(我方=蓝色,敌方=红色,中立=白色) < 建筑纹理 < 建筑UI(名字,坐标,头像等) < 交互按钮(如分享,战报)  < 特效表现 (战斗中,免战状态等)

BUILD_PRIORITY = {BG = 1,TEXTURE = 2,UI_NODE = 3,BUTTON = 4EFFECT = 5,
}

      其中建筑UI内容也有需要,它们也需要细分一个显示层级,因此可以先往建筑上挂一个UINode,然后把建筑UI挂在这个节点上再细分即可

(2)控件的生成逻辑

    和大地图一样,首先第一步要知道这个控件生成出来之后要摆放到哪里。帮派纷争是一个77 * 77的小型slg玩法,那么我们将会有77 * 77个建筑位置。     

      每一个位置的建筑我们都可以通过接口计算出它在滚动容器上的坐标

function getPosById(Idx, Idy)-- BG_WIDTH = 大地图宽度-- BG_HEIGHT = 大地图高度-- BG_NUM = 每一行/列的地图块数量local PosX = (BG_WIDTH / 2) * (Idx + Idy - 1)local PosY = (Idy - Idx + BG_NUM) * (BG_HEIGHT / 2)return PosX, PosY
end

       我们可以用一个Table去存生成的建筑对象,如果是1*1的数据(如下图)我们就可以直接赋值BuildMap[2][2] = 生成的建筑对象

        如果是X * X的建筑,我们会把建筑对象记录左下角的坐标,如下图BuildMap[10][13] = 生成的建筑对象。那其余的位置怎么办呢?很简单,我们可以标识一个特殊的建筑类型--阻碍建筑,把其余八个位置标记为阻碍,玩家就不能迁城进攻到这些地方来了

 

(3)控件的数据获取

      这是一个多人的实时同屏的玩法,因此建筑的所有数据(等级,占领状态等)都依赖服务端进行下发

       把所有的数据一条协议下来那肯定是不科学的,我们用不上那么多数据,而且数据量太多协议肯定是顶不住。因此我们可以采取AOI的方式,根据目前所视的地图位置请求一定范围的建筑数据

      比如目前所示的视野中心是(8,14),我们只需要请求以(8,14)为原点,半径为5的建筑数据(当然可以预留一些避免滑动时穿帮)。并且我们可以在滚动的时候设置监听事件,如果滑动距离超过一定阈值,那么我们就再次请求数据

      PS:视野中心需要根据滚动容器InnerContainer当前所在位置进行换算,半径也需要根据不同机型的分辨率进行计算

      此时有一个好奇的朋友就会问了,如果我生成建筑的时候,建筑数据还没回来怎么办呢?

      这个很简单哈,只需要把返回的服务端数据缓存起来!!在数据回来的时候判断一下该位置的建筑生成了没有,如果没生成那么不用管它,它自然会从缓存中读取正确的数据。如果发现已经生成了,那也不要慌,同样先把数据缓存起来,然后执行一下那个建筑对象的update方法让其更新即可~~

(4)控件的刷新逻辑

    和地图块一样我们不会生成所有的建筑。同样采取控件缓冲池的方式,在进游戏前先生成一堆建筑对象,然后根据目前所示的位置,更新建筑对象的信息以及位置摆放。从而使极限的建筑数量从77*77 转化为两三百个

-- 释放
for x = 1, 77 dofor y = 1, 77 dolocal IsInView = 判断一下这一块建筑需不需要显示if not IsInView and self.BuildMap[x][y] thenlocal Build = self.BuildMap[x][y]Build:setFree()self.BuildMap[x][y] = nilendend
end-- 生成
for x = 1, 77 dofor y = 1, 77 dolocal IsInView = 判断一下这一块建筑需不需要显示if IsInView thenif self.BuildMap[x][y] then-- 存在这个建筑就设置可视就行local Build = self.BuildMap[x][y]Build:setVisible(true)else-- 不存在则找一个空闲的建筑控件重设信息local Build = getFreeBuild()self.BuildMap[x][y] = Build Build:resetInfo(x, y)endendend
end

       这里需要注意的是,getFreeBuild的时候,由于玩家可能会疯狂拖动导致建筑对象setFree不及时,那么就可能造成读取不到空闲的建筑对象,因此需要做一个保底处理,如果读不到的时候生成一个新的,然后塞进去缓冲池中即可

      除了玩家的操作导致需要刷新建筑,还有可能其他人进行了操作,服务端需要同步最新的结果来更新显示。此时我们只需要和上文一样,在服务端下发新建筑数据时进行判定,有则更新,无则缓存即可

       好啦~~建筑的生成介绍大概就到这里,下一篇文章会介绍这个玩法的预加载相关

      感谢阅读,记得点赞和关注!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/375764.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM学习(day1)

JVM 运行时数据区 线程共享&#xff1a;方法区、堆 线程独享&#xff08;与个体“同生共死”&#xff09;&#xff1a;虚拟机栈、本地方法栈、程序计数器 程序计数器 作用&#xff1a;记录下次要执行的代码行的行号 特点&#xff1a;为一个没有OOM&#xff08;内存溢出&a…

电压反馈型运算放大器的增益和带宽

简介 本教程旨在考察标定运算放大器的增益和带宽的常用方法。需要指出的是&#xff0c;本讨论适用于电压反馈(VFB)型运算放大器。 开环增益 与理想的运算放大器不同&#xff0c;实际的运算放大器增益是有限的。开环直流增益(通常表示为AVOL)指放大器在反馈环路未闭合时的增益…

Python爬虫技术从去哪儿网获取旅游数据,对攻略进行可视化分析,提供全面的旅游攻略和个性化的出行建议

背景 随着信息技术的快速发展和互联网的普及&#xff0c;旅游行业也迎来了数字化和智能化的变革。去哪儿网作为中国领先的在线旅游平台之一&#xff0c;提供了丰富的旅游产品和服务&#xff0c;涵盖了机票、酒店、旅游度假等各个方面。用户通过去哪儿网可以方便地查询、预订和…

Mac下flutter运行iOS模拟器

上篇flutter环境安装&#xff08;Macvscode&#xff09;已经将vscode和xcode等开发环境都搭建起来了&#xff0c;vscode新建工程还是比较方便的&#xff0c;那么&#xff0c;建立好了之后&#xff0c;我们怎么看效果呢&#xff1f; 1. vscode新建项目 通过 vscode的命令命板(…

经典电影的高清修复是怎么实现的?

老片修复&#xff0c;主要分两种。精修版和流水线版。精修版比如像《星球大战》那种。基本就是一个专业团队花几年时间&#xff0c;不干别的就盯着这一个项目死磕。细致程度差不多就是一帧一帧进行修复。那对于我们普通人来说&#xff0c;想要修复视频高清&#xff0c;这种精修…

七天.NET 8操作SQLite入门到实战 - 第二天 在 Windows 上配置 SQLite环境

前言 SQLite的一个重要的特性是零配置的、无需服务器&#xff0c;这意味着不需要复杂的安装或管理。它跟微软的Access差不多&#xff0c;只是一个.db格式的文件。但是与Access不同的是&#xff0c;它不需要安装任何软件&#xff0c;非常轻巧。 七天.NET 8操作SQLite入门到实战…

Java常用的API_02(正则表达式、爬虫)

Java正则表达式 七、正则表达式7.1 格式7.1.1 字符类注意字符类示例代码1例2 7.1.2 预定义字符预定义字符示例代码例2 7.1.3 区别总结 7.2 使用Pattern和Matcher类与直接使用String类的matches方法的区别。&#xff08;1&#xff09; 使用Pattern和Matcher类示例代码 &#xff…

传输层协议之UDP

1、端口号 我们在应用层创建的套接字&#xff0c;是需要通过bind()接口绑定我们的IP地址与端口号的&#xff0c;这是因为数据从传输层向上交付到应用层时&#xff0c;需要用端口号来查找特定的服务进程。一般在网络通信时&#xff0c;用IP地址标识一台主机&#xff0c;用端口号…

el-table 动态添加删除 -- 鼠标移入移出显隐删除图标

<el-table class"list-box" :data"replaceDataList" border><el-table-column label"原始值" prop"original" align"center" ><template slot-scope"scope"><div mouseenter"showClick…

Kubelet 认证

当我们执行kubectl exec -it pod [podName] sh命令时&#xff0c;apiserver会向kubelet发起API请求。也就是说&#xff0c;kubelet会提供HTTP服务&#xff0c;而为了安全&#xff0c;kubelet必须提供HTTPS服务&#xff0c;且还要提供一定的认证与授权机制&#xff0c;防止任何知…

Bertopic环境安装与文本主题聚类

文章目录 1.环境配置(一)安装:anaconda1. 理解:为什么需要anaconda2. 下载anaconda3. 启动anaconda(二)安装:python环境(三)安装:依赖包hdbscan的安装问题解决方案1. 安装build-tools-for-visual-studio2. 安装hdbscan(四)安装transformers、BERTopic等重要依赖包2…

FlinkModule加载HiveModule异常

HiveModule这个模块加载不出来 加在不出来这个模块&#xff0c;网上查说是要加下面这个依赖 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-hive_${scala.binary.version}</artifactId><version>${flink.…

GPIO通用输入输出口

可配置八种输入输出模式&#xff1b; 引脚电平&#xff1a;0~3.3V&#xff0c;部分引脚可容忍5V&#xff1b;&#xff08;可以输入5V&#xff0c;输出最大只能是3.3V&#xff09; 带FT的是可以容忍5V的不带FT的就只能接入3.3V的电压。 输出模式下可以控制端口输出高低电平&am…

【算法】代码随想录之链表(更新中)

文章目录 前言 一、移除链表元素&#xff08;LeetCode--203&#xff09; 前言 跟随代码随想录&#xff0c;学习链表相关的算法题目&#xff0c;记录学习过程中的tips。 一、移除链表元素&#xff08;LeetCode--203&#xff09; 【1】题目描述&#xff1a; 【2】解决思想&am…

自动驾驶中,实现三维点旋转原理

文章目录 1. 三维点旋转的方案2. 使用复数表示二维点的旋转2.1. 复数的概念2.2. 复数的三种形式及相互转换2.3. 复数概念扩展&#xff1a;实数、虚数、复数 3. 四元数旋转三维点原理4. 使用四元数进行旋转的公式5. 旋转叠加6. 四元数转换为三维点7. 代码实现 1. 三维点旋转的方…

13 协程设计原理与汇编实现

协程的问题 为什么要有协程?协程的原语操作?协程的切换?协程的struct如何定义?协程的scheduler(调度)如何定义?调度策略如何实现?协程如何与posix,api兼容?协程多核模式?协程的性能如何测试?为什么要有协程 同步的编程方式,异步的性能。同步编程时,我们需要等待io就…

14-47 剑和诗人21 - 2024年如何打造AI创业公司

​​​​​ 2024 年&#xff0c;随着人工智能继续快速发展并融入几乎所有行业&#xff0c;创建一家人工智能初创公司将带来巨大的机遇。然而&#xff0c;在吸引资金、招聘人才、开发专有技术以及将产品推向市场方面&#xff0c;人工智能初创公司也面临着相当大的挑战。 让我来…

ant design form动态增减表单项Form.List如何进行动态校验规则

项目需求&#xff1a; 在使用ant design form动态增减表单项Form.List时&#xff0c;Form.List中有多组表单项&#xff0c;一组中的最后一个表单项的校验规则是动态的&#xff0c;该组为最后一组时&#xff0c;最后一个表单项是非必填项&#xff0c;其他时候为必填项。假设动态…

SQL,python,knime将数据混合的文字数字拆出来,合并计算实战

将下面将数据混合的文字数字拆出来&#xff0c;合并计算 一、SQL解决&#xff1a; ---创建表插入数据 CREATE TABLE original_data (id INT AUTO_INCREMENT PRIMARY KEY,city VARCHAR(255),value DECIMAL(10, 2) );INSERT INTO original_data (city, value) VALUES (上海0.5…

对照ui图进行大屏幕适配,echerts适配

1.先找到ui图&#xff0c;我这边是1920*1080的屏幕进行的设计 2.在界面找到跟样式的字体大小&#xff0c;进行设置&#xff0c;一般ui设置字体大小便可 3.在js中写入原生js代码 function adapter() {//获取布局视口宽度&#xff0c;布局视口设备横向独立像素值const dpWidth…