laya.tiledmap.js 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151
  1. (function(window,document,Laya){
  2. var __un=Laya.un,__uns=Laya.uns,__static=Laya.static,__class=Laya.class,__getset=Laya.getset,__newvec=Laya.__newvec;
  3. var Browser=laya.utils.Browser,Context=laya.resource.Context,HTMLCanvas=laya.resource.HTMLCanvas,Handler=laya.utils.Handler;
  4. var Loader=laya.net.Loader,Point=laya.maths.Point,Rectangle=laya.maths.Rectangle,Render=laya.renders.Render;
  5. var Sprite=laya.display.Sprite,Texture=laya.resource.Texture;
  6. /**
  7. *此类是子纹理类,也包括同类动画的管理
  8. *TiledMap会把纹理分割成无数子纹理,也可以把其中的某块子纹理替换成一个动画序列
  9. *本类的实现就是如果发现子纹理被替换成一个动画序列,animationKey会被设为true
  10. *即animationKey为true,就使用TileAniSprite来做显示,把动画序列根据时间画到TileAniSprite上
  11. *@author ...
  12. */
  13. //class laya.map.TileTexSet
  14. var TileTexSet=(function(){
  15. function TileTexSet(){
  16. /**唯一标识*/
  17. this.gid=-1;
  18. /**子纹理的引用*/
  19. this.texture=null;
  20. /**纹理显示时的坐标偏移X*/
  21. this.offX=0;
  22. /**纹理显示时的坐标偏移Y*/
  23. this.offY=0;
  24. /**当前要播放动画的纹理序列*/
  25. this.textureArray=null;
  26. /**当前动画每帧的时间间隔*/
  27. this.durationTimeArray=null;
  28. /**动画播放的总时间 */
  29. this.animationTotalTime=0;
  30. /**true表示当前纹理,是一组动画,false表示当前只有一个纹理*/
  31. this.isAnimation=false;
  32. this._spriteNum=0;
  33. //当前动画有多少个显示对象
  34. this._aniDic=null;
  35. //通过显示对象的唯一名字,去保存显示显示对象
  36. this._frameIndex=0;
  37. //当前动画播放到第几帧
  38. this._time=0;
  39. //距离上次动画刷新,过了多少长时间
  40. this._interval=0;
  41. //每帧刷新的时间间隔
  42. this._preFrameTime=0;
  43. }
  44. __class(TileTexSet,'laya.map.TileTexSet');
  45. var __proto=TileTexSet.prototype;
  46. /**
  47. *加入一个动画显示对象到此动画中
  48. *@param aniName //显示对象的名字
  49. *@param sprite //显示对象
  50. */
  51. __proto.addAniSprite=function(aniName,sprite){
  52. if (this.animationTotalTime==0){
  53. return;
  54. }
  55. if (this._aniDic==null){
  56. this._aniDic={};
  57. }
  58. if (this._spriteNum==0){
  59. Laya.timer.frameLoop(3,this,this.animate);
  60. this._preFrameTime=Browser.now();
  61. this._frameIndex=0;
  62. this._time=0;
  63. this._interval=0;
  64. }
  65. this._spriteNum++;
  66. this._aniDic[aniName]=sprite;
  67. if (this.textureArray && this._frameIndex < this.textureArray.length){
  68. var tTileTextureSet=this.textureArray[this._frameIndex];
  69. this.drawTexture(sprite,tTileTextureSet);
  70. }
  71. }
  72. /**
  73. *把动画画到所有注册的SPRITE上
  74. */
  75. __proto.animate=function(){
  76. if (this.textureArray && this.textureArray.length > 0 && this.durationTimeArray && this.durationTimeArray.length > 0){
  77. var tNow=Browser.now();
  78. this._interval=tNow-this._preFrameTime;
  79. this._preFrameTime=tNow;
  80. if (this._interval > this.animationTotalTime){
  81. this._interval=this._interval % this.animationTotalTime;
  82. }
  83. this._time+=this._interval;
  84. var tTime=this.durationTimeArray[this._frameIndex];
  85. while (this._time > tTime){
  86. this._time-=tTime;
  87. this._frameIndex++;
  88. if (this._frameIndex >=this.durationTimeArray.length || this._frameIndex >=this.textureArray.length){
  89. this._frameIndex=0;
  90. };
  91. var tTileTextureSet=this.textureArray[this._frameIndex];
  92. var tSprite;
  93. for (var p in this._aniDic){
  94. tSprite=this._aniDic[p];
  95. this.drawTexture(tSprite,tTileTextureSet);
  96. }
  97. tTime=this.durationTimeArray[this._frameIndex];
  98. }
  99. }
  100. }
  101. __proto.drawTexture=function(sprite,tileTextSet){
  102. sprite.graphics.clear(true);
  103. sprite.graphics.drawImage(tileTextSet.texture,tileTextSet.offX,tileTextSet.offY);
  104. }
  105. /**
  106. *移除不需要更新的SPRITE
  107. *@param _name
  108. */
  109. __proto.removeAniSprite=function(_name){
  110. if (this._aniDic && this._aniDic[_name]){
  111. delete this._aniDic[_name];
  112. this._spriteNum--
  113. if (this._spriteNum==0){
  114. Laya.timer.clear(this,this.animate);
  115. }
  116. }
  117. }
  118. /**
  119. *显示当前动画的使用情况
  120. */
  121. __proto.showDebugInfo=function(){
  122. var tInfo=null;
  123. if (this._spriteNum > 0){
  124. tInfo="TileTextureSet::gid:"+this.gid.toString()+" 动画数:"+this._spriteNum.toString();
  125. }
  126. return tInfo;
  127. }
  128. /**
  129. *清理
  130. */
  131. __proto.clearAll=function(){
  132. this.gid=-1;
  133. if (this.texture){
  134. this.texture.destroy();
  135. this.texture=null;
  136. }
  137. this.offX=0;
  138. this.offY=0;
  139. this.textureArray=null;
  140. this.durationTimeArray=null;
  141. this.isAnimation=false;
  142. this._spriteNum=0;
  143. this._aniDic=null;
  144. this._frameIndex=0;
  145. this._preFrameTime=0;
  146. this._time=0;
  147. this._interval=0;
  148. }
  149. return TileTexSet;
  150. })()
  151. /**
  152. *tiledMap是整个地图的核心
  153. *地图以层级来划分地图(例如:地表层,植被层,建筑层)
  154. *每层又以分块(GridSprite)来处理显示对象,只显示在视口区域的区
  155. *每块又包括N*N个格子(tile)
  156. *格子类型又分为动画格子跟图片格子两种
  157. *@author ...
  158. */
  159. //class laya.map.TiledMap
  160. var TiledMap=(function(){
  161. var GRect,TileMapAniData,TileSet;
  162. function TiledMap(){
  163. //json数据
  164. this._jsonData=null;
  165. //存放地图中用到的所有子纹理数据
  166. this._tileTexSetArr=[];
  167. //主纹理数据,主要在释放纹理资源时使用
  168. this._texArray=[];
  169. //地图信息中的一些基本数据
  170. this._x=0;
  171. //地图的坐标
  172. this._y=0;
  173. //_height=_mapTileH *_mapH
  174. this._width=0;
  175. //地图的宽度
  176. this._height=0;
  177. //地图的高度
  178. this._mapW=0;
  179. //地图的横向格子数
  180. this._mapH=0;
  181. //地图的竖向格子数
  182. this._mapTileW=0;
  183. //tile的宽度
  184. this._mapTileH=0;
  185. //地图的显示对象
  186. this._mapSprite=null;
  187. //地图的显示对象
  188. this._layerArray=[];
  189. //这里保存所有的MapLayer对象
  190. this._renderLayerArray=[];
  191. //这里保存需要渲染的MapLayer对象
  192. this._gridArray=[];
  193. //地图块相关的
  194. this._showGridKey=false;
  195. //是否显示块边界线(用来调试用)
  196. this._totalGridNum=0;
  197. //一层中的GridSprite的总数
  198. this._gridW=0;
  199. //地图的横向块数
  200. this._gridH=0;
  201. //地图的坚向块数
  202. this._gridWidth=450;
  203. //块的默认宽度
  204. this._gridHeight=450;
  205. //块的默认高度
  206. this._jsonLoader=null;
  207. //用来加载JSON文件用的LOADER
  208. this._loader=null;
  209. //用来加载纹理数据用的LOADER
  210. this._tileSetArray=[];
  211. //用来存放还需要哪些儿纹理等待加载
  212. this._currTileSet=null;
  213. //正在加载的纹理需要的数据源
  214. this._completeHandler=null;
  215. //上次视口显示的块范围
  216. this._index=0;
  217. this._animationDic={};
  218. //需要创建的动画数据
  219. this._properties=null;
  220. //当前地图的自定义属性
  221. this._tileProperties={};
  222. //图块属性
  223. this._tileProperties2={};
  224. //默认的地图类型(具体要看JSON文件)
  225. this._orientation="orthogonal";
  226. //默认的tile渲染顺序(具体要看JSON文件)
  227. this._renderOrder="right-down";
  228. //调试用的颜色组合
  229. this._colorArray=["FF","00","33","66"];
  230. //缩放相关的操作
  231. this._scale=1;
  232. this._pivotScaleX=0.5;
  233. this._pivotScaleY=0.5;
  234. this._centerX=0;
  235. this._centerY=0;
  236. /**@private */
  237. this._viewPortX=0;
  238. /**@private */
  239. this._viewPortY=0;
  240. this._viewPortWidth=0;
  241. this._viewPortHeight=0;
  242. //是否开启线性取样
  243. this._enableLinear=true;
  244. //资源的相对路径
  245. this._resPath=null;
  246. this._pathArray=null;
  247. //把地图限制在显示区域
  248. this._limitRange=false;
  249. /**
  250. *是否自动缓存没有动画的地块
  251. */
  252. this.autoCache=true;
  253. /**
  254. *自动缓存类型,地图较大时建议使用normal
  255. */
  256. this.autoCacheType="normal";
  257. /**
  258. *是否合并图层,开启合并图层时,图层属性内可添加layer属性,运行时将会将相邻的layer属性相同的图层进行合并以提高性能
  259. */
  260. this.enableMergeLayer=false;
  261. /**
  262. *是否移除被覆盖的格子,地块可添加type属性,type不为0时表示不透明,被不透明地块遮挡的地块将会被剔除以提高性能
  263. */
  264. this.removeCoveredTile=false;
  265. /**
  266. *是否显示大格子里显示的贴图数量
  267. */
  268. this.showGridTextureCount=false;
  269. /**
  270. *是否调整地块边缘消除缩放导致的缝隙
  271. */
  272. this.antiCrack=true;
  273. /**
  274. *是否在加载完成之后cache所有大格子
  275. */
  276. this.cacheAllAfterInit=false;
  277. this._texutreStartDic={};
  278. this._rect=new Rectangle();
  279. this._paddingRect=new Rectangle();
  280. this._mapRect=new GRect();
  281. this._mapLastRect=new GRect();
  282. }
  283. __class(TiledMap,'laya.map.TiledMap');
  284. var __proto=TiledMap.prototype;
  285. /**
  286. *创建地图
  287. *@param mapName JSON文件名字
  288. *@param viewRect 视口区域
  289. *@param completeHandler 地图创建完成的回调函数
  290. *@param viewRectPadding 视口扩充区域,把视口区域上、下、左、右扩充一下,防止视口移动时的穿帮
  291. *@param gridSize grid大小
  292. *@param enableLinear 是否开启线性取样(为false时,可以解决地图黑线的问题,但画质会锐化)
  293. *@param limitRange 把地图限制在显示区域
  294. */
  295. __proto.createMap=function(mapName,viewRect,completeHandler,viewRectPadding,gridSize,enableLinear,limitRange){
  296. (enableLinear===void 0)&& (enableLinear=true);
  297. (limitRange===void 0)&& (limitRange=false);
  298. this._enableLinear=enableLinear;
  299. this._limitRange=limitRange;
  300. this._rect.x=viewRect.x;
  301. this._rect.y=viewRect.y;
  302. this._rect.width=viewRect.width;
  303. this._rect.height=viewRect.height;
  304. this._viewPortWidth=viewRect.width / this._scale;
  305. this._viewPortHeight=viewRect.height / this._scale;
  306. this._completeHandler=completeHandler;
  307. if (viewRectPadding){
  308. this._paddingRect.copyFrom(viewRectPadding);
  309. }
  310. else {
  311. this._paddingRect.setTo(0,0,0,0);
  312. }
  313. if (gridSize){
  314. this._gridWidth=gridSize.x;
  315. this._gridHeight=gridSize.y;
  316. };
  317. var tIndex=mapName.lastIndexOf("/");
  318. if (tIndex >-1){
  319. this._resPath=mapName.substr(0,tIndex);
  320. this._pathArray=this._resPath.split("/");
  321. }
  322. else {
  323. this._resPath="";
  324. this._pathArray=[];
  325. }
  326. this._jsonLoader=new Loader();
  327. this._jsonLoader.once("complete",this,this.onJsonComplete);
  328. this._jsonLoader.load(mapName,/*laya.net.Loader.JSON*/"json",false);
  329. }
  330. /**
  331. *json文件读取成功后,解析里面的纹理数据,进行加载
  332. *@param e JSON数据
  333. */
  334. __proto.onJsonComplete=function(e){
  335. this._mapSprite=new Sprite();
  336. Laya.stage.addChild(this._mapSprite);
  337. var tJsonData=this._jsonData=e;
  338. this._properties=tJsonData.properties;
  339. this._orientation=tJsonData.orientation;
  340. this._renderOrder=tJsonData.renderorder;
  341. this._mapW=tJsonData.width;
  342. this._mapH=tJsonData.height;
  343. this._mapTileW=tJsonData.tilewidth;
  344. this._mapTileH=tJsonData.tileheight;
  345. this._width=this._mapTileW *this._mapW;
  346. this._height=this._mapTileH *this._mapH;
  347. if (this._orientation=="staggered"){
  348. this._height=(0.5+this._mapH *0.5)*this._mapTileH;
  349. }
  350. this._mapLastRect.top=this._mapLastRect.bottom=this._mapLastRect.left=this._mapLastRect.right=-1;
  351. var tArray=tJsonData.tilesets;
  352. var tileset;
  353. var tTileSet;
  354. var i=0;
  355. for (i=0;i < tArray.length;i++){
  356. tileset=tArray[i];
  357. tTileSet=new TileSet();
  358. tTileSet.init(tileset);
  359. if (tTileSet.properties && tTileSet.properties.ignore)continue ;
  360. this._tileProperties[i]=tTileSet.tileproperties;
  361. this.addTileProperties(tTileSet.tileproperties);
  362. this._tileSetArray.push(tTileSet);
  363. var tTiles=tileset.tiles;
  364. if (tTiles){
  365. for (var p in tTiles){
  366. var tAnimation=tTiles[p].animation;
  367. if (tAnimation){
  368. var tAniData=new TileMapAniData();
  369. this._animationDic[p]=tAniData;
  370. tAniData.image=tileset.image;
  371. for (var j=0;j < tAnimation.length;j++){
  372. var tAnimationItem=tAnimation[j];
  373. tAniData.mAniIdArray.push(tAnimationItem.tileid);
  374. tAniData.mDurationTimeArray.push(tAnimationItem.duration);
  375. }
  376. }
  377. }
  378. }
  379. }
  380. this._tileTexSetArr.push(null);
  381. if (this._tileSetArray.length > 0){
  382. tTileSet=this._currTileSet=this._tileSetArray.shift();
  383. this._loader=new Loader();
  384. this._loader.once("complete",this,this.onTextureComplete);
  385. var tPath=this.mergePath(this._resPath,tTileSet.image);
  386. this._loader.load(tPath,/*laya.net.Loader.IMAGE*/"image",false);
  387. }
  388. }
  389. /**
  390. *合并路径
  391. *@param resPath
  392. *@param relativePath
  393. *@return
  394. */
  395. __proto.mergePath=function(resPath,relativePath){
  396. var tResultPath="";
  397. var tImageArray=relativePath.split("/");
  398. var tParentPathNum=0;
  399. var i=0;
  400. for (i=tImageArray.length-1;i >=0;i--){
  401. if (tImageArray[i]==".."){
  402. tParentPathNum++;
  403. }
  404. }
  405. if (tParentPathNum==0){
  406. if (this._pathArray.length > 0){
  407. tResultPath=resPath+"/"+relativePath;
  408. }
  409. else {
  410. tResultPath=relativePath;
  411. }
  412. return tResultPath;
  413. };
  414. var tSrcNum=this._pathArray.length-tParentPathNum;
  415. if (tSrcNum < 0){
  416. console.log("[error]path does not exist",this._pathArray,tImageArray,resPath,relativePath);
  417. }
  418. for (i=0;i < tSrcNum;i++){
  419. if (i==0){
  420. tResultPath+=this._pathArray[i];
  421. }
  422. else {
  423. tResultPath=tResultPath+"/"+this._pathArray[i];
  424. }
  425. }
  426. for (i=tParentPathNum;i < tImageArray.length;i++){
  427. tResultPath=tResultPath+"/"+tImageArray[i];
  428. }
  429. return tResultPath;
  430. }
  431. /**
  432. *纹理加载完成,如果所有的纹理加载,开始初始化地图
  433. *@param e 纹理数据
  434. */
  435. __proto.onTextureComplete=function(e){
  436. var json=this._jsonData;
  437. var tTexture=e;
  438. if (!this._enableLinear){
  439. tTexture.bitmap.minFifter=0x2600;
  440. tTexture.bitmap.magFifter=0x2600;
  441. }
  442. this._texArray.push(tTexture);
  443. var tSubTexture=null;
  444. var tTileSet=this._currTileSet;
  445. var tTileTextureW=tTileSet.tilewidth;
  446. var tTileTextureH=tTileSet.tileheight;
  447. var tImageWidth=tTileSet.imagewidth;
  448. var tImageHeight=tTileSet.imageheight;
  449. var tFirstgid=tTileSet.firstgid;
  450. var tTileWNum=Math.floor((tImageWidth-tTileSet.margin-tTileTextureW)/ (tTileTextureW+tTileSet.spacing))+1;
  451. var tTileHNum=Math.floor((tImageHeight-tTileSet.margin-tTileTextureH)/ (tTileTextureH+tTileSet.spacing))+1;
  452. var tTileTexSet=null;
  453. this._texutreStartDic[tTileSet.image]=this._tileTexSetArr.length;
  454. for (var i=0;i < tTileHNum;i++){
  455. for (var j=0;j < tTileWNum;j++){
  456. tTileTexSet=new TileTexSet();
  457. tTileTexSet.offX=tTileSet.titleoffsetX;
  458. tTileTexSet.offY=tTileSet.titleoffsetY-(tTileTextureH-this._mapTileH);
  459. tTileTexSet.texture=Texture.createFromTexture(tTexture,tTileSet.margin+(tTileTextureW+tTileSet.spacing)*j,tTileSet.margin+(tTileTextureH+tTileSet.spacing)*i,tTileTextureW,tTileTextureH);
  460. if(this.antiCrack)
  461. this.adptTexture(tTileTexSet.texture);
  462. this._tileTexSetArr.push(tTileTexSet);
  463. tTileTexSet.gid=this._tileTexSetArr.length;
  464. }
  465. }
  466. if (this._tileSetArray.length > 0){
  467. tTileSet=this._currTileSet=this._tileSetArray.shift();
  468. this._loader.once("complete",this,this.onTextureComplete);
  469. var tPath=this.mergePath(this._resPath,tTileSet.image);
  470. this._loader.load(tPath,/*laya.net.Loader.IMAGE*/"image",false);
  471. }
  472. else {
  473. this._currTileSet=null;
  474. this.initMap();
  475. }
  476. }
  477. __proto.adptTexture=function(tex){
  478. if (!tex)return;
  479. var pX=tex.uv[0];
  480. var pX1=tex.uv[2];
  481. var pY=tex.uv[1];
  482. var pY1=tex.uv[7];
  483. var dW=1 / tex.bitmap.width;
  484. var dH=1 / tex.bitmap.height;
  485. tex.uv[0]=tex.uv[6]=pX+dW;
  486. tex.uv[2]=tex.uv[4]=pX1-dW;
  487. tex.uv[1]=tex.uv[3]=pY+dH;
  488. tex.uv[5]=tex.uv[7]=pY1-dH;
  489. }
  490. /**
  491. *初始化地图
  492. */
  493. __proto.initMap=function(){
  494. var i=0,n=0;
  495. for (var p in this._animationDic){
  496. var tAniData=this._animationDic[p];
  497. var gStart=0;
  498. gStart=this._texutreStartDic[tAniData.image];
  499. var tTileTexSet=this.getTexture(parseInt(p)+gStart);
  500. if (tAniData.mAniIdArray.length > 0){
  501. tTileTexSet.textureArray=[];
  502. tTileTexSet.durationTimeArray=tAniData.mDurationTimeArray;
  503. tTileTexSet.isAnimation=true;
  504. tTileTexSet.animationTotalTime=0;
  505. for (i=0,n=tTileTexSet.durationTimeArray.length;i < n;i++){
  506. tTileTexSet.animationTotalTime+=tTileTexSet.durationTimeArray[i];
  507. }
  508. for (i=0,n=tAniData.mAniIdArray.length;i < n;i++){
  509. var tTexture=this.getTexture(tAniData.mAniIdArray[i]+gStart);
  510. tTileTexSet.textureArray.push(tTexture);
  511. }
  512. }
  513. }
  514. this._gridWidth=Math.floor(this._gridWidth / this._mapTileW)*this._mapTileW;
  515. this._gridHeight=Math.floor(this._gridHeight / this._mapTileH)*this._mapTileH;
  516. if (this._gridWidth < this._mapTileW){
  517. this._gridWidth=this._mapTileW;
  518. }
  519. if (this._gridHeight < this._mapTileH){
  520. this._gridHeight=this._mapTileH;
  521. }
  522. this._gridW=Math.ceil(this._width / this._gridWidth);
  523. this._gridH=Math.ceil(this._height / this._gridHeight);
  524. this._totalGridNum=this._gridW *this._gridH;
  525. for (i=0;i < this._gridH;i++){
  526. var tGridArray=[];
  527. this._gridArray.push(tGridArray);
  528. for (var j=0;j < this._gridW;j++){
  529. tGridArray.push(null);
  530. }
  531. };
  532. var tLayerArray=this._jsonData.layers;
  533. var isFirst=true;
  534. var tTarLayerID=1;
  535. var tLayerTarLayerName;
  536. var preLayerTarName;
  537. var preLayer;
  538. for (var tLayerLoop=0;tLayerLoop < tLayerArray.length;tLayerLoop++){
  539. var tLayerData=tLayerArray[tLayerLoop];
  540. if (tLayerData.visible==true){
  541. var tMapLayer=new MapLayer();
  542. tMapLayer.init(tLayerData,this);
  543. if (!this.enableMergeLayer){
  544. this._mapSprite.addChild(tMapLayer);
  545. this._renderLayerArray.push(tMapLayer);
  546. }else{
  547. tLayerTarLayerName=tMapLayer.getLayerProperties("layer");
  548. isFirst=isFirst || (!preLayer)|| (tLayerTarLayerName !=preLayerTarName);
  549. if (isFirst){
  550. isFirst=false;
  551. tMapLayer.tarLayer=tMapLayer;
  552. preLayer=tMapLayer;
  553. this._mapSprite.addChild(tMapLayer);
  554. this._renderLayerArray.push(tMapLayer);
  555. }else{
  556. tMapLayer.tarLayer=preLayer;
  557. }
  558. preLayerTarName=tLayerTarLayerName;
  559. }
  560. this._layerArray.push(tMapLayer);
  561. }
  562. }
  563. if (this.removeCoveredTile){
  564. this.adptTiledMapData();
  565. }
  566. if (this.cacheAllAfterInit){
  567. this.cacheAllGrid();
  568. }
  569. this.moveViewPort(this._rect.x,this._rect.y);
  570. if (this._completeHandler !=null){
  571. this._completeHandler.run();
  572. }
  573. }
  574. //这里应该发送消息,通知上层,地图创建完成
  575. __proto.addTileProperties=function(tileDataDic){
  576. var key;
  577. for (key in tileDataDic){
  578. this._tileProperties2[key]=tileDataDic[key];
  579. }
  580. }
  581. __proto.getTileUserData=function(id,sign,defaultV){
  582. if (!this._tileProperties2 || !this._tileProperties2[id] || !(sign in this._tileProperties2[id]))return defaultV;
  583. return this._tileProperties2[id][sign];
  584. }
  585. __proto.adptTiledMapData=function(){
  586. var i=0,len=0;
  587. len=this._layerArray.length;
  588. var tLayer;
  589. var noNeeds={};
  590. var tDatas;
  591. for (i=len-1;i >=0;i--){
  592. tLayer=this._layerArray[i];
  593. tDatas=tLayer._mapData;
  594. if (!tDatas)continue ;
  595. this.removeCoverd(tDatas,noNeeds);
  596. this.collectCovers(tDatas,noNeeds,i);
  597. }
  598. }
  599. __proto.removeCoverd=function(datas,noNeeds){
  600. var i=0,len=0;
  601. len=datas.length;
  602. for (i=0;i < len;i++){
  603. if (noNeeds[i]){
  604. datas[i]=0;
  605. }
  606. }
  607. }
  608. __proto.collectCovers=function(datas,noNeeds,layer){
  609. var i=0,len=0;
  610. len=datas.length;
  611. var tTileData=0;
  612. var isCover=0;
  613. for (i=0;i < len;i++){
  614. tTileData=datas[i];
  615. if (tTileData > 0){
  616. isCover=this.getTileUserData(tTileData-1,"type",0);
  617. if (isCover > 0){
  618. noNeeds[i]=tTileData;
  619. }
  620. }
  621. }
  622. }
  623. /**
  624. *得到一块指定的地图纹理
  625. *@param index 纹理的索引值,默认从1开始
  626. *@return
  627. */
  628. __proto.getTexture=function(index){
  629. if (index < this._tileTexSetArr.length){
  630. return this._tileTexSetArr[index];
  631. }
  632. return null;
  633. }
  634. /**
  635. *得到地图的自定义属性
  636. *@param name 属性名称
  637. *@return
  638. */
  639. __proto.getMapProperties=function(name){
  640. if (this._properties){
  641. return this._properties[name];
  642. }
  643. return null;
  644. }
  645. /**
  646. *得到tile自定义属性
  647. *@param index 地图块索引
  648. *@param id 具体的TileSetID
  649. *@param name 属性名称
  650. *@return
  651. */
  652. __proto.getTileProperties=function(index,id,name){
  653. if (this._tileProperties[index] && this._tileProperties[index][id]){
  654. return this._tileProperties[index][id][name];
  655. }
  656. return null;
  657. }
  658. /**
  659. *通过纹理索引,生成一个可控制物件
  660. *@param index 纹理的索引值,默认从1开始
  661. *@return
  662. */
  663. __proto.getSprite=function(index,width,height){
  664. if (0 < this._tileTexSetArr.length){
  665. var tGridSprite=new GridSprite();
  666. tGridSprite.initData(this,true);
  667. tGridSprite.size(width,height);
  668. var tTileTexSet=this._tileTexSetArr[index];
  669. if (tTileTexSet !=null && tTileTexSet.texture !=null){
  670. if (tTileTexSet.isAnimation){
  671. var tAnimationSprite=new TileAniSprite();
  672. this._index++;
  673. tAnimationSprite.setTileTextureSet(this._index.toString(),tTileTexSet);
  674. tGridSprite.addAniSprite(tAnimationSprite);
  675. tGridSprite.addChild(tAnimationSprite);
  676. }
  677. else {
  678. tGridSprite.graphics.drawImage(tTileTexSet.texture,0,0,width,height);
  679. }
  680. tGridSprite.drawImageNum++;
  681. }
  682. return tGridSprite;
  683. }
  684. return null;
  685. }
  686. /**
  687. *设置视口的缩放中心点(例如:scaleX=scaleY=0.5,就是以视口中心缩放)
  688. *@param scaleX
  689. *@param scaleY
  690. */
  691. __proto.setViewPortPivotByScale=function(scaleX,scaleY){
  692. this._pivotScaleX=scaleX;
  693. this._pivotScaleY=scaleY;
  694. }
  695. /**
  696. *移动视口
  697. *@param moveX 视口的坐标x
  698. *@param moveY 视口的坐标y
  699. */
  700. __proto.moveViewPort=function(moveX,moveY){
  701. this._x=-moveX;
  702. this._y=-moveY;
  703. this._rect.x=moveX;
  704. this._rect.y=moveY;
  705. this.updateViewPort();
  706. }
  707. /**
  708. *改变视口大小
  709. *@param moveX 视口的坐标x
  710. *@param moveY 视口的坐标y
  711. *@param width 视口的宽
  712. *@param height 视口的高
  713. */
  714. __proto.changeViewPort=function(moveX,moveY,width,height){
  715. if (moveX==this._rect.x && moveY==this._rect.y && width==this._rect.width && height==this._rect.height)return;
  716. this._x=-moveX;
  717. this._y=-moveY;
  718. this._rect.x=moveX;
  719. this._rect.y=moveY;
  720. this._rect.width=width;
  721. this._rect.height=height;
  722. this._viewPortWidth=width / this._scale;
  723. this._viewPortHeight=height / this._scale;
  724. this.updateViewPort();
  725. }
  726. /**
  727. *在锚点的基础上计算,通过宽和高,重新计算视口
  728. *@param width 新视口宽
  729. *@param height 新视口高
  730. *@param rect 返回的结果
  731. *@return
  732. */
  733. __proto.changeViewPortBySize=function(width,height,rect){
  734. if (rect==null){
  735. rect=new Rectangle();
  736. }
  737. this._centerX=this._rect.x+this._rect.width *this._pivotScaleX;
  738. this._centerY=this._rect.y+this._rect.height *this._pivotScaleY;
  739. rect.x=this._centerX-width *this._pivotScaleX;
  740. rect.y=this._centerY-height *this._pivotScaleY;
  741. rect.width=width;
  742. rect.height=height;
  743. this.changeViewPort(rect.x,rect.y,rect.width,rect.height);
  744. return rect;
  745. }
  746. /**
  747. *刷新视口
  748. */
  749. __proto.updateViewPort=function(){
  750. this._centerX=this._rect.x+this._rect.width *this._pivotScaleX;
  751. this._centerY=this._rect.y+this._rect.height *this._pivotScaleY;
  752. var posChanged=false;
  753. var preValue=this._viewPortX;
  754. this._viewPortX=this._centerX-this._rect.width *this._pivotScaleX / this._scale;
  755. if (preValue !=this._viewPortX){
  756. posChanged=true;
  757. }else {
  758. preValue=this._viewPortY;
  759. }
  760. this._viewPortY=this._centerY-this._rect.height *this._pivotScaleY / this._scale;
  761. if (!posChanged && preValue !=this._viewPortY){
  762. posChanged=true;
  763. }
  764. if (this._limitRange){
  765. var tRight=this._viewPortX+this._viewPortWidth;
  766. if (tRight > this._width){
  767. this._viewPortX=this._width-this._viewPortWidth;
  768. };
  769. var tBottom=this._viewPortY+this._viewPortHeight;
  770. if (tBottom > this._height){
  771. this._viewPortY=this._height-this._viewPortHeight;
  772. }
  773. if (this._viewPortX < 0){
  774. this._viewPortX=0;
  775. }
  776. if (this._viewPortY < 0){
  777. this._viewPortY=0;
  778. }
  779. };
  780. var tPaddingRect=this._paddingRect;
  781. this._mapRect.top=Math.floor((this._viewPortY-tPaddingRect.y)/ this._gridHeight);
  782. this._mapRect.bottom=Math.floor((this._viewPortY+this._viewPortHeight+tPaddingRect.height+tPaddingRect.y)/ this._gridHeight);
  783. this._mapRect.left=Math.floor((this._viewPortX-tPaddingRect.x)/ this._gridWidth);
  784. this._mapRect.right=Math.floor((this._viewPortX+this._viewPortWidth+tPaddingRect.width+tPaddingRect.x)/ this._gridWidth);
  785. if (this._mapRect.top !=this._mapLastRect.top || this._mapRect.bottom !=this._mapLastRect.bottom || this._mapRect.left !=this._mapLastRect.left || this._mapRect.right !=this._mapLastRect.right){
  786. this.clipViewPort();
  787. this._mapLastRect.top=this._mapRect.top;
  788. this._mapLastRect.bottom=this._mapRect.bottom;
  789. this._mapLastRect.left=this._mapRect.left;
  790. this._mapLastRect.right=this._mapRect.right;
  791. posChanged=true;
  792. }
  793. if (!posChanged)return;
  794. var tMapLayer;
  795. var len=this._renderLayerArray.length;
  796. for (var i=0;i < len;i++){
  797. tMapLayer=this._renderLayerArray[i];
  798. if (tMapLayer._gridSpriteArray.length > 0)
  799. tMapLayer.updateGridPos();
  800. }
  801. }
  802. /**
  803. *GRID裁剪
  804. */
  805. __proto.clipViewPort=function(){
  806. var tSpriteNum=0;
  807. var tSprite;
  808. var tIndex=0;
  809. var tSub=0;
  810. var tAdd=0;
  811. var i=0,j=0;
  812. if (this._mapRect.left > this._mapLastRect.left){
  813. tSub=this._mapRect.left-this._mapLastRect.left;
  814. if (tSub > 0){
  815. for (j=this._mapLastRect.left;j < this._mapLastRect.left+tSub;j++){
  816. for (i=this._mapLastRect.top;i <=this._mapLastRect.bottom;i++){
  817. this.hideGrid(j,i);
  818. }
  819. }
  820. }
  821. }
  822. else {
  823. tAdd=Math.min(this._mapLastRect.left,this._mapRect.right+1)-this._mapRect.left;
  824. if (tAdd > 0){
  825. for (j=this._mapRect.left;j < this._mapRect.left+tAdd;j++){
  826. for (i=this._mapRect.top;i <=this._mapRect.bottom;i++){
  827. this.showGrid(j,i);
  828. }
  829. }
  830. }
  831. }
  832. if (this._mapRect.right > this._mapLastRect.right){
  833. tAdd=this._mapRect.right-this._mapLastRect.right;
  834. if (tAdd > 0){
  835. for (j=Math.max(this._mapLastRect.right+1,this._mapRect.left);j <=this._mapLastRect.right+tAdd;j++){
  836. for (i=this._mapRect.top;i <=this._mapRect.bottom;i++){
  837. this.showGrid(j,i);
  838. }
  839. }
  840. }
  841. }
  842. else {
  843. tSub=this._mapLastRect.right-this._mapRect.right
  844. if (tSub > 0){
  845. for (j=this._mapRect.right+1;j <=this._mapRect.right+tSub;j++){
  846. for (i=this._mapLastRect.top;i <=this._mapLastRect.bottom;i++){
  847. this.hideGrid(j,i);
  848. }
  849. }
  850. }
  851. }
  852. if (this._mapRect.top > this._mapLastRect.top){
  853. tSub=this._mapRect.top-this._mapLastRect.top;
  854. if (tSub > 0){
  855. for (i=this._mapLastRect.top;i < this._mapLastRect.top+tSub;i++){
  856. for (j=this._mapLastRect.left;j <=this._mapLastRect.right;j++){
  857. this.hideGrid(j,i);
  858. }
  859. }
  860. }
  861. }
  862. else {
  863. tAdd=Math.min(this._mapLastRect.top,this._mapRect.bottom+1)-this._mapRect.top;
  864. if (tAdd > 0){
  865. for (i=this._mapRect.top;i < this._mapRect.top+tAdd;i++){
  866. for (j=this._mapRect.left;j <=this._mapRect.right;j++){
  867. this.showGrid(j,i);
  868. }
  869. }
  870. }
  871. }
  872. if (this._mapRect.bottom > this._mapLastRect.bottom){
  873. tAdd=this._mapRect.bottom-this._mapLastRect.bottom;
  874. if (tAdd > 0){
  875. for (i=Math.max(this._mapLastRect.bottom+1,this._mapRect.top);i <=this._mapLastRect.bottom+tAdd;i++){
  876. for (j=this._mapRect.left;j <=this._mapRect.right;j++){
  877. this.showGrid(j,i);
  878. }
  879. }
  880. }
  881. }
  882. else {
  883. tSub=this._mapLastRect.bottom-this._mapRect.bottom
  884. if (tSub > 0){
  885. for (i=this._mapRect.bottom+1;i <=this._mapRect.bottom+tSub;i++){
  886. for (j=this._mapLastRect.left;j <=this._mapLastRect.right;j++){
  887. this.hideGrid(j,i);
  888. }
  889. }
  890. }
  891. }
  892. }
  893. /**
  894. *显示指定的GRID
  895. *@param gridX
  896. *@param gridY
  897. */
  898. __proto.showGrid=function(gridX,gridY){
  899. if (gridX < 0 || gridX >=this._gridW || gridY < 0 || gridY >=this._gridH){
  900. return;
  901. };
  902. var i=0,j=0;
  903. var tGridSprite;
  904. var tTempArray=this._gridArray[gridY][gridX];
  905. if (tTempArray==null){
  906. tTempArray=this.getGridArray(gridX,gridY);
  907. }
  908. else {
  909. for (i=0;i < tTempArray.length && i < this._layerArray.length;i++){
  910. var tLayerSprite=this._layerArray[i];
  911. if (tLayerSprite && tTempArray[i]){
  912. tGridSprite=tTempArray[i];
  913. if (tGridSprite._visible==false && tGridSprite.drawImageNum > 0){
  914. tGridSprite.show();
  915. }
  916. }
  917. }
  918. }
  919. }
  920. __proto.cacheAllGrid=function(){
  921. var i=0,j=0;
  922. var tempArr;
  923. for (i=0;i < this._gridW;i++){
  924. for (j=0;j < this._gridH;j++){
  925. tempArr=this.getGridArray(i,j);
  926. this.cacheGridsArray(tempArr);
  927. }
  928. }
  929. }
  930. __proto.cacheGridsArray=function(arr){
  931. var canvas;
  932. if (!TiledMap._tempCanvas){
  933. TiledMap._tempCanvas=new HTMLCanvas();
  934. var tx=TiledMap._tempCanvas.context;
  935. if (!tx){
  936. tx=TiledMap._tempCanvas.getContext('2d');
  937. tx.__tx=0;
  938. tx.__ty=0;
  939. }
  940. }
  941. canvas=TiledMap._tempCanvas;
  942. canvas.context.asBitmap=false;
  943. var i=0,len=0;
  944. len=arr.length;
  945. var tGrid;
  946. for (i=0;i < len;i++){
  947. tGrid=arr[i];
  948. canvas.clear();
  949. canvas.size(1,1);
  950. tGrid.render(canvas.context,0,0);
  951. tGrid.hide();
  952. }
  953. canvas.clear();
  954. canvas.size(1,1);
  955. }
  956. __proto.getGridArray=function(gridX,gridY){
  957. var i=0,j=0;
  958. var tGridSprite;
  959. var tTempArray=this._gridArray[gridY][gridX];
  960. if (tTempArray==null){
  961. tTempArray=this._gridArray[gridY][gridX]=[];
  962. var tLeft=0;
  963. var tRight=0;
  964. var tTop=0;
  965. var tBottom=0;
  966. var tGridWidth=this._gridWidth;
  967. var tGridHeight=this._gridHeight;
  968. switch (this.orientation){
  969. case /*CLASS CONST:laya.map.TiledMap.ORIENTATION_ISOMETRIC*/"isometric":
  970. tLeft=Math.floor(gridX *tGridWidth);
  971. tRight=Math.floor(gridX *tGridWidth+tGridWidth);
  972. tTop=Math.floor(gridY *tGridHeight);
  973. tBottom=Math.floor(gridY *tGridHeight+tGridHeight);
  974. var tLeft1=0,tRight1=0,tTop1=0,tBottom1=0;
  975. break ;
  976. case /*CLASS CONST:laya.map.TiledMap.ORIENTATION_STAGGERED*/"staggered":
  977. tLeft=Math.floor(gridX *tGridWidth / this._mapTileW);
  978. tRight=Math.floor((gridX *tGridWidth+tGridWidth)/ this._mapTileW);
  979. tTop=Math.floor(gridY *tGridHeight / (this._mapTileH / 2));
  980. tBottom=Math.floor((gridY *tGridHeight+tGridHeight)/ (this._mapTileH / 2));
  981. break ;
  982. case /*CLASS CONST:laya.map.TiledMap.ORIENTATION_ORTHOGONAL*/"orthogonal":
  983. tLeft=Math.floor(gridX *tGridWidth / this._mapTileW);
  984. tRight=Math.floor((gridX *tGridWidth+tGridWidth)/ this._mapTileW);
  985. tTop=Math.floor(gridY *tGridHeight / this._mapTileH);
  986. tBottom=Math.floor((gridY *tGridHeight+tGridHeight)/ this._mapTileH);
  987. break ;
  988. case /*CLASS CONST:laya.map.TiledMap.ORIENTATION_HEXAGONAL*/"hexagonal":;
  989. var tHeight=this._mapTileH *2 / 3;
  990. tLeft=Math.floor(gridX *tGridWidth / this._mapTileW);
  991. tRight=Math.ceil((gridX *tGridWidth+tGridWidth)/ this._mapTileW);
  992. tTop=Math.floor(gridY *tGridHeight / tHeight);
  993. tBottom=Math.ceil((gridY *tGridHeight+tGridHeight)/ tHeight);
  994. break ;
  995. };
  996. var tLayer=null;
  997. var tTGridSprite;
  998. var tDrawMapLayer;
  999. for (var z=0;z < this._layerArray.length;z++){
  1000. tLayer=this._layerArray[z];
  1001. if (this.enableMergeLayer){
  1002. if (tLayer.tarLayer !=tDrawMapLayer){
  1003. tTGridSprite=null;
  1004. tDrawMapLayer=tLayer.tarLayer;
  1005. }
  1006. if (!tTGridSprite){
  1007. tTGridSprite=tDrawMapLayer.getDrawSprite(gridX,gridY);
  1008. tTempArray.push(tTGridSprite);
  1009. }
  1010. tGridSprite=tTGridSprite;
  1011. }
  1012. else {
  1013. tGridSprite=tLayer.getDrawSprite(gridX,gridY);
  1014. tTempArray.push(tGridSprite);
  1015. };
  1016. var tColorStr;
  1017. if (this._showGridKey){
  1018. tColorStr="#";
  1019. tColorStr+=this._colorArray[Math.floor(Math.random()*this._colorArray.length)];
  1020. tColorStr+=this._colorArray[Math.floor(Math.random()*this._colorArray.length)];
  1021. tColorStr+=this._colorArray[Math.floor(Math.random()*this._colorArray.length)];
  1022. }
  1023. switch (this.orientation){
  1024. case /*CLASS CONST:laya.map.TiledMap.ORIENTATION_ISOMETRIC*/"isometric":;
  1025. var tHalfTileHeight=this.tileHeight / 2;
  1026. var tHalfTileWidth=this.tileWidth / 2;
  1027. var tHalfMapWidth=this._width / 2;
  1028. tTop1=Math.floor(tTop / tHalfTileHeight);
  1029. tBottom1=Math.floor(tBottom / tHalfTileHeight);
  1030. tLeft1=this._mapW+Math.floor((tLeft-tHalfMapWidth)/ tHalfTileWidth);
  1031. tRight1=this._mapW+Math.floor((tRight-tHalfMapWidth)/ tHalfTileWidth);
  1032. var tMapW=this._mapW *2;
  1033. var tMapH=this._mapH *2;
  1034. if (tTop1 < 0){
  1035. tTop1=0;
  1036. }
  1037. if (tTop1 >=tMapH){
  1038. tTop1=tMapH-1;
  1039. }
  1040. if (tBottom1 < 0){
  1041. tBottom=0;
  1042. }
  1043. if (tBottom1 >=tMapH){
  1044. tBottom1=tMapH-1;
  1045. }
  1046. tGridSprite.zOrder=this._totalGridNum *z+gridY *this._gridW+gridX;
  1047. for (i=tTop1;i < tBottom1;i++){
  1048. for (j=0;j <=i;j++){
  1049. var tIndexX=i-j;
  1050. var tIndexY=j;
  1051. var tIndexValue=(tIndexX-tIndexY)+this._mapW;
  1052. if (tIndexValue > tLeft1 && tIndexValue <=tRight1){
  1053. if (tLayer.drawTileTexture(tGridSprite,tIndexX,tIndexY)){
  1054. tGridSprite.drawImageNum++;
  1055. }
  1056. }
  1057. }
  1058. }
  1059. break ;
  1060. case /*CLASS CONST:laya.map.TiledMap.ORIENTATION_STAGGERED*/"staggered":
  1061. tGridSprite.zOrder=z *this._totalGridNum+gridY *this._gridW+gridX;
  1062. for (i=tTop;i < tBottom;i++){
  1063. for (j=tLeft;j < tRight;j++){
  1064. if (tLayer.drawTileTexture(tGridSprite,j,i)){
  1065. tGridSprite.drawImageNum++;
  1066. }
  1067. }
  1068. }
  1069. break ;
  1070. case /*CLASS CONST:laya.map.TiledMap.ORIENTATION_ORTHOGONAL*/"orthogonal":
  1071. case /*CLASS CONST:laya.map.TiledMap.ORIENTATION_HEXAGONAL*/"hexagonal":
  1072. switch (this._renderOrder){
  1073. case "right-down":
  1074. tGridSprite.zOrder=z *this._totalGridNum+gridY *this._gridW+gridX;
  1075. for (i=tTop;i < tBottom;i++){
  1076. for (j=tLeft;j < tRight;j++){
  1077. if (tLayer.drawTileTexture(tGridSprite,j,i)){
  1078. tGridSprite.drawImageNum++;
  1079. }
  1080. }
  1081. }
  1082. break ;
  1083. case "right-up":
  1084. tGridSprite.zOrder=z *this._totalGridNum+(this._gridH-1-gridY)*this._gridW+gridX;
  1085. for (i=tBottom-1;i >=tTop;i--){
  1086. for (j=tLeft;j < tRight;j++){
  1087. if (tLayer.drawTileTexture(tGridSprite,j,i)){
  1088. tGridSprite.drawImageNum++;
  1089. }
  1090. }
  1091. }
  1092. break ;
  1093. case "left-down":
  1094. tGridSprite.zOrder=z *this._totalGridNum+gridY *this._gridW+(this._gridW-1-gridX);
  1095. for (i=tTop;i < tBottom;i++){
  1096. for (j=tRight-1;j >=tLeft;j--){
  1097. if (tLayer.drawTileTexture(tGridSprite,j,i)){
  1098. tGridSprite.drawImageNum++;
  1099. }
  1100. }
  1101. }
  1102. break ;
  1103. case "left-up":
  1104. tGridSprite.zOrder=z *this._totalGridNum+(this._gridH-1-gridY)*this._gridW+(this._gridW-1-gridX);
  1105. for (i=tBottom-1;i >=tTop;i--){
  1106. for (j=tRight-1;j >=tLeft;j--){
  1107. if (tLayer.drawTileTexture(tGridSprite,j,i)){
  1108. tGridSprite.drawImageNum++;
  1109. }
  1110. }
  1111. }
  1112. break ;
  1113. }
  1114. break ;
  1115. }
  1116. if (!tGridSprite.isHaveAnimation){
  1117. tGridSprite.autoSize=true;
  1118. if (this.autoCache)
  1119. tGridSprite.cacheAs=this.autoCacheType;
  1120. tGridSprite.autoSize=false;
  1121. }
  1122. if (!this.enableMergeLayer){
  1123. if (tGridSprite.drawImageNum > 0){
  1124. tLayer.addChild(tGridSprite);
  1125. }
  1126. if (this._showGridKey){
  1127. tGridSprite.graphics.drawRect(0,0,tGridWidth,tGridHeight,null,tColorStr);
  1128. }
  1129. }else{
  1130. if (tTGridSprite && tTGridSprite.drawImageNum > 0&&tDrawMapLayer){
  1131. tDrawMapLayer.addChild(tTGridSprite);
  1132. }
  1133. }
  1134. }
  1135. if (this.enableMergeLayer&&this.showGridTextureCount){
  1136. if (tTGridSprite){
  1137. tTGridSprite.graphics.fillText(tTGridSprite.drawImageNum+"",20,20,null,"#ff0000","left");
  1138. }
  1139. }
  1140. }
  1141. return tTempArray;
  1142. }
  1143. /**
  1144. *隐藏指定的GRID
  1145. *@param gridX
  1146. *@param gridY
  1147. */
  1148. __proto.hideGrid=function(gridX,gridY){
  1149. if (gridX < 0 || gridX >=this._gridW || gridY < 0 || gridY >=this._gridH){
  1150. return;
  1151. };
  1152. var tTempArray=this._gridArray[gridY][gridX];
  1153. if (tTempArray){
  1154. var tGridSprite;
  1155. for (var i=0;i < tTempArray.length;i++){
  1156. tGridSprite=tTempArray[i];
  1157. if (tGridSprite.drawImageNum > 0){
  1158. if (tGridSprite !=null){
  1159. tGridSprite.hide();
  1160. }
  1161. }
  1162. }
  1163. }
  1164. }
  1165. /**
  1166. *得到对象层上的某一个物品
  1167. *@param layerName 层的名称
  1168. *@param objectName 所找物品的名称
  1169. *@return
  1170. */
  1171. __proto.getLayerObject=function(layerName,objectName){
  1172. var tLayer=null;
  1173. for (var i=0;i < this._layerArray.length;i++){
  1174. tLayer=this._layerArray[i];
  1175. if (tLayer.layerName==layerName){
  1176. break ;
  1177. }
  1178. }
  1179. if (tLayer){
  1180. return tLayer.getObjectByName(objectName);
  1181. }
  1182. return null;
  1183. }
  1184. /**
  1185. *销毁地图
  1186. */
  1187. __proto.destroy=function(){
  1188. this._orientation="orthogonal";
  1189. this._jsonData=null;
  1190. var i=0;
  1191. var j=0;
  1192. var z=0;
  1193. this._gridArray=[];
  1194. var tTileTexSet;
  1195. for (i=0;i < this._tileTexSetArr.length;i++){
  1196. tTileTexSet=this._tileTexSetArr[i];
  1197. if (tTileTexSet){
  1198. tTileTexSet.clearAll();
  1199. }
  1200. }
  1201. this._tileTexSetArr=[];
  1202. var tTexture;
  1203. for (i=0;i < this._texArray.length;i++){
  1204. tTexture=this._texArray[i];
  1205. tTexture.destroy();
  1206. }
  1207. this._texArray=[];
  1208. this._width=0;
  1209. this._height=0;
  1210. this._mapW=0;
  1211. this._mapH=0;
  1212. this._mapTileW=0;
  1213. this._mapTileH=0;
  1214. this._rect.setTo(0,0,0,0);
  1215. var tLayer;
  1216. for (i=0;i < this._layerArray.length;i++){
  1217. tLayer=this._layerArray[i];
  1218. tLayer.clearAll();
  1219. }
  1220. this._layerArray=[];
  1221. this._renderLayerArray=[];
  1222. if (this._mapSprite){
  1223. this._mapSprite.destroy();
  1224. this._mapSprite=null;
  1225. }
  1226. this._jsonLoader=null;
  1227. this._loader=null;
  1228. var tDic=this._animationDic;
  1229. for (var p in tDic){
  1230. delete tDic[p];
  1231. }
  1232. this._properties=null;
  1233. tDic=this._tileProperties;
  1234. for (p in tDic){
  1235. delete tDic[p];
  1236. }
  1237. this._currTileSet=null;
  1238. this._completeHandler=null;
  1239. this._mapRect.clearAll();
  1240. this._mapLastRect.clearAll();
  1241. this._tileSetArray=[];
  1242. this._gridWidth=450;
  1243. this._gridHeight=450;
  1244. this._gridW=0;
  1245. this._gridH=0;
  1246. this._x=0;
  1247. this._y=0;
  1248. this._index=0;
  1249. this._enableLinear=true;
  1250. this._resPath=null;
  1251. this._pathArray=null;
  1252. }
  1253. /**
  1254. *整个地图的显示容器
  1255. *@return 地图的显示容器
  1256. */
  1257. __proto.mapSprite=function(){
  1258. return this._mapSprite;
  1259. }
  1260. /**
  1261. *得到指定的MapLayer
  1262. *@param layerName 要找的层名称
  1263. *@return
  1264. */
  1265. __proto.getLayerByName=function(layerName){
  1266. var tMapLayer;
  1267. for (var i=0;i < this._layerArray.length;i++){
  1268. tMapLayer=this._layerArray[i];
  1269. if (layerName==tMapLayer.layerName){
  1270. return tMapLayer;
  1271. }
  1272. }
  1273. return null;
  1274. }
  1275. /**
  1276. *通过索引得MapLayer
  1277. *@param index 要找的层索引
  1278. *@return
  1279. */
  1280. __proto.getLayerByIndex=function(index){
  1281. if (index < this._layerArray.length){
  1282. return this._layerArray[index];
  1283. }
  1284. return null;
  1285. }
  1286. /**
  1287. *当前地图类型
  1288. */
  1289. __getset(0,__proto,'orientation',function(){
  1290. return this._orientation;
  1291. });
  1292. /**
  1293. *@private
  1294. *视口x坐标
  1295. */
  1296. __getset(0,__proto,'viewPortX',function(){
  1297. return-this._viewPortX;
  1298. });
  1299. /**
  1300. *设置地图缩放
  1301. *@param scale
  1302. */
  1303. /**
  1304. *得到当前地图的缩放
  1305. */
  1306. __getset(0,__proto,'scale',function(){
  1307. return this._scale;
  1308. },function(scale){
  1309. if (scale <=0)
  1310. return;
  1311. this._scale=scale;
  1312. this._viewPortWidth=this._rect.width / scale;
  1313. this._viewPortHeight=this._rect.height / scale;
  1314. this._mapSprite.scale(this._scale,this._scale);
  1315. this.updateViewPort();
  1316. });
  1317. /**
  1318. *格子的宽度
  1319. */
  1320. __getset(0,__proto,'tileWidth',function(){
  1321. return this._mapTileW;
  1322. });
  1323. /**
  1324. *@private
  1325. *视口的y坐标
  1326. */
  1327. __getset(0,__proto,'viewPortY',function(){
  1328. return-this._viewPortY;
  1329. });
  1330. /**
  1331. *格子的高度
  1332. */
  1333. __getset(0,__proto,'tileHeight',function(){
  1334. return this._mapTileH;
  1335. });
  1336. /**
  1337. *地图的宽度
  1338. */
  1339. __getset(0,__proto,'width',function(){
  1340. return this._width;
  1341. });
  1342. /**
  1343. *地图竖向的格子数
  1344. */
  1345. __getset(0,__proto,'numRowsTile',function(){
  1346. return this._mapH;
  1347. });
  1348. /**
  1349. *地图横向的格子数
  1350. */
  1351. __getset(0,__proto,'numColumnsTile',function(){
  1352. return this._mapW;
  1353. });
  1354. /**
  1355. *地图的高度
  1356. */
  1357. __getset(0,__proto,'height',function(){
  1358. return this._height;
  1359. });
  1360. /**
  1361. *@private
  1362. *视口的宽度
  1363. */
  1364. __getset(0,__proto,'viewPortWidth',function(){
  1365. return this._viewPortWidth;
  1366. });
  1367. /**
  1368. *@private
  1369. *视口的高度
  1370. */
  1371. __getset(0,__proto,'viewPortHeight',function(){
  1372. return this._viewPortHeight;
  1373. });
  1374. /**
  1375. *地图的x坐标
  1376. */
  1377. __getset(0,__proto,'x',function(){
  1378. return this._x;
  1379. });
  1380. /**
  1381. *地图的y坐标
  1382. */
  1383. __getset(0,__proto,'y',function(){
  1384. return this._y;
  1385. });
  1386. /**
  1387. *块的宽度
  1388. */
  1389. __getset(0,__proto,'gridWidth',function(){
  1390. return this._gridWidth;
  1391. });
  1392. /**
  1393. *块的高度
  1394. */
  1395. __getset(0,__proto,'gridHeight',function(){
  1396. return this._gridHeight;
  1397. });
  1398. /**
  1399. *地图的横向块数
  1400. */
  1401. __getset(0,__proto,'numColumnsGrid',function(){
  1402. return this._gridW;
  1403. });
  1404. /**
  1405. *地图的坚向块数
  1406. */
  1407. __getset(0,__proto,'numRowsGrid',function(){
  1408. return this._gridH;
  1409. });
  1410. /**
  1411. *tile渲染顺序
  1412. */
  1413. __getset(0,__proto,'renderOrder',function(){
  1414. return this._renderOrder;
  1415. });
  1416. TiledMap.ORIENTATION_ORTHOGONAL="orthogonal";
  1417. TiledMap.ORIENTATION_ISOMETRIC="isometric";
  1418. TiledMap.ORIENTATION_STAGGERED="staggered";
  1419. TiledMap.ORIENTATION_HEXAGONAL="hexagonal";
  1420. TiledMap.RENDERORDER_RIGHTDOWN="right-down";
  1421. TiledMap.RENDERORDER_RIGHTUP="right-up";
  1422. TiledMap.RENDERORDER_LEFTDOWN="left-down";
  1423. TiledMap.RENDERORDER_LEFTUP="left-up";
  1424. TiledMap._tempCanvas=null;
  1425. TiledMap.__init$=function(){
  1426. //class GRect
  1427. GRect=(function(){
  1428. function GRect(){
  1429. this.left=0;
  1430. this.top=0;
  1431. this.right=0;
  1432. this.bottom=0;
  1433. }
  1434. __class(GRect,'');
  1435. var __proto=GRect.prototype;
  1436. __proto.clearAll=function(){
  1437. this.left=this.top=this.right=this.bottom=0;
  1438. }
  1439. return GRect;
  1440. })()
  1441. //class TileMapAniData
  1442. TileMapAniData=(function(){
  1443. function TileMapAniData(){
  1444. this.mAniIdArray=[];
  1445. this.mDurationTimeArray=[];
  1446. this.mTileTexSetArr=[];
  1447. this.image=null;
  1448. }
  1449. __class(TileMapAniData,'');
  1450. return TileMapAniData;
  1451. })()
  1452. //class TileSet
  1453. TileSet=(function(){
  1454. function TileSet(){
  1455. this.firstgid=0;
  1456. this.image="";
  1457. this.imageheight=0;
  1458. this.imagewidth=0;
  1459. this.margin=0;
  1460. this.name=0;
  1461. this.properties=null;
  1462. this.spacing=0;
  1463. this.tileheight=0;
  1464. this.tilewidth=0;
  1465. this.titleoffsetX=0;
  1466. this.titleoffsetY=0;
  1467. this.tileproperties=null;
  1468. }
  1469. __class(TileSet,'');
  1470. var __proto=TileSet.prototype;
  1471. __proto.init=function(data){
  1472. this.firstgid=data.firstgid;
  1473. this.image=data.image;
  1474. this.imageheight=data.imageheight;
  1475. this.imagewidth=data.imagewidth;
  1476. this.margin=data.margin;
  1477. this.name=data.name;
  1478. this.properties=data.properties;
  1479. this.spacing=data.spacing;
  1480. this.tileheight=data.tileheight;
  1481. this.tilewidth=data.tilewidth;
  1482. this.tileproperties=data.tileproperties;
  1483. var tTileoffset=data.tileoffset;
  1484. if (tTileoffset){
  1485. this.titleoffsetX=tTileoffset.x;
  1486. this.titleoffsetY=tTileoffset.y;
  1487. }
  1488. }
  1489. return TileSet;
  1490. })()
  1491. }
  1492. return TiledMap;
  1493. })()
  1494. /**
  1495. *地图的每层都会分块渲染处理
  1496. *本类就是地图的块数据
  1497. *@author ...
  1498. */
  1499. //class laya.map.GridSprite extends laya.display.Sprite
  1500. var GridSprite=(function(_super){
  1501. function GridSprite(){
  1502. /**相对于地图X轴的坐标*/
  1503. this.relativeX=0;
  1504. /**相对于地图Y轴的坐标*/
  1505. this.relativeY=0;
  1506. /**是否用于对象层的独立物件*/
  1507. this.isAloneObject=false;
  1508. /**当前GRID中是否有动画*/
  1509. this.isHaveAnimation=false;
  1510. /**当前GRID包含的动画*/
  1511. this.aniSpriteArray=null;
  1512. /**当前GRID包含多少个TILE(包含动画)*/
  1513. this.drawImageNum=0;
  1514. this._map=null;
  1515. GridSprite.__super.call(this);
  1516. }
  1517. __class(GridSprite,'laya.map.GridSprite',_super);
  1518. var __proto=GridSprite.prototype;
  1519. /**
  1520. *传入必要的参数,用于裁剪,跟确认此对象类型
  1521. *@param map 把地图的引用传进来,参与一些裁剪计算
  1522. *@param objectKey true:表示当前GridSprite是个活动对象,可以控制,false:地图层的组成块
  1523. */
  1524. __proto.initData=function(map,objectKey){
  1525. (objectKey===void 0)&& (objectKey=false);
  1526. this._map=map;
  1527. this.isAloneObject=objectKey;
  1528. }
  1529. /**
  1530. *把一个动画对象绑定到当前GridSprite
  1531. *@param sprite 动画的显示对象
  1532. */
  1533. __proto.addAniSprite=function(sprite){
  1534. if (this.aniSpriteArray==null){
  1535. this.aniSpriteArray=[];
  1536. }
  1537. this.aniSpriteArray.push(sprite);
  1538. }
  1539. /**
  1540. *显示当前GridSprite,并把上面的动画全部显示
  1541. */
  1542. __proto.show=function(){
  1543. if (!this._visible){
  1544. this.visible=true;
  1545. if (this.aniSpriteArray==null){
  1546. return;
  1547. };
  1548. var tAniSprite;
  1549. for (var i=0;i < this.aniSpriteArray.length;i++){
  1550. tAniSprite=this.aniSpriteArray[i];
  1551. tAniSprite.show();
  1552. }
  1553. }
  1554. }
  1555. /**
  1556. *隐藏当前GridSprite,并把上面绑定的动画全部移除
  1557. */
  1558. __proto.hide=function(){
  1559. if (this._visible){
  1560. this.visible=false;
  1561. if (this.aniSpriteArray==null){
  1562. return;
  1563. };
  1564. var tAniSprite;
  1565. for (var i=0;i < this.aniSpriteArray.length;i++){
  1566. tAniSprite=this.aniSpriteArray[i];
  1567. tAniSprite.hide();
  1568. }
  1569. }
  1570. }
  1571. /**
  1572. *刷新坐标,当我们自己控制一个GridSprite移动时,需要调用此函数,手动刷新
  1573. */
  1574. __proto.updatePos=function(){
  1575. if (this.isAloneObject){
  1576. if (this._map){
  1577. this.x=this.relativeX-this._map._viewPortX;
  1578. this.y=this.relativeY-this._map._viewPortY;
  1579. }
  1580. if (this._x < 0 || this._x > this._map.viewPortWidth || this._y < 0 || this._y > this._map.viewPortHeight){
  1581. this.hide();
  1582. }else {
  1583. this.show();
  1584. }
  1585. }else {
  1586. if (this._map){
  1587. this.x=this.relativeX-this._map._viewPortX;
  1588. this.y=this.relativeY-this._map._viewPortY;
  1589. }
  1590. }
  1591. }
  1592. /**
  1593. *重置当前对象的所有属性
  1594. */
  1595. __proto.clearAll=function(){
  1596. if (this._map){
  1597. this._map=null;
  1598. }
  1599. this.visible=false;
  1600. var tAniSprite;
  1601. if (this.aniSpriteArray !=null){
  1602. for (var i=0;i < this.aniSpriteArray.length;i++){
  1603. tAniSprite=this.aniSpriteArray[i];
  1604. tAniSprite.clearAll();
  1605. }
  1606. }
  1607. this.destroy();
  1608. this.relativeX=0;
  1609. this.relativeY=0;
  1610. this.isHaveAnimation=false;
  1611. this.aniSpriteArray=null;
  1612. this.drawImageNum=0;
  1613. }
  1614. return GridSprite;
  1615. })(Sprite)
  1616. /**
  1617. *地图支持多层渲染(例如,地表层,植被层,建筑层等)
  1618. *本类就是层级类
  1619. *@author ...
  1620. */
  1621. //class laya.map.MapLayer extends laya.display.Sprite
  1622. var MapLayer=(function(_super){
  1623. function MapLayer(){
  1624. this._map=null;
  1625. this._mapData=null;
  1626. this._tileWidthHalf=0;
  1627. this._tileHeightHalf=0;
  1628. this._mapWidthHalf=0;
  1629. this._mapHeightHalf=0;
  1630. /**
  1631. *@private
  1632. */
  1633. this._gridSpriteArray=[];
  1634. this._objDic=null;
  1635. //用来做字典,方便查询
  1636. this._dataDic=null;
  1637. //临时变量
  1638. this._properties=null;
  1639. /**被合到的层*/
  1640. this.tarLayer=null;
  1641. /**当前Layer的名称*/
  1642. this.layerName=null;
  1643. MapLayer.__super.call(this);
  1644. this._tempMapPos=new Point();
  1645. }
  1646. __class(MapLayer,'laya.map.MapLayer',_super);
  1647. var __proto=MapLayer.prototype;
  1648. /**
  1649. *解析LAYER数据,以及初始化一些数据
  1650. *@param layerData 地图数据中,layer数据的引用
  1651. *@param map 地图的引用
  1652. */
  1653. __proto.init=function(layerData,map){
  1654. this._map=map;
  1655. this._mapData=layerData.data;
  1656. var tHeight=layerData.height;
  1657. var tWidth=layerData.width;
  1658. var tTileW=map.tileWidth;
  1659. var tTileH=map.tileHeight;
  1660. this.layerName=layerData.name;
  1661. this._properties=layerData.properties;
  1662. this.alpha=layerData.opacity;
  1663. this._tileWidthHalf=tTileW / 2;
  1664. this._tileHeightHalf=tTileH / 2;
  1665. this._mapWidthHalf=this._map.width / 2-this._tileWidthHalf;
  1666. this._mapHeightHalf=this._map.height / 2;
  1667. switch (layerData.type){
  1668. case "tilelayer":
  1669. break ;
  1670. case "objectgroup":;
  1671. var tObjectGid=0;
  1672. var tArray=layerData.objects;
  1673. if (tArray.length > 0){
  1674. this._objDic={};
  1675. this._dataDic={};
  1676. };
  1677. var tObjectData;
  1678. var tObjWidth=NaN;
  1679. var tObjHeight=NaN;
  1680. for (var i=0;i < tArray.length;i++){
  1681. tObjectData=tArray[i];
  1682. this._dataDic[tObjectData.name]=tObjectData;
  1683. if (tObjectData.visible==true){
  1684. tObjWidth=tObjectData.width;
  1685. tObjHeight=tObjectData.height;
  1686. var tSprite=map.getSprite(tObjectData.gid,tObjWidth,tObjHeight);
  1687. if (tSprite !=null){
  1688. switch (this._map.orientation){
  1689. case /*laya.map.TiledMap.ORIENTATION_ISOMETRIC*/"isometric":
  1690. this.getScreenPositionByTilePos(tObjectData.x / tTileH,tObjectData.y / tTileH,Point.TEMP);
  1691. tSprite.pivot(tObjWidth / 2,tObjHeight / 2);
  1692. tSprite.rotation=tObjectData.rotation;
  1693. tSprite.x=tSprite.relativeX=Point.TEMP.x+this._map.viewPortX;
  1694. tSprite.y=tSprite.relativeY=Point.TEMP.y+this._map.viewPortY-tObjHeight / 2;
  1695. break ;
  1696. case /*laya.map.TiledMap.ORIENTATION_STAGGERED*/"staggered":
  1697. tSprite.pivot(tObjWidth / 2,tObjHeight / 2);
  1698. tSprite.rotation=tObjectData.rotation;
  1699. tSprite.x=tSprite.relativeX=tObjectData.x+tObjWidth / 2;
  1700. tSprite.y=tSprite.relativeY=tObjectData.y-tObjHeight / 2;
  1701. break ;
  1702. case /*laya.map.TiledMap.ORIENTATION_ORTHOGONAL*/"orthogonal":
  1703. tSprite.pivot(tObjWidth / 2,tObjHeight / 2);
  1704. tSprite.rotation=tObjectData.rotation;
  1705. tSprite.x=tSprite.relativeX=tObjectData.x+tObjWidth / 2;
  1706. tSprite.y=tSprite.relativeY=tObjectData.y-tObjHeight / 2;
  1707. break ;
  1708. case /*laya.map.TiledMap.ORIENTATION_HEXAGONAL*/"hexagonal":
  1709. tSprite.x=tSprite.relativeX=tObjectData.x;
  1710. tSprite.y=tSprite.relativeY=tObjectData.y;
  1711. break ;
  1712. }
  1713. this.addChild(tSprite);
  1714. this._gridSpriteArray.push(tSprite);
  1715. this._objDic[tObjectData.name]=tSprite;
  1716. }
  1717. }
  1718. }
  1719. break ;
  1720. }
  1721. }
  1722. /**
  1723. *通过名字获取控制对象,如果找不到返回为null
  1724. *@param objName 所要获取对象的名字
  1725. *@return
  1726. */
  1727. __proto.getObjectByName=function(objName){
  1728. if (this._objDic){
  1729. return this._objDic[objName];
  1730. }
  1731. return null;
  1732. }
  1733. /**
  1734. *通过名字获取数据,如果找不到返回为null
  1735. *@param objName 所要获取对象的名字
  1736. *@return
  1737. */
  1738. __proto.getObjectDataByName=function(objName){
  1739. if (this._dataDic){
  1740. return this._dataDic[objName];
  1741. }
  1742. return null;
  1743. }
  1744. /**
  1745. *得到地图层的自定义属性
  1746. *@param name
  1747. *@return
  1748. */
  1749. __proto.getLayerProperties=function(name){
  1750. if (this._properties){
  1751. return this._properties[name];
  1752. }
  1753. return null;
  1754. }
  1755. /**
  1756. *得到指定格子的数据
  1757. *@param tileX 格子坐标X
  1758. *@param tileY 格子坐标Y
  1759. *@return
  1760. */
  1761. __proto.getTileData=function(tileX,tileY){
  1762. if (tileY >=0 && tileY < this._map.numRowsTile && tileX >=0 && tileX < this._map.numColumnsTile){
  1763. var tIndex=tileY *this._map.numColumnsTile+tileX;
  1764. var tMapData=this._mapData;
  1765. if (tMapData !=null && tIndex < tMapData.length){
  1766. return tMapData[tIndex];
  1767. }
  1768. }
  1769. return 0;
  1770. }
  1771. /**
  1772. *通过地图坐标得到屏幕坐标
  1773. *@param tileX 格子坐标X
  1774. *@param tileY 格子坐标Y
  1775. *@param screenPos 把计算好的屏幕坐标数据,放到此对象中
  1776. */
  1777. __proto.getScreenPositionByTilePos=function(tileX,tileY,screenPos){
  1778. if (screenPos){
  1779. switch (this._map.orientation){
  1780. case /*laya.map.TiledMap.ORIENTATION_ISOMETRIC*/"isometric":
  1781. screenPos.x=this._map.width / 2-(tileY-tileX)*this._tileWidthHalf;
  1782. screenPos.y=(tileY+tileX)*this._tileHeightHalf;
  1783. break ;
  1784. case /*laya.map.TiledMap.ORIENTATION_STAGGERED*/"staggered":
  1785. tileX=Math.floor(tileX);
  1786. tileY=Math.floor(tileY);
  1787. screenPos.x=tileX *this._map.tileWidth+(tileY & 1)*this._tileWidthHalf;
  1788. screenPos.y=tileY *this._tileHeightHalf;
  1789. break ;
  1790. case /*laya.map.TiledMap.ORIENTATION_ORTHOGONAL*/"orthogonal":
  1791. screenPos.x=tileX *this._map.tileWidth;
  1792. screenPos.y=tileY *this._map.tileHeight;
  1793. break ;
  1794. case /*laya.map.TiledMap.ORIENTATION_HEXAGONAL*/"hexagonal":
  1795. tileX=Math.floor(tileX);
  1796. tileY=Math.floor(tileY);
  1797. var tTileHeight=this._map.tileHeight *2 / 3;
  1798. screenPos.x=(tileX *this._map.tileWidth+tileY % 2 *this._tileWidthHalf)% this._map.gridWidth;
  1799. screenPos.y=(tileY *tTileHeight)% this._map.gridHeight;
  1800. break ;
  1801. }
  1802. screenPos.x=(screenPos.x+this._map.viewPortX)*this._map.scale;
  1803. screenPos.y=(screenPos.y+this._map.viewPortY)*this._map.scale;
  1804. }
  1805. }
  1806. /**
  1807. *通过屏幕坐标来获取选中格子的数据
  1808. *@param screenX 屏幕坐标x
  1809. *@param screenY 屏幕坐标y
  1810. *@return
  1811. */
  1812. __proto.getTileDataByScreenPos=function(screenX,screenY){
  1813. var tData=0;
  1814. if (this.getTilePositionByScreenPos(screenX,screenY,this._tempMapPos)){
  1815. tData=this.getTileData(Math.floor(this._tempMapPos.x),Math.floor(this._tempMapPos.y));
  1816. }
  1817. return tData;
  1818. }
  1819. /**
  1820. *通过屏幕坐标来获取选中格子的索引
  1821. *@param screenX 屏幕坐标x
  1822. *@param screenY 屏幕坐标y
  1823. *@param result 把计算好的格子坐标,放到此对象中
  1824. *@return
  1825. */
  1826. __proto.getTilePositionByScreenPos=function(screenX,screenY,result){
  1827. screenX=screenX/this._map.scale-this._map.viewPortX;
  1828. screenY=screenY/this._map.scale-this._map.viewPortY;
  1829. var tTileW=this._map.tileWidth;
  1830. var tTileH=this._map.tileHeight;
  1831. var tV=0;
  1832. var tU=0;
  1833. switch (this._map.orientation){
  1834. case /*laya.map.TiledMap.ORIENTATION_ISOMETRIC*/"isometric":;
  1835. var tDirX=screenX-this._map.width / 2;
  1836. var tDirY=screenY;
  1837. tV=-(tDirX / tTileW-tDirY / tTileH);
  1838. tU=tDirX / tTileW+tDirY / tTileH;
  1839. if (result){
  1840. result.x=tU;
  1841. result.y=tV;
  1842. }
  1843. return true;
  1844. break ;
  1845. case /*laya.map.TiledMap.ORIENTATION_STAGGERED*/"staggered":
  1846. if (result){
  1847. var cx=0,cy=0,rx=0,ry=0;
  1848. cx=Math.floor(screenX / tTileW)*tTileW+tTileW / 2;
  1849. cy=Math.floor(screenY / tTileH)*tTileH+tTileH / 2;
  1850. rx=(screenX-cx)*tTileH / 2;
  1851. ry=(screenY-cy)*tTileW / 2;
  1852. if (Math.abs(rx)+Math.abs(ry)<=tTileW *tTileH / 4){
  1853. tU=Math.floor(screenX / tTileW);
  1854. tV=Math.floor(screenY / tTileH)*2;
  1855. }else {
  1856. screenX=screenX-tTileW / 2;
  1857. tU=Math.floor(screenX / tTileW)+1;
  1858. screenY=screenY-tTileH / 2;
  1859. tV=Math.floor(screenY / tTileH)*2+1;
  1860. }
  1861. result.x=tU-(tV & 1);
  1862. result.y=tV;
  1863. }
  1864. return true;
  1865. break ;
  1866. case /*laya.map.TiledMap.ORIENTATION_ORTHOGONAL*/"orthogonal":
  1867. tU=screenX / tTileW;
  1868. tV=screenY / tTileH;
  1869. if (result){
  1870. result.x=tU;
  1871. result.y=tV;
  1872. }
  1873. return true;
  1874. break ;
  1875. case /*laya.map.TiledMap.ORIENTATION_HEXAGONAL*/"hexagonal":;
  1876. var tTileHeight=tTileH *2 / 3;
  1877. tV=screenY / tTileHeight;
  1878. tU=(screenX-tV % 2 *this._tileWidthHalf)/ tTileW;
  1879. if (result){
  1880. result.x=tU;
  1881. result.y=tV;
  1882. }
  1883. break ;
  1884. }
  1885. return false;
  1886. }
  1887. /**
  1888. *得到一个GridSprite
  1889. *@param gridX 当前Grid的X轴索引
  1890. *@param gridY 当前Grid的Y轴索引
  1891. *@return 一个GridSprite对象
  1892. */
  1893. __proto.getDrawSprite=function(gridX,gridY){
  1894. var tSprite=new GridSprite();
  1895. tSprite.relativeX=gridX *this._map.gridWidth;
  1896. tSprite.relativeY=gridY *this._map.gridHeight;
  1897. tSprite.initData(this._map);
  1898. this._gridSpriteArray.push(tSprite);
  1899. return tSprite;
  1900. }
  1901. /**
  1902. *更新此层中块的坐标
  1903. *手动刷新的目的是,保持层级的宽和高保持最小,加快渲染
  1904. */
  1905. __proto.updateGridPos=function(){
  1906. var tSprite;
  1907. for (var i=0;i < this._gridSpriteArray.length;i++){
  1908. tSprite=this._gridSpriteArray[i];
  1909. if ((tSprite._visible || tSprite.isAloneObject)&& tSprite.drawImageNum > 0){
  1910. tSprite.updatePos();
  1911. }
  1912. }
  1913. }
  1914. /**
  1915. *@private
  1916. *把tile画到指定的显示对象上
  1917. *@param gridSprite 被指定显示的目标
  1918. *@param tileX 格子的X轴坐标
  1919. *@param tileY 格子的Y轴坐标
  1920. *@return
  1921. */
  1922. __proto.drawTileTexture=function(gridSprite,tileX,tileY){
  1923. if (tileY >=0 && tileY < this._map.numRowsTile && tileX >=0 && tileX < this._map.numColumnsTile){
  1924. var tIndex=tileY *this._map.numColumnsTile+tileX;
  1925. var tMapData=this._mapData;
  1926. if (tMapData !=null && tIndex < tMapData.length){
  1927. if (tMapData[tIndex] !=0){
  1928. var tTileTexSet=this._map.getTexture(tMapData[tIndex]);
  1929. if (tTileTexSet){
  1930. var tX=0;
  1931. var tY=0;
  1932. var tTexture=tTileTexSet.texture;
  1933. switch (this._map.orientation){
  1934. case /*laya.map.TiledMap.ORIENTATION_STAGGERED*/"staggered":
  1935. tX=tileX *this._map.tileWidth % this._map.gridWidth+(tileY & 1)*this._tileWidthHalf;
  1936. tY=tileY *this._tileHeightHalf % this._map.gridHeight;
  1937. break ;
  1938. case /*laya.map.TiledMap.ORIENTATION_ORTHOGONAL*/"orthogonal":
  1939. tX=tileX *this._map.tileWidth % this._map.gridWidth;
  1940. tY=tileY *this._map.tileHeight % this._map.gridHeight;
  1941. break ;
  1942. case /*laya.map.TiledMap.ORIENTATION_ISOMETRIC*/"isometric":
  1943. tX=(this._mapWidthHalf+(tileX-tileY)*this._tileWidthHalf)% this._map.gridWidth;
  1944. tY=((tileX+tileY)*this._tileHeightHalf)% this._map.gridHeight;
  1945. break ;
  1946. case /*laya.map.TiledMap.ORIENTATION_HEXAGONAL*/"hexagonal":;
  1947. var tTileHeight=this._map.tileHeight *2 / 3;
  1948. tX=(tileX *this._map.tileWidth+tileY % 2 *this._tileWidthHalf)% this._map.gridWidth;
  1949. tY=(tileY *tTileHeight)% this._map.gridHeight;
  1950. break ;
  1951. }
  1952. if (tTileTexSet.isAnimation){
  1953. var tAnimationSprite=new TileAniSprite();
  1954. tAnimationSprite.x=tX;
  1955. tAnimationSprite.y=tY;
  1956. tAnimationSprite.setTileTextureSet(tIndex.toString(),tTileTexSet);
  1957. gridSprite.addAniSprite(tAnimationSprite);
  1958. gridSprite.addChild(tAnimationSprite);
  1959. gridSprite.isHaveAnimation=true;
  1960. }else {
  1961. gridSprite.graphics.drawImage(tTileTexSet.texture,tX+tTileTexSet.offX,tY+tTileTexSet.offY);
  1962. }
  1963. return true;
  1964. }
  1965. }
  1966. }
  1967. }
  1968. return false;
  1969. }
  1970. /**
  1971. *@private
  1972. *清理当前对象
  1973. */
  1974. __proto.clearAll=function(){
  1975. this._map=null;
  1976. this._mapData=null;
  1977. this._tileWidthHalf=0;
  1978. this._tileHeightHalf=0;
  1979. this._mapWidthHalf=0;
  1980. this._mapHeightHalf=0;
  1981. this.layerName=null;
  1982. var i=0;
  1983. if (this._objDic){
  1984. for (var p in this._objDic){
  1985. delete this._objDic[p];
  1986. }
  1987. this._objDic=null;
  1988. }
  1989. if (this._dataDic){
  1990. for (p in this._dataDic){
  1991. delete this._dataDic[p];
  1992. }
  1993. this._dataDic=null;
  1994. };
  1995. var tGridSprite;
  1996. for (i=0;i < this._gridSpriteArray.length;i++){
  1997. tGridSprite=this._gridSpriteArray[i];
  1998. tGridSprite.clearAll();
  1999. }
  2000. this._properties=null;
  2001. this._tempMapPos=null;
  2002. this.tarLayer=null;
  2003. }
  2004. return MapLayer;
  2005. })(Sprite)
  2006. /**
  2007. *TildMap的动画显示对象(一个动画(TileTexSet),可以绑定多个动画显示对象(TileAniSprite))
  2008. *@author ...
  2009. */
  2010. //class laya.map.TileAniSprite extends laya.display.Sprite
  2011. var TileAniSprite=(function(_super){
  2012. function TileAniSprite(){
  2013. this._tileTextureSet=null;
  2014. //动画的引用
  2015. this._aniName=null;
  2016. TileAniSprite.__super.call(this);
  2017. }
  2018. __class(TileAniSprite,'laya.map.TileAniSprite',_super);
  2019. var __proto=TileAniSprite.prototype;
  2020. /**
  2021. *确定当前显示对象的名称以及属于哪个动画
  2022. *@param aniName 当前动画显示对象的名字,名字唯一
  2023. *@param tileTextureSet 当前显示对象属于哪个动画(一个动画,可以绑定多个同类显示对象)
  2024. */
  2025. __proto.setTileTextureSet=function(aniName,tileTextureSet){
  2026. this._aniName=aniName;
  2027. this._tileTextureSet=tileTextureSet;
  2028. tileTextureSet.addAniSprite(this._aniName,this);
  2029. }
  2030. /**
  2031. *把当前动画加入到对应的动画刷新列表中
  2032. */
  2033. __proto.show=function(){
  2034. this._tileTextureSet.addAniSprite(this._aniName,this);
  2035. }
  2036. /**
  2037. *把当前动画从对应的动画刷新列表中移除
  2038. */
  2039. __proto.hide=function(){
  2040. this._tileTextureSet.removeAniSprite(this._aniName);
  2041. }
  2042. /**
  2043. *清理
  2044. */
  2045. __proto.clearAll=function(){
  2046. this._tileTextureSet.removeAniSprite(this._aniName);
  2047. this.destroy();
  2048. this._tileTextureSet=null;
  2049. this._aniName=null;
  2050. }
  2051. return TileAniSprite;
  2052. })(Sprite)
  2053. Laya.__init([TiledMap]);
  2054. })(window,document,Laya);