246 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			246 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | /* | ||
|  | 文件名:MapObject.nut | ||
|  | 路径:User/Object/Map/MapObject.nut | ||
|  | 创建日期:2024-11-22	19:40 | ||
|  | 文件用途:地图对象 | ||
|  | */ | ||
|  | class Map extends Actor { | ||
|  |     //图层对象Map | ||
|  |     LayerObject = null; | ||
|  | 
 | ||
|  |     //地图编号 | ||
|  |     m_mapId = 0; | ||
|  |     //数据 | ||
|  |     m_data = null; | ||
|  | 
 | ||
|  |     //地图长度 | ||
|  |     m_length = 0; | ||
|  | 
 | ||
|  |     //初始化图层对象 | ||
|  |     function InitLayer() { | ||
|  |         //图层ObjMap | ||
|  |         LayerObject = { | ||
|  |             contact = Actor(), | ||
|  |             normal = Actor(), | ||
|  |             bottom = Actor(), | ||
|  |             close = Actor(), | ||
|  |             closeback = Actor(), | ||
|  |             middleback = Actor(), | ||
|  |             distantback = Actor(), | ||
|  |             cover = Actor(), | ||
|  |             max = Actor() | ||
|  |         }; | ||
|  |         //把所有图层Obj挂上Map的子对象 | ||
|  |         foreach(LayerObj in LayerObject) { | ||
|  |             Addchild(LayerObj); | ||
|  |         } | ||
|  | 
 | ||
|  |         local FristOrder = 10000; | ||
|  |         //按照层级给Layer设置层级 | ||
|  |         LayerObject.distantback.SetZOrder(FristOrder); | ||
|  |         FristOrder += 50000; | ||
|  |         LayerObject.middleback.SetZOrder(FristOrder); | ||
|  |         FristOrder += 50000; | ||
|  |         LayerObject.bottom.SetZOrder(FristOrder); | ||
|  |         FristOrder += 50000; | ||
|  |         LayerObject.closeback.SetZOrder(FristOrder); | ||
|  |         FristOrder += 50000; | ||
|  |         LayerObject.close.SetZOrder(FristOrder); | ||
|  |         FristOrder += 50000; | ||
|  |         LayerObject.normal.SetZOrder(FristOrder); | ||
|  |         FristOrder += 50000; | ||
|  |         LayerObject.cover.SetZOrder(FristOrder); | ||
|  |         FristOrder += 50000; | ||
|  |         LayerObject.contact.SetZOrder(FristOrder); | ||
|  |         FristOrder += 50000; | ||
|  |         LayerObject.max.SetZOrder(FristOrder); | ||
|  |     }; | ||
|  | 
 | ||
|  |     //初始化数据 | ||
|  |     function InitData(path) { | ||
|  |         m_data = ScriptData.GetFileData(path, function(DataTable, Data) { | ||
|  |             while (!Data.Eof()) { | ||
|  |                 local str = Data.Get(); | ||
|  |                 if (str == "[background pos]") { | ||
|  |                     DataTable.background_pos <- (Data.Get()); | ||
|  |                 } else if (str == "[map name]") { | ||
|  |                     DataTable.name <- Data.Get(); | ||
|  |                 } else if (str == "[tile]") { | ||
|  |                     DataTable.tile <- []; | ||
|  |                     while (true) { | ||
|  |                         local tiledata = Data.Get(); | ||
|  |                         if (tiledata == "[/tile]") break; | ||
|  |                         DataTable.tile.push(tiledata); | ||
|  |                     } | ||
|  |                 } else if (str == "[extended tile]") { | ||
|  |                     DataTable.extended_tile <- []; | ||
|  |                     while (true) { | ||
|  |                         local tiledata = Data.Get(); | ||
|  |                         if (tiledata == "[/extended tile]") break; | ||
|  |                         DataTable.extended_tile.push(tiledata); | ||
|  |                     } | ||
|  |                 } else if (str == "[far sight scroll]") { | ||
|  |                     DataTable.far_sight_scroll <- (Data.Get()); | ||
|  |                 } else if (str == "[background animation]") { | ||
|  |                     DataTable.background_animation <- []; | ||
|  |                     while (true) { | ||
|  |                         local anidata = Data.Get(); | ||
|  |                         if (anidata == "[/background animation]") break; | ||
|  |                         if (anidata == "[ani info]") { | ||
|  |                             local info = {}; | ||
|  |                             Data.Get(); | ||
|  |                             info["filename"] <- Data.Get(); | ||
|  |                             Data.Get(); | ||
|  |                             info["layer"] <- Data.Get().slice(1, -1); | ||
|  |                             Data.Get(); | ||
|  |                             info["order"] <- Data.Get(); | ||
|  |                             DataTable.background_animation.push(info); | ||
|  |                         } | ||
|  |                     } | ||
|  |                 } else if (str == "[sound]") { | ||
|  |                     DataTable.sound <- []; | ||
|  |                     while (true) { | ||
|  |                         local sounddata = Data.Get(); | ||
|  |                         if (sounddata == "[/sound]") break; | ||
|  |                         DataTable.sound.push(sounddata); | ||
|  |                     } | ||
|  |                 } else if (str == "[animation]") { | ||
|  |                     DataTable.animation <- []; | ||
|  |                     while (true) { | ||
|  |                         local anidata = Data.Get(); | ||
|  |                         if (anidata == "[/animation]") break; | ||
|  |                         local info = {}; | ||
|  |                         info["filename"] <- anidata; | ||
|  |                         info["layer"] <- Data.Get().slice(1, -1); | ||
|  |                         info["xpos"] <- Data.Get(); | ||
|  |                         info["ypos"] <- Data.Get(); | ||
|  |                         info["zpos"] <- Data.Get(); | ||
|  |                         DataTable.animation.push(info); | ||
|  |                     } | ||
|  |                 } else if (str == "[NPC]") { | ||
|  |                     DataTable.npc <- []; | ||
|  |                     while (true) { | ||
|  |                         local npcdata = Data.Get(); | ||
|  |                         if (npcdata == "[/NPC]") break; | ||
|  |                         local info = {}; | ||
|  |                         info["id"] <- npcdata; | ||
|  |                         info["direction"] <- Data.Get(); | ||
|  |                         info["xpos"] <- Data.Get(); | ||
|  |                         info["ypos"] <- Data.Get(); | ||
|  |                         info["zpos"] <- Data.Get(); | ||
|  |                         DataTable.npc.push(info); | ||
|  |                     } | ||
|  |                 } else if (str == "[town movable area]") { | ||
|  |                     DataTable.town_movable_area <- []; | ||
|  |                     while (true) { | ||
|  |                         local areadata = Data.Get(); | ||
|  |                         if (areadata == "[/town movable area]") break; | ||
|  |                         local info = []; | ||
|  |                         info.push(areadata); | ||
|  |                         for (local i = 0; i< 5; i++) { | ||
|  |                             info.push(Data.Get()) | ||
|  |                         } | ||
|  |                         DataTable.town_movable_area.push(info); | ||
|  |                     } | ||
|  |                 } else if (str == "[virtual movable area]") { | ||
|  |                     DataTable.virtual_movable_area <- []; | ||
|  |                     while (true) { | ||
|  |                         local areadata = Data.Get(); | ||
|  |                         if (areadata == "[/virtual movable area]") break; | ||
|  |                         local info = []; | ||
|  |                         info.push(areadata); | ||
|  |                         for (local i = 0; i< 3; i++) { | ||
|  |                             info.push(Data.Get()) | ||
|  |                         } | ||
|  |                         DataTable.virtual_movable_area.push(info); | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  |         }); | ||
|  |         m_data.path <- path; | ||
|  |         m_data.dirpath <- path.slice(0, path.lastfind("/") + 1); | ||
|  |     } | ||
|  | 
 | ||
|  |     //初始化地板 | ||
|  |     function InitTile() { | ||
|  |         //普通地板 | ||
|  |         if ("tile" in m_data) { | ||
|  |             foreach(pos, path in m_data.tile) { | ||
|  |                 local realpath = m_data.dirpath + path.tolower(); | ||
|  |                 local TileObj = Tile(realpath); | ||
|  |                 TileObj.SetAnchor(0.0, 0.0); | ||
|  |                 TileObj.SetPosition(pos * 224, 0); | ||
|  |                 LayerObject.bottom.Addchild(TileObj); | ||
|  |                 //计算地图长度 | ||
|  |                 m_length += 224; | ||
|  |             } | ||
|  |         } | ||
|  |         //补充地板 | ||
|  |         if ("extended_tile" in m_data) { | ||
|  |             foreach(pos, path in m_data.extended_tile) { | ||
|  |                 local realpath = m_data.dirpath + path.tolower(); | ||
|  |                 local TileObj = Tile(realpath); | ||
|  |                 TileObj.SetAnchor(0.0, 0.0); | ||
|  |                 TileObj.SetPosition(pos * 224, 560); | ||
|  |                 LayerObject.bottom.Addchild(TileObj); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     //初始化背景动画 | ||
|  |     function InitBackgroundAnimation() { | ||
|  |         //背景动画 | ||
|  |         if ("background_animation" in m_data) { | ||
|  |             foreach(Info in m_data.background_animation) { | ||
|  |                 local realpath = m_data.dirpath + Info.filename.tolower(); | ||
|  |                 //先构造一个天空 然后通过宽度 和地图宽度得知还需要再构造多少个 | ||
|  |                 local AniList = []; | ||
|  |                 local AniObj = Animation(realpath); | ||
|  |                 local width = AniObj.GetSize().w; | ||
|  |                 AniList.push(AniObj); | ||
|  |                 for (local i = 1; i< width; i++) { | ||
|  |                     local AniObj = Animation(realpath); | ||
|  |                     AniList.push(AniObj); | ||
|  |                 } | ||
|  |                 foreach(pos, ani in AniList) { | ||
|  |                     ani.SetAnchor(0.0, 0.0); | ||
|  |                     ani.SetPosition(pos * AniObj.GetSize().w, m_data.background_pos); | ||
|  |                     LayerObject[Info.layer].Addchild(ani); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     //初始化场景Ani | ||
|  |     function InitAnimation() { | ||
|  |         foreach(pos, info in m_data.animation) { | ||
|  |             local realpath = m_data.dirpath + info.filename.tolower(); | ||
|  |             local AniObj = AnimationObject(realpath); | ||
|  |             AniObj.SetAnchor(0.0, 0.0); | ||
|  |             //注意这里默认要增加120的Y轴偏移 | ||
|  |             if (info.layer != "normal") AniObj.SetPositionNoLayer(info.xpos, info.ypos + m_data.background_pos + 120, info.zpos); | ||
|  |             else AniObj.SetPosition(info.xpos, info.ypos + m_data.background_pos + 120, info.zpos); | ||
|  |             LayerObject[info.layer].Addchild(AniObj); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     constructor(arg) { | ||
|  |         base.constructor(); | ||
|  | 
 | ||
|  |         if (typeof arg == "integer") { | ||
|  | 
 | ||
|  |         } else if (typeof arg == "string") { | ||
|  |             InitData(arg); | ||
|  |         } | ||
|  | 
 | ||
|  |         //初始化图层 | ||
|  |         InitLayer(); | ||
|  | 
 | ||
|  |         //初始化地板 | ||
|  |         InitTile(); | ||
|  |         //初始化背景动画 | ||
|  |         InitBackgroundAnimation(); | ||
|  |         //初始化场景Ani | ||
|  |         InitAnimation(); | ||
|  |     } | ||
|  | } |