图集

地图

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)用于存储索引。

000000000000000000000000‭00000001‬          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种组合。

000000000000000000000000‭00000001‬          0
000000000000000000000000‭00000001‬ 垂直翻转+水平翻转+逆时针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 // 剔除重复运算之后
000000000000000000000000‭00000001‬ 0
‭00100000000000000000000000000001‬ 垂直翻转+逆时针90
‭01000000000000000000000000000001‬ 水平翻转
01100000000000000000000000000001 逆时针90
‭10000000000000000000000000000001‬ 垂直翻转
‭10100000000000000000000000000001‬ 垂直翻转+水平翻转+逆时针90
‭11000000000000000000000000000001‬ 垂直翻转+水平翻转
‭11100000000000000000000000000001‬ 水平翻转+逆时针90

推测方式比较原始,好在数据并不太多,比较容易推测出来。

在这之前,有想到过一些运算是重复的,却没想到可以紧凑到只要 3bit 就可以塞下这所有的运算组合。

小记——关于Tilemap图块索引编码的更多相关文章

  1. 揭示同步块索引(上):从lock开始

    转自:http://www.cnblogs.com/yuyijq/archive/2009/03/13/1410071.html 大家都知道引用类型对象除实例字段的开销外,还有两个字段的开销:类型指针 ...

  2. Windows phone 8 学习笔记(5) 图块与通知(转)

    基于metro风格的Windows phone 8 应用提到了图块的概念,它就是指启动菜单中的快速启动图标.一般一个应用必须有一个默认图块,还可以有若干个次要图块.另外,通知与图块的关系比较密切,我们 ...

  3. C#实现在CAD图纸中插入另一个DWG图块的代码

    C#实现在CAD图纸中插入另一个DWG图块的代码 PromptPointResult ppr = ed.GetPoint("请选择插入点:"); Point3d pt = ppr. ...

  4. Windows phone 8 学习笔记(5) 图块与通知

    原文:Windows phone 8 学习笔记(5) 图块与通知 基于metro风格的Windows phone 8 应用提到了图块的概念,它就是指启动菜单中的快速启动图标.一般一个应用必须有一个默认 ...

  5. Tiled Editor 图块的两种导入方式

    一.图块集图块的导入. 打开或者创建地图后,新建 新图块. 弹出新图块面板 图块类型选择 "基于图块集图块",一定要选择"嵌入地图",否则需要另存为其他类型的文 ...

  6. C# CLR via 对象内存中堆的存储【类型对象指针、同步块索引】

    最近在看书,看到了对象在内存中的存储方式. 讲到了对象存储在内存堆中,分配的空间除了类型对象的成员所需的内存量,还有额外的成员(类型对象指针. 同步块索引 ),看到这个我就有点不懂了,不知道类型对象指 ...

  7. [C#学习笔记]类型对象指针和同步块索引

    写在前面 看<CLR via C#>第四章时,看到了类型对象指针和同步块索引这两个概念,不知如何解释,查看过相关资料之后,在此记录. 类型对象指针 <CLR via C#>中的 ...

  8. 揭示同步块索引(中):如何获得对象的HashCode

    转自:http://www.cnblogs.com/yuyijq/archive/2009/08/13/1545617.html 题外话:为了尝鲜,也兴冲冲的安装了Win7,不过兴奋之余却郁闷不已,由 ...

  9. 梦想CAD控件图块COM接口知识点

    梦想CAD控件图块COM接口知识点 图块是将多个实体组合成一个整体,并给这个整体命名保存,在以后的图形编辑中图块就被视为一个实体.一个图块包括可见的实体如线.圆.圆弧以及可见或不可见的属性数据.图块的 ...

随机推荐

  1. 【函数应用】PHP中关于URL的函数处理

    一,函数介绍 1.解析HTTP头信息:get_header() array get_headers ( string 目标URL [, int $format = 0 [如果将可选的 format 参 ...

  2. kubectl alias auto complete

    平时kubectl命令管理kubernetes,敲久了就觉得比较麻烦,想着使用alias k来代替kubectl,可是当输入k时没有了自动补全的功能 这里在 ~/.bashrc 添加如下配置后,可以自 ...

  3. mybatis特殊字符处理

    在mybatis 的mapper.xml文件中特殊字符处理方式  仅供参考 出处:http://yaobenzhang.blog.163.com/blog/static/214395113201561 ...

  4. datagrid的增加功能的实现

    一.增加 1.行编辑状态所需的条件 (1)在columns中添加editor,注意type的设置 (2)调用beginEdit方法,开启行编辑 添加到第一行: 添加到最后一行: (2)如果有一行开启了 ...

  5. loj2090 「ZJOI2016」旅行者

    分治+最短路,很套路的 #include <algorithm> #include <iostream> #include <cstring> #include & ...

  6. Marketing learning-1

    Today we start to learn something about marketing together.Sometimes i just propose a question,and i ...

  7. adb命令模拟按键事件

    //这条命令相当于按了设备的Backkey键 adb shell input keyevent 4 //可以解锁屏幕 adb shell input keyevent  82 //在屏幕上做划屏操作, ...

  8. HTML textarea 无法修改 value 的问题

    当设置了  textarea  的 value 后,发现页面的输入框无法输入值, <textarea id="></textarea> 解决方法: 只需将值设置在  ...

  9. 目前问题:plupload上传带参数到后台

    目前问题:plupload上传带参数到后台,迟迟没有解决!!! 昨晚到23点多终于完成了! 直接上代码! var uploader = new plupload.Uploader({ //实例化一个p ...

  10. java中json依赖包

    Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException 上面的是do ...