小记——关于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接口知识点 图块是将多个实体组合成一个整体,并给这个整体命名保存,在以后的图形编辑中图块就被视为一个实体.一个图块包括可见的实体如线.圆.圆弧以及可见或不可见的属性数据.图块的 ...
随机推荐
- JS进阶篇--JS数组reduce()方法详解及高级技巧
基本概念 reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值. reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被 ...
- Laravel — homestead 配置多站点
一.homestead.yaml 配置 homestead.yaml 文件配置sites,如下 sites: - map: homestead.test to: /home/vagrant/Code/ ...
- 16.VUE学习之-v-show的使用与v-if的差异对比
v-show的使用与v-if的差异对比 相同点: 都可以达到隐藏和显示的效果. 不同点: v-show 会用display:none 来隐藏元素节点,推荐使用这种方式 v-if 会移除节点,可以配合v ...
- 学习Pytbon第三天,用户输入
_username ='dream' #定义用户名 _password ='dream123'#定义用户密码username = input("username:")#请输入用户名 ...
- 二分答案:Poweroj2461-入门基础之二分答案(二分法的应用)
传送门:点击打开链接 入门基础之二分答案 Time Limit: 1000 MS Memory Limit: 65536 KBTotal Submit: 179 Accepted: 33 Page V ...
- java十分钟速懂知识点——System类
上次面试中遇到的一个问题,问到System.out.println()中的out是不是内部类,当时就给问蒙了,直观感觉out应该是System类的一个属性,跟内部类有什么关系?而且之前整理IO部分的时 ...
- 1180: [CROATIAN2009]OTOCI(LCT)
1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 1200 Solved: 747[Submit][ ...
- IOS笔记044-通知和代理(观察者模式和代理模式)
处理文本输入框的输入事件,单击文本输入框后要弹出键盘. 弹出键盘有两种实现方式:一种代理,一种通知.也就是对应的(观察者模式和代理模式). 1.通知 1.1.准备工作 每一个应用程序都有一个通 ...
- [转]jQuery DOM Ready
一直以来,各种JS最佳实践都会告诉我们,将JS放在HTML的最后,即</body>之前,理由就是:JS会阻塞下载,而且,在JS中很有可能有对DOM的操作,放在HTML的最后,可以尽可能的保 ...
- shell执行mysql的脚本(包括mysql执行shell脚本)
在Shell中执行mysql的脚本,这里介绍比较容易使用的一种方法 首先写好sql的脚本,后缀为.sql,比如 sql_file.sql:内容如下 #这是SQL的脚本create table if n ...