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();
|
|
}
|
|
} |