`

AS3地图拼接与战争迷雾的实现

 
阅读更多

转:http://bbs.9ria.com/thread-157487-1-1.html

AS3地图拼接与战争迷雾的实现

在开发游戏的过程中,特别是地图编辑器中,需要利用最少的资源,实现最丰富的地形地貌。虽然现在众多的RPG开始使用整图,但是我们偶尔还是需要能够让玩家自己编辑地图,或者其他需要自动进行地图构建的功能。
另外,就是在一些策略类游戏里经常用到的战争迷雾,我试过自己编写Pixel Bender自己来编写过滤器而实现战争迷雾。不过效果不是很理想(速度太慢)。后来想到,可以利用地图拼接的原理来进行战争迷雾的实现。

数学原理

首先,我们先来看一下现成的地图拼接算法。下面是一张《魔兽争霸3》的地表素材。


 

看到了比较清楚的图片边界是吗?我们把这张图按照64X64进行一下切分



 

其实把图摆成这样是有原因的,现在,我们来看4张图:1号,2号,4号以及8号。可以发现,他们刚好是四个角落的素材。如果我们把一张64X64的图,再进行4等分,默认以0来标识,如下:

0   |  0
----------------
0   |  0

再把刚才所提到的4张图,根据编号和位置,填到上面的结构里,如:

1号图(右上角):

0   |  1
----------------
0   |  0


2号图(左上角):

2   |  0
----------------
0   |  0


4号图(右下角):

0   |  0
----------------
0   |  4


8号图(左下角):

0   |  0
----------------
8   |  0


或许你会很奇怪,我们为什么要定义这4个数字,下面,来做一些有趣的事情吧。

我们把4号结构和8号结构按照对应的位置相加,得到了什么?

0   |  0
----------------
8   |  4


此时,4个角落的数字相加,为0+0+4+8 = 12

12,这个数字貌似我们在前面的图中看到过,找找编号看。你会发现,刚好12就是下面连成一气的草地素材。

再做个其他试验?例如把8号和1号结构相加:

0   |  1
----------------
8   |  0


此时,4个角落的数字相加,为0+1+8+0=9

当然,9也刚好就是我们的素材里,右下和左上连成一气的草地素材。

数学原理:以1,2,4,8分别代表一个区块的4个角落的素材编号。当发生叠加时候,将角落里的值进行累加,最后,4个角的合即为地图区块所对应的编号。

程序实现

有了数学原理,下一步就是通过程序去实现他。首先,我们需要根据编号,来保存对应的素材,为了大家看的清楚,我用了比较笨的方法——二维数组,实际上,循环取一次就可以了。

 

// 用一个数组来标记图形中各个位置的编号

var config:Array = [

                                        [0,4,8,12],

                                        [1,5,9,13],

                                        [2,6,10,14],

                                        [3,7,11,15],

                                        ];

 

然后,把图片中的各个部分取出来,放到一个数组去,数组的下表刚好就是这个图片素材的编号:

 

// 用来存放图片素材的数组

var lib:Array = new Array();

var bitmap:BitmapData;

// 源素材,就是我们上面的那张PNG

var bd:BitmapData = new BMD();



var py:uint;

var px:uint;

// 进行切割

for(py = 0;py<config.length;py++)

{

        var line:Array = config[py];

        for(px = 0;px < line.length;px++)

        {

                bitmap = new BitmapData(128,128,true,0);

                bitmap.copyPixels(bd,new Rectangle(px*128,py*128,128,128),new Point(),null,null,true);

                // 把素材编号作为下表进行素材的保存

                lib[line[px]] = bitmap;

        }

}

 

好了,这样,素材就准备好了。下面我们做一个地图试验一下

首先,生成一个空地图,还是用数组好了:

 

 

                        var arr:Array = new Array();

                        // 生成10X10的地图

                        for(py=0;py<10;py++)

                        {

                                var data:Array = new Array();

                                for(px=0;px<10;px++)

                                {

                                        // 每个地图区块包含4个顶点数据,默认为0

                                        data.push([0,0,0,0]);

                                }

                                arr.push(data);

                        }

 

来看一下,当我们点击(或者说叫做地图的笔刷。。。)时,我们期望发生什么情况:



 

当我们点下鼠标时候,如图所示,我们会把鼠标指针所在的位置的顶点数值设置为4,而临近的顶点数值分别设置为8,1,2,刚好拼凑成上面这样的图形。

当然,同样用这样的方法在临近的位置点击,我们就会得到这样的效果:



 

如图,我们点击的鼠标位置,和上次点击一样,我们把点击的位置顶点值设置为4,临近顶点为8,1,2。而此时,因为这个顶点和上次的8号顶点其实在同一个Tile里,导致这个Tile内的顶点总和变成了12,所以更换了素材。于是我们得到了一个非常平滑的过度。

当然,再继续点下去,也是同样的算法,这里就不再赘述了。



 

来看一下后面的代码,点击的时候,当然是计算点击位置对应的区块,然后把改区块的右下角顶点值设置为4,这里要注意,如果这个顶点已经是4了,那就没必要再设置了。如果再设置,这个顶点变成了8,很显然就不对了。

 


 

stage.addEventListener(MouseEvent.CLICK,onClick);





function onClick(e:MouseEvent):void

{

        // 计算区块

        var _mx:uint = int(e.stageX/64);

        var _my:uint = int(e.stageY/64);

        // 区块顶点设置,3右下 2右上 1左下  0左上

        if(arr[_my][_mx][3]!=4) arr[_my][_mx][3]+=4; // 当前区块的右下

        if(arr[_my][_mx+1][1]!=8) arr[_my][_mx+1][1]+=8; // 右边区块的左下

        if(arr[_my+1][_mx][2]!=1)arr[_my+1][_mx][2]+=1; // 下面区块的右上

        if(arr[_my+1][_mx+1][0]!=2)arr[_my+1][_mx+1][0]+=2; // 下面右边区块的左上

        reDraw();

}

 

 

然后就是根据现在的顶点,重新绘制地形:

 

var resBD:BitmapData = new BitmapData(640,640,true,0xff000000);

addChild(new Bitmap(resBD));



function reDraw():void

{

        resBD.fillRect(resBD.rect,0);

        for(py=0;py<10;py++)

                        {

                                for(px=0;px<10;px++)

                                {

                                        var b:uint=arr[py][px][0]+arr[py][px][1]+arr[py][px][2]+arr[py][px][3];// 计算顶点合

                                        

                                        if(b==0) continue;

                                        if(b>15) b=15; // 超出15的顶点合是没有意义的。在魔兽争霸里,超出15会随机一个填充满的样式以丰富地表

                                        resBD.copyPixels(lib[b],lib[b].rect,new Point(px*64,py*64),null,null,true);

                                }

                        }

}

 

 

战争迷雾扩展

同样的原理,只要我们把素材处理成战争迷雾的黑色和半透明,即可实现战争迷雾效果。



 



 

 

  • 大小: 174.3 KB
  • 大小: 27.3 KB
  • 大小: 82.1 KB
  • 大小: 115.3 KB
  • 大小: 53.9 KB
  • 大小: 42.9 KB
  • 大小: 98.7 KB
  • mis.rar (347.3 KB)
  • 下载次数: 13
分享到:
评论

相关推荐

    GOOGLE地图拼接器

    【谷歌地图拼接器】是一款专门针对谷歌地图的工具,旨在帮助用户下载并拼接地图区域,以便在离线环境中查看或进行特定的地理分析。该软件的核心功能是让用户能够快速选择地图区域,并准确标定经纬度坐标,这对于户外...

    AS3.0地图制作,很好的资源

    8. **地图API集成**:如果需要接入第三方地图服务,如Google Maps或百度地图,AS3.0可以调用这些服务的API,实现在线地图功能。 9. **优化和性能**:处理大量地图数据时,要关注代码性能。例如,使用Sprite Batch或...

    基于MAPGIS的地图拼接方法

    MAPGIS作为一款广泛应用于地图制作与管理的专业软件,提供了强大的地图拼接功能。根据罗伟等人在《四川地质学报》2009年第29卷第3期的文章所述,通过深入分析MAPGIS的投影变换模块,提出了一种基于MAPGIS平台的地图...

    003平面地图拼接

    在游戏开发中,平面地图拼接是一个至关重要的技术,它涉及到如何将小的、独立的图块(如精灵或纹理)有效地组合成一个大的、连续的游戏场景。在本主题“003平面地图拼接”中,我们将深入探讨这一概念,并结合游戏...

    瓦片地图制作(图片拼接)

    在本项目中,我们将探讨如何利用图片拼接技术和JavaScript实现地图的拖拽和缩放功能,并且会提及一个C#编写的图片切割程序。 首先,我们要理解瓦片地图的工作原理。瓦片通常以256x256像素的大小进行切割,基于Web ...

    一种多机器人栅格地图拼接方法的研究.pdf

    综上所述,李雅梅、张瑞、吕猛的研究贡献在于提出了一种新的栅格地图拼接方法,该方法在提高拼接速度、增加有效匹配点数量、增强稳定性方面都有所突破,为多机器人系统在未知环境中的自主导航与地图构建提供了新的...

    Unity 2D Toolkit RPG地图块拼接

    3. **瓷砖(Tile)系统**:2D Toolkit的核心特性之一就是其瓷砖系统,允许开发者通过拼接小块图像(瓷砖)来构建大的地图。课程可能会详细讲解如何创建瓷砖集,设置不同类型的瓷砖(如地面、障碍物等),以及如何...

    百度地图分析之下载图片拼接

    在进行百度地图分析时,我们经常需要获取特定区域的高分辨率地图图像,这通常涉及到地图图片的下载与拼接操作。下面将详细讲解这个过程涉及的技术点和步骤。 首先,我们要理解百度地图的坐标系统。百度地图采用的是...

    as3 45度视角 地图游戏编辑器 源码

    用户可以通过这个编辑器了解和实践如何在AS3中实现45度视角的图形渲染、地图拼接、物体放置等游戏开发关键要素。这有助于初学者掌握游戏开发的基本技巧,并为有经验的开发者提供快速原型设计的可能性。 【标签】中...

    一种改进粒子群优化算法的多机器人地图拼接方法.pdf

    与传统的建图方法相比,这种基于改进PSO算法的拼接方法,能在机器人之间的相对位置未知的情况下,依然能够高效、准确地完成地图的拼接任务。 在介绍方法的过程中,文章还提到了其他几种拼接技术的研究现状,例如...

    Android平台的全景图拼接系统设计与实现(也可做毕业设计).zip

    基于Android平台的全景图拼接系统设计与实现。基于全景图的虚拟现实技术被广泛应用于街景地图、智能家居、室内展示、虚拟旅游等场景,具有效率高、展示效果真实的优势。全景图是一种能覆盖大范围场景的宽视角图像。...

    谷歌地图免费下载拼接工具_稻歌地图

    标题中的“谷歌地图免费下载拼接工具_稻歌地图”指的是一个名为“稻歌Google Map截获器”的软件,这款工具允许用户免费下载并拼接谷歌地图上的卫星影像、地图和地形图。在这个过程中,我们可以深入探讨几个重要的IT...

    基于FPGA的全景视频图像拼接的设计与实现

    探索采用一种设计方法,通过从算法和系统优化设计入手,采用简化的SIFT算法,并且将FPGA平台与此算法计算分离,转而由ARM来承担图像配准参数的计算,由FPGA平台依据参数结果进行全景视频图像的拼接。本文涉及了应用...

    JS+CSS3 3D图片分割拼接动画特效

    【JS+CSS3 3D图片分割拼接动画特效】是一种在网页中通过JavaScript和CSS3技术实现的创新视觉效果。这种特效将图片分解成多个3D片段,并通过动态拼接来创造出引人入胜的视觉体验。接下来,我们将深入探讨这一特效背后...

    google和Bing地图下载拼接程序

    该程序是一个专为地图下载和拼接设计的工具,它能够从谷歌...总之,这个程序结合了地图服务API、图像处理技术以及Windows API,实现了从在线地图服务中获取并拼接地图的功能,为用户提供了一个自定义区域遥感图的工具。

    图像拼接算法及实现 图像拼接

    图像拼接技术是一种将多张具有重叠区域的图像整合成一张大视场、高分辨率的新图像的方法。这种技术在多个领域中具有重要的应用价值,包括摄影测量学、计算机视觉、遥感图像处理、医学图像分析以及计算机图形学。图像...

Global site tag (gtag.js) - Google Analytics