地图文件下载
:http://www.huanhuan18.com/myWeb/soft/YFEditor.air
或者 : http://www.huanhuan18.com/myWeb/soft/YFEditor/
exe形式 ::http://www.huanhuan18.com/myWeb/soft/YFEditor.exe
使用注意 : 假如 需要使用低像素图片 需要自己手动 去点击 低像素按钮 来生成低像素地图 地图切片也是 一样 需要自己主动去触发 !这两个功能处理时间比较长 使用时请耐心等待
数据文件说明: 网络地址:
http://www.huanhuan18.com/myWeb/soft/map1.xml
<?xml version="1.0" encoding="utf-8"?>
<YFMapEditor><map mapName="map1" url="images/bgMap/singleMap/map1.jpg" tileWidth="60" tileHeight="30" caculateWidth="3660" caculateHeight="1680" mapWidth="3660" mapHeight="1658" loadType="μ¥???t??" beginTileX="-1" beginTileY="-1" endTileX="60" endTileY="111" roadType="1" blockType="0" alphaRoadType="2" skipTypeDescription="大于等于3的节点类型">
<floor>0,3,2,0</floor>
<skipMaps/>
<buildings>
<building url="" buildX="330" buildY="330" imageX="330" imageY="15" roatationX="0" roatationY="0" roatationZ="0" deepIndex="0">
<corner>10,10,100,100</corner>
</building>
<building url="" buildX="0" buildY="0" imageX="0" imageY="90" roatationX="0" roatationY="0" roatationZ="0" deepIndex="1">
<corner>10,100</corner>
</building>
<building url="images/trees/2.png" buildX="210" buildY="195" imageX="210" imageY="195" roatationX="0" roatationY="0" roatationZ="0" deepIndex="2">
<block>5,6,4,7,5,1,8,9,11,13,15,12,17,14,19,18,20,21,23,24,22,</block>
<corner>182,464,41,182,370,356,424</corner>
</building>
</buildings>
</map>
</YFMapEditor>
相关说明:
mapName 是 地图的名称
url是地图地址
mapWidth mapHeight 是这个地图的实际宽高
caculateWidth caculateHeight是这个地图的 计算宽高 是我们在数据处理中要用到的宽高
beginTileX beginTileY 第一个节点位置
roadType=1 表示可走 blockType表示不可走 alphaRoadType=2表示消隐点.也就是人物在该点时需要半透明化
值大于等3的点表示地图跳转点用来跳转到其他地图中
skipMap节点
secondInfo用来标识在同一地域间的跳转 假如两张地图之间进行跳转,则不需要考虑此属性
假如 在一张地图上进行传送跳转到该地图的另一传送点 则需要 此属性
type 值是指的是该类型
里面<skipMap> 0,11</skipMap> 的值指的是这点存在的位置 用的是tile坐标
building 节点:
url指的是 图片地址 buildX buildY指的是 该建筑的位置(flash坐标) imageX imageY(flash坐标) 是图片的位置,这也是我在写程序加载图片后所需要放置的位置 corner里面的值指的是该建筑的四个控制点的位置(tile坐标),这个位置是相对的 相对 buildX buildY的值 (计算时需要将cornenr内部的值转换为flash坐标 在与buildX buildY相加得到全局的控制点flash坐标)
block 里面的值保存的是不可走的局部位置 得到全局位置 也是要借助 buildX buildY值
必备工具类:
package utils.games.utils { /** * ... * @author dreamnight http://huanhuan18.com/blog http://blog.csdn.net/hu36978 * */ public class MapUtil { import flash.geom.Point; import utils.games.display.GameObject; public function MapUtil() { } /* *在 getTilePoint函数 的基础上增加了 对gridlayer坐标位置的判断定位 * * */ public static function getTilePoint2(tileWidth:Number,tileHeight:Number,px:Number,py:Number,gridLayerX:Number=0,gridlayerY:Number=0):Point { //根据 gridlayer坐标 来算出像素相对坐标 var realX:Number = px - gridLayerX; var realY:Number = py - gridlayerY; return MapUtil.getTilePoint(tileWidth,tileHeight,realX,realY); } /** * * //这里的 px 是相对于原点的像素坐标 这里的网格的原点坐标在(0,0)也就是gridLayer中的grid坐标在原点并且gridlayer的坐标也在原点 在以后的GridLayer中我只控制GridLayer所以这个方法实用性 是当Gridlayer的坐标在原点时成立 * * */ public static function getTilePoint(tileWidth:Number,py:Number):Point { /** * 网格的x坐标 * */ var xtile:int = 0; /** * 网格的y坐标 * */ var ytile:int = 0; var cx:int,cy:int; /** * 计算出当前X所在的以tileWidth为宽的矩形的中心的X坐标 * */ cx = int(px / tileWidth) * tileWidth + tileWidth/2; /** * 计算出当前Y所在的以tileHeight为高的矩形的中心的Y坐标 * */ cy = int(py / tileHeight) * tileHeight + tileHeight / 2; //四个直线方程 var line1:Number = py + (px - cx) *tileHeight / tileWidth - cy + tileHeight * 0.5; // 满足 >0条件 var line2:Number = py + (cx - px) *tileHeight / tileWidth - cy + tileHeight * 0.5; // >0 var line3:Number = py + (cx - px) * tileHeight / tileWidth - cy - tileHeight * 0.5;// <0 var line4:Number = py + (px - cx) * tileHeight / tileWidth - cy - tileHeight * 0.5;// <0 //当点在矩形内 也就是 y 为偶数的 tile if ((line1>=0)&&(line2>=0)&&(line3<=0)&&(line4<=0)) { xtile = int(px / tileWidth); ytile = int(py / tileHeight) * 2; } //、当在棱形外 else { //对X进行定位 当在左半边时 if ((px <= cx + tileWidth * 0.5) && (cx <= px)) { xtile = int(px / tileWidth); } else { //右半边 xtile = int(px / tileWidth) - 1; } //对 y 进行定位 当在上半部分时 if ((cy <= py) && (py <= cy + tileHeight * 0.5)) { ytile = int(py / tileHeight) * 2 + 1; }else { ytile = (int(py / tileHeight) - 1) * 2 +1; } } return new Point(xtile,ytile); } /* * 得到左上角的flash坐标 也就是注册点 * */ public static function getLeftTopPointByTile(tileWidth:int,tileHeight:int,tileX:int,tileY:int):Point { var point:Point = MapUtil.getTileCenterByTilePoint(tileWidth,tileX,tileY); var px:Number = point.x - tileWidth * 0.5; var py:Number = point.y - tileHeight * 0.5; return new Point(px,py); } public static function getLefTopPointByPixelPoint(tileW:Number,tileH:Number,py:Number):Point { var point:Point = MapUtil.getTileCenterByPixelPoint(tileW,tileH,px,py); var myX:Number = point.x - tileW * 0.5; var myY:Number = point.y - tileH * 0.5; return new Point(myX,myY); } //根据 tile坐标得到 tile的中心flash坐标 public static function getTileCenterByTilePoint(tileW:Number,tx:int,ty:int):Point { var px:Number; var py:Number; py = 0.5 * tileH * ty + 0.5 * tileH; //当 ty为偶数 if (ty % 2 == 0) { px = tx * tileW + 0.5 * tileW; } else { px=tx * tileW + tileW; } return new Point(px,py); } //根据像素坐标<flash实际坐标> 得到 tile中心坐标 public static function getTileCenterByPixelPoint(tileW:Number,py:Number):Point { var point:Point = MapUtil.getTilePoint(tileW,py); return MapUtil.getTileCenterByTilePoint(tileW,point.x,point.y); } /* // cols是含有的列数 索引 是从0开始 public static function getIndexByTilePoint(tileX:int,tileY:int,cols:int):int { var index:int=tileY*cols+tileX return index; }*/ /* public static function getTilePointByIndex(index:int,columns:int):Point { var tileY:int = index/ columns; var tileX:int = index % columns ; return new Point(tileX,tileY); }*/ /** * 根据 tileX tileY来得到相应位置的 点 假如不存在的话就会返回null * * * @param array 总点数组 长度 为 (endTileX-beginTileX+1)*(endTileY-beginTileY+1) * @param tileX * @param tileY */ public static function getArrayPointByTilePoint(array:Array,endTileX:int,endTleY:int,beginTileX:int=-1,beginTileY:int=-1):Point { //var column:int = endTileX - beginTileX + 1; // var row:int = endTleY - beginTileY + 1; var index:int = MapUtil.getTileIndex(tileX,tileY,endTileX,endTleY,beginTileX,beginTileY); var point:Point = array[index]; return point; } /** * 根据 px py来得到相应位置的 点 假如不存在的话就会返回null * * * @param array 总点数组 长度 为 (endTileX-beginTileX+1)*(endTileY-beginTileY+1) * @param px flash坐标 * @param py */ public static function getArrayPointByFlashPoint(tileW:int,tileH:int,array:Array,px:int,py:int,beginTileX:int = -1,beginTileY:int = -1):Point { var tilePoint:Point = MapUtil.getTilePoint(tileW,py); return MapUtil.getArrayPointByTilePoint(array,tilePoint.x,tilePoint.y,beginTileY); } /** * 根据tileX tileY 得到在总数组中的索引 * @param tileX * @param tileY * @param endTileX * @param endTleY * @param beginTileX * @param beginTileY * @return */ public static function getTileIndex(tileX:int,beginTileY:int=-1):int { var column:int = endTileX - beginTileX + 1; var index:int = tileX-beginTileX + (tileY-beginTileY) * column; return index; } //tileX tileY 的本地与全局的转化 /* * 本地tile在Building的坐标 转化为在Buildding父容器中的坐标 * * * 注意 Buildding已经添加进全局做标中 也就是说 转化后的坐标 是 和building 的坐标 在同一坐标系中 @param buildingTilePoint 该值是在buiding 中的坐标值 @param 参照对象 也就是 buildingTilePoint所属坐标系 最终返回的坐标是 和 buiding 在同一坐标系 * * */ /* public static function localToGlobalTile(buildingTilePoint:Point,buiding:GameObject):Point { var buildingPoint:Point = buiding.getTilePosition(); var gx:int = buildingTilePoint.x + buildingPoint.x; var gy:int = buildingTilePoint.y + buildingPoint.y; return new Point(gx,gy); }*/ /* * * 全局tile坐标 转化为在Buildding中的坐标 * 注意 Buildding已经添加进全局做标中 @globalPoint 和buiding 的坐标 是在同一坐标系中 @buiding 参照对象 最终返回的是globalPoint在buiding坐标系中的坐标 * */ /* public static function globalToLocalTile(globalPoint:Point,buiding:GameObject):Point { var buildingPoint:Point = buiding.getTilePosition(); var gx:int = globalPoint.x - buildingPoint.x; var gy:int = globalPoint.y - buildingPoint.y; return new Point(gx,gy); }*/ /** * 将数据拆成 Point对象 比如 * @param str str的形式是 1,4 这样的形式 * @return */ public static function splitDataToPointArr(str:String):Vector.<Point> { /** * str字符串个数必须是偶数 */ var arr:Array = str.split(","); if (arr.length % 2 != 0) { //throw new Error("MapUtil ::数据有误"); return new Vector.<Point>(); //return null; } var len:int = arr.length; var i:int = 0; var point:Point; var vecPoint:Vector.<Point> = new Vector.<Point>(); while (i != len ) { point = new Point(); point.x = arr[i]; point.y =arr[i + 1]; vecPoint.push(point); i = i + 2; } return vecPoint; } ///end class } }