小记——关于Tilemap图块索引编码
图集

地图

TileMap 导出的 .Tmx 文件记录了地图所有信息,其中编辑好的图块信息会存放在每个图层的 Data 节点下。以下是一个 10x10 的图层,可以看到,Data 节点记录了每个图块对应到图集的索引,索引从 1 开始递增,一切都很好理解。
<layer id="1" name="块层 1" width="10" height="10">
<data encoding="csv">
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1
</data>
</layer>
但是,TileMap 的图块是可以由 垂直翻转,水平翻转,旋转90度,旋转180度,旋转270度 这些操作组合运算,这些信息也会存储到对应的图块信息里,也就是 Data 节点中。下面是对 索引1 进行全部可能的运算后得到的数据,总共16条,为便于查看以二进制显示,可以很容易发现,数据采用了 32bit 整数存储,索引不变的情况下,只有 前3bit 发生了变化,可见 前3bit 用于记录运算信息,其余位(也就是剩下的29bit)用于存储索引。
00000000000000000000000000000001 0
01100000000000000000000000000001 逆时针90
11000000000000000000000000000001 逆时针180
10100000000000000000000000000001 逆时针270
10000000000000000000000000000001 垂直翻转
00100000000000000000000000000001 垂直翻转+逆时针90
01000000000000000000000000000001 垂直翻转+逆时针180
11100000000000000000000000000001 垂直翻转+逆时针270
01000000000000000000000000000001 水平翻转
11100000000000000000000000000001 水平翻转+逆时针90
10000000000000000000000000000001 水平翻转+逆时针180
00100000000000000000000000000001 水平翻转+逆时针270
10100000000000000000000000000001 垂直翻转+水平翻转+逆时针90
00000000000000000000000000000001 垂直翻转+水平翻转+逆时针180
01100000000000000000000000000001 垂直翻转+水平翻转+逆时针270
11000000000000000000000000000001 垂直翻转+水平翻转
接下来就是分析 前3bit 的生成规则。首先,3bit 仅能存下8个不同数字:000,001,010,011,100,101,110,111。也就是说,按这个格式,只能存下8种运算组合。
再仔细看上面列表,其实每一条运算都会有一条重复的,把重复的运算剔除掉,就刚好只剩下8种组合。
00000000000000000000000000000001 0
00000000000000000000000000000001 垂直翻转+水平翻转+逆时针180
01100000000000000000000000000001 逆时针90
01100000000000000000000000000001 垂直翻转+水平翻转+逆时针270
11000000000000000000000000000001 逆时针180
11000000000000000000000000000001 垂直翻转+水平翻转
10100000000000000000000000000001 逆时针270
10100000000000000000000000000001 垂直翻转+水平翻转+逆时针90
10000000000000000000000000000001 垂直翻转
10000000000000000000000000000001 水平翻转+逆时针180
00100000000000000000000000000001 垂直翻转+逆时针90
00100000000000000000000000000001 水平翻转+逆时针270
01000000000000000000000000000001 垂直翻转+逆时针180
01000000000000000000000000000001 水平翻转
11100000000000000000000000000001 垂直翻转+逆时针270
11100000000000000000000000000001 水平翻转+逆时针90
// 剔除重复运算之后
00000000000000000000000000000001 0
00100000000000000000000000000001 垂直翻转+逆时针90
01000000000000000000000000000001 水平翻转
01100000000000000000000000000001 逆时针90
10000000000000000000000000000001 垂直翻转
10100000000000000000000000000001 垂直翻转+水平翻转+逆时针90
11000000000000000000000000000001 垂直翻转+水平翻转
11100000000000000000000000000001 水平翻转+逆时针90
推测方式比较原始,好在数据并不太多,比较容易推测出来。
在这之前,有想到过一些运算是重复的,却没想到可以紧凑到只要 3bit 就可以塞下这所有的运算组合。
小记——关于Tilemap图块索引编码的更多相关文章
- 揭示同步块索引(上):从lock开始
转自:http://www.cnblogs.com/yuyijq/archive/2009/03/13/1410071.html 大家都知道引用类型对象除实例字段的开销外,还有两个字段的开销:类型指针 ...
- Windows phone 8 学习笔记(5) 图块与通知(转)
基于metro风格的Windows phone 8 应用提到了图块的概念,它就是指启动菜单中的快速启动图标.一般一个应用必须有一个默认图块,还可以有若干个次要图块.另外,通知与图块的关系比较密切,我们 ...
- C#实现在CAD图纸中插入另一个DWG图块的代码
C#实现在CAD图纸中插入另一个DWG图块的代码 PromptPointResult ppr = ed.GetPoint("请选择插入点:"); Point3d pt = ppr. ...
- Windows phone 8 学习笔记(5) 图块与通知
原文:Windows phone 8 学习笔记(5) 图块与通知 基于metro风格的Windows phone 8 应用提到了图块的概念,它就是指启动菜单中的快速启动图标.一般一个应用必须有一个默认 ...
- Tiled Editor 图块的两种导入方式
一.图块集图块的导入. 打开或者创建地图后,新建 新图块. 弹出新图块面板 图块类型选择 "基于图块集图块",一定要选择"嵌入地图",否则需要另存为其他类型的文 ...
- C# CLR via 对象内存中堆的存储【类型对象指针、同步块索引】
最近在看书,看到了对象在内存中的存储方式. 讲到了对象存储在内存堆中,分配的空间除了类型对象的成员所需的内存量,还有额外的成员(类型对象指针. 同步块索引 ),看到这个我就有点不懂了,不知道类型对象指 ...
- [C#学习笔记]类型对象指针和同步块索引
写在前面 看<CLR via C#>第四章时,看到了类型对象指针和同步块索引这两个概念,不知如何解释,查看过相关资料之后,在此记录. 类型对象指针 <CLR via C#>中的 ...
- 揭示同步块索引(中):如何获得对象的HashCode
转自:http://www.cnblogs.com/yuyijq/archive/2009/08/13/1545617.html 题外话:为了尝鲜,也兴冲冲的安装了Win7,不过兴奋之余却郁闷不已,由 ...
- 梦想CAD控件图块COM接口知识点
梦想CAD控件图块COM接口知识点 图块是将多个实体组合成一个整体,并给这个整体命名保存,在以后的图形编辑中图块就被视为一个实体.一个图块包括可见的实体如线.圆.圆弧以及可见或不可见的属性数据.图块的 ...
随机推荐
- pandas知识点(数据结构)
1.Series 生成一维数组,左边索引,右边值: In [3]: obj = Series([1,2,3,4,5]) In [4]: obj Out[4]: 0 1 1 2 2 3 3 4 4 5 ...
- Python9-IO模型-day41
# 进程:启动多个进程,进程之间是由操作系统负责调用# 线程:启动多个线程,真正由被cpu执行的最小单位实际是线程# 开启一个线程,创建一个线程,寄存器.堆栈# 关闭一个线程# 协程# 本质上是一个线 ...
- Oracle redo与undo 第二弹
首先看一下undo与redo的字面意思: undo:撤销,也就是取消之前的操作. redo:重做,重新执行一遍之前的操作. 什么是REDO REDO记录transaction logs,分为o ...
- JAVA运行环境配置
win10下,右击我的电脑-->高级系统设置-->高级-->环境变量-->系统变量 1新建 变量名 JAVA_HOME 变量值 C:\Program Files\Jav ...
- Linux安全层详解
1 bastion(安全堡垒系统)通常配置两个服务: 1 服务定义系统的功能: 2 服务支持远程访问: 原则: 1 不需要某个软件卸载掉: 2 需要某个软件但不使用就不要激活: 为各个bastion系 ...
- Scrapy框架中选择器的用法【转】
Python爬虫从入门到放弃(十四)之 Scrapy框架中选择器的用法 请给作者点赞 --> 原文链接 Scrapy提取数据有自己的一套机制,被称作选择器(selectors),通过特定的Xpa ...
- OpenCV学习笔记(二) cv::Mat
部分内容转自:OpenCV Tuturial,ggicci 在OpenCV Tuturial中可查看Mat的初始化与打印方法. Mat本质上是由两个数据部分组成的类: 矩阵头(包含矩阵尺寸,存储方法, ...
- Group Policy Object Editor
Group Policy Object Editor The Group Policy Object Editor is a tool that hosts MMC extension snap- ...
- nsfwjs鉴黄识别最小化案例
3个月前,也就是2月份左右吧,Github上出现一个开源项目: Infinite Red, Inc.工作室宣布开源旗下基于tensorflow的tfjs的鉴黄小工具 据说是从15000张图片中 进行机 ...
- MFC定时关机程序的实现1
写个定时关机程序自用,界面简单实用,最终界面如下 第一步,新建一个MFC对话框应用程序,拖几个控件过来, 界面如下: 然后给下拉列表框,复选按钮绑定变量,以方便进行操作. CComboBox m_co ...