当前位置: 首页 > news >正文

【游戏客户端】大话slg玩法架构(二)背景地图

 【游戏客户端】大话slg玩法架构(二)背景地图

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

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

 (一)架构总览

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

      上一篇文章我们分享了滚动基类的实现:【游戏客户端】大话slg玩法架构(一)滚动基类 ,现在我们接着分享背景地图的实现逻辑

(二)背景地图的实现

(1)大地图资源的输出方式

      通过上一篇文章我们知道,我们需要一张大图来铺满滚动容器的InnerContainer来实现背景地图的效果。那这个时候怎么输出这个资源成了一个需要考量的地方

      直接输出一个10000 * 10000的png吗?那加载的时候不得卡鼠。所以必须要采取分块的方式,比如你可以把一块地图的大小设置成1000 * 1000,那么我们就把一张大地图分成了100张小地图

      第二个问题就是,那这个原始的10000*10000分块前的资源要怎么输出,如果单靠美术同学去画一张完整的图工作量是很大的,这个时候我们就可以采取代码重复拼接的方式,比如美术只输出2000 * 2000 (4块资源)组成的地图,我们在代码里每隔2000像素就重复利用一次资源

function getBgRes(Idx, Idy)local ResTbl = {[1] = {[1] = 资源1, [2] = 资源2},[2] = {[1] = 资源3, [2] = 资源4},       }local ResX = Idx % 2 + 1local ResY = Idy % 2 + 1return ResTbl[ResX][ResY]
end

    只要处理好资源拼接时候的缝隙,那么我们一方面可以降低大地图的实现成本,另一方面可以减少资源的读取,降低资源缓存

(2)地图块的控件复用

      有了地图的生成方式,后面只需要像摆积木一样一块块摆在滚动容器上就可以了。那么不知道面对这100个地图块,大家会选择怎么创建呢?

      如果直接一个for循环,那么一进游戏就卡成ppt了。有经验的同学可能会采取异步加载的方式分帧去创建,这样确实可以,但是100个地图块生成完之后,光这些地图就已经占据了几百M内存(苹果2G内存瑟瑟发抖)

      而且,哪怕是采取了异步创建的方法,在创建的流程中也是感受到明显卡顿的。其实玩家能看到的无非就是屏幕上那几块地图,哪怕玩家快速的上下左右滑动,我们也只需要多生成一屏的地图就可以了,这样不过十来块的数量。因此我们不需要把100个地图全生成,只需要生成十来个实际用到的,然后监听玩家的滑动,更新当前所视范围地图的纹理并重设它们的位置就可以了

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

 

(3)更新地图块的时机

      那什么时候执行这段地图更新代码呢?一开始我是直接每一帧都做一个判断,后来发现这样很多余而且比较耗CPU,其实我们需要监听玩家的滑动操作,滑动距离超过一个地图块的长/高的时候再执行就可以了

	self.SV.OnScrolling  = function()local CurPos = 获取当前位置if not self.SV.LastPosX or not  self.SV.LastPosY thenself.SV.LastPosX = CurPos.Idxself.SV.LastPosY = CurPos.Idyendif 超过滑动距离 thenself.SV.LastPosX = CurPos.Idxself.SV.LastPosY = CurPos.Idy执行更新地图的方法endend

 

      好啦~~地图块的生成介绍大概就到这里,下一篇文章会介绍这个建筑控件的实现

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

相关文章:

【游戏客户端】大话slg玩法架构(二)背景地图

【游戏客户端】大话slg玩法架构(二)背景地图 大家好,我是Lampard家杰~~ 今天我们继续给大家分享SLG玩法的实现架构,关于SLG玩法的介绍可以参考这篇上一篇文章:【游戏客户端】制作率土之滨Like玩法 PS:和之前…...

git-工作场景

1. 远程分支为准 强制切换到远程分支并忽略本地未提交的修改 git fetch origin # 获取最新的远程分支信息 git reset --hard origin/feature_server_env_debug_20240604 # 强制切换到远程分支,并忽略本地修改 2. 切换分支 1. **查看所有分支:**…...

coco dataset标签数据结构(json文件)

COCO数据集现在有3种标注类型:object instances(目标实例), object keypoints(目标上的关键点), 和image captions(看图说话),使用json文件存储。 NameImagesLabelstrain linkhttp:…...

GaussDB关键技术原理:高性能(四)

GaussDB关键技术原理:高性能(三)从查询重写RBO、物理优化CBO、分布式优化器、布式执行框架、轻量全局事务管理GTM-lite等五方面对高性能关键技术进行了解读,本篇将从USTORE存储引擎、计划缓存计划技术、数据分区与分区剪枝、列式存…...

总结之企业微信(一)——创建外部群二维码,用户扫码入群

创建外部群 企微接口中没有直接通过服务端API接口创建外部群 可以通过jssdk创建外部群:引用jssdk调用会话接口wx.openEnterpriseChat https://work.weixin.qq.com/api/doc/90000/90136/90511 创建外部群二维码 需要通过企业微信的应用,并且配置客户联…...

透视数据治理:企业如何衡量数据治理的效果?

在企业运营中,各个业务部门的成功与否都是直观且易于量化的,像销售部门卖了多少产品又为企业带来多少盈利,这些都能用具体的数字来说话。但当谈到数据治理的成效时,许多企业与决策者却感到迷茫。 数据治理的重要性不言而喻&#…...

ERC20查询操作--获取ERC20 Token的余额

获取ERC20 Token的余额 https://blog.csdn.net/wypeng2010/article/details/81362562 通过REST查询 curl -X POST --data-binary {"jsonrpc":"2.0","method":"eth_call","params":[{"from": "0x954d1a58c7a…...

Linux运维:MySQL中间件代理服务器,mycat读写分离应用实验

Mycat适用的场景很丰富,以下是几个典型的应用场景: 1.单纯的读写分离,此时配置最为简单,支持读写分离,主从切换 2.分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片 3.多租户应…...

css文字自适应宽度动态出现省略号...

前言 在列表排行榜中通常会出现的一个需求:从左到右依次是名次、头像、昵称、徽标、分数。徽标可能会有多个或者没有徽标,徽标长度是动态的,昵称如果过长要随着有无徽标进行动态截断出现省略号。如下图布局所示(花里胡哨的底色是…...

边缘计算盒子_B100_Jetson Nano (aarch64)开发环境搭建

目录 一、刷机步骤1、搭建刷机环境2、进入刷机模式3、开始刷机 二、系统迁移到TF卡 或者 U盘1、迁移脚本2、提前插入U盘或者TF卡3、 开始迁移 三、搭建miniconda 环境1、下载安装 四、jetpack开发套件环境1、版本查看2、apt 更换国内源3、安装Jetson-stats管理工具 一、刷机步骤…...

【Superset】dashboard 自定义URL

URL设置 在发布仪表盘(dashboard)后,可以通过修改看板属性中的SLUG等,生成url 举例: http://localhost:8090/superset/dashboard/test/ 参数设置 以下 URL 参数可用于修改仪表板的呈现方式:此处参考了官…...

【Linux网络】IP协议{初识/报头/分片/网段划分/子网掩码/私网公网IP/认识网络世界/路由表}

文章目录 1.入门了解2.认识报头3.认识网段4.路由跳转相关指令路由 该文诸多理解参考文章:好文! 1.入门了解 用户需求:将我的数据可靠的跨网络从A主机送到B主机 传输层TCP:由各种方法(流量控制/超时重传/滑动窗口/拥塞…...

香蕉派BPI-Wifi6迷你路由器公开发售

Banana Pi BPI-Wifi6 Mini 公开发售。 Banana Pi BPI-Wifi6 Mini 开源路由器采用Triductor TR6560 TR5220 wifi SOC设计,是一款迷你尺寸的wifi6路由器解决方案。内置高性能双核ARM Cortec A9处理器用于WIFI报文转发或智能业务处理,内置高性能LSW和硬件N…...

WPF-控件样式设置

1、控件样式设置 1.1、内嵌式为相同控件设置样式 <Window.Resources><Style TargetType"Button"><Setter Property"Background" Value"Yellow"></Setter><Setter Property"Width" Value"60"&g…...

C++20中的指定初始化器(designated initializers)

指定初始化器(designated initializers, 指定初始值设定项)语法如下&#xff1a;C风格指定初始化器语法&#xff0c;初始化数据成员的一种便捷方式 T object { .des1 arg1, .des2 { arg2 } ... }; T object { .des1 arg1, .des2 { arg2 } ... }; 说明&#xff1a; 1.每个指…...

QT跨平台开发(windows、mac)中.pro文件设置

方法一&#xff1a; 在配置前面加上平台标识符的前缀 # windows win32:INCLUDEPATH F:/Dev/ffmpeg-4.3.2/include win32:LIBS -LF:/Dev/ffmpeg-4.3.2/lib \-lavcodec \-lavdevice \-lavfilter \-lavformat \-lavutil \-lpostproc \-lswscale \-lswresample# mac macx:INCLUD…...

wifi中的stream parser

在Wi-Fi系统中&#xff0c;流解析器&#xff08;Stream Parser&#xff09;的主要功能是将传输的数据流&#xff08;bit stream&#xff09;按照物理层&#xff08;PHY&#xff09;和媒体访问控制层&#xff08;MAC&#xff09;协议的要求进行分解和处理。这一步骤对于确保数据…...

GitHub网页打开慢的解决办法

有时候看资料絮叨github网页打不开&#xff0c;经百度后&#xff0c;发下下面的方法有效。 1&#xff09;获取github官网ip 我们首先要获取github官网的ip地址&#xff0c;方法就是打开cmd&#xff0c;然后ping 找到github的地址&#xff1a;20.205.243.166 2&#xff09;配…...

前端vue 实现取色板 的选择

大概就是这样的 一般的web端框架 都有自带的 的 比如 ant-design t-design 等 前端框架 都是带有这个的 如果遇到没有的我们可以自己尝试开发一下 简单 的 肯定比不上人家的 但是能用 能看 说的过去 我直接上代码了 其实这个取色板 就是一个input type 是color 的input …...

[leetcode]partition-list 分隔链表

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:ListNode* partition(ListNode* head, int x) {ListNode *smlDummy new ListNode(0), *bigDummy new ListNode(0);ListNode *sml smlDummy, *big bigDummy;while (head ! nullptr) {if (head->val &l…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...