2024-12-11 15:08:57 +08:00
|
|
|
/*
|
|
|
|
|
文件名:MapObject.nut
|
|
|
|
|
路径:User/Object/Map/MapObject.nut
|
|
|
|
|
创建日期:2024-11-22 19:40
|
|
|
|
|
文件用途:地图对象
|
|
|
|
|
*/
|
2024-12-25 11:34:23 +08:00
|
|
|
class MapLayer extends Actor {
|
|
|
|
|
function _typeof() {
|
|
|
|
|
return "townmap";
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-12-11 15:08:57 +08:00
|
|
|
class Map extends Actor {
|
|
|
|
|
//图层对象Map
|
|
|
|
|
LayerObject = null;
|
|
|
|
|
|
2025-01-04 20:03:17 +08:00
|
|
|
//角色列表
|
|
|
|
|
PlayerList = null;
|
|
|
|
|
|
2024-12-25 11:34:23 +08:00
|
|
|
//所属城镇
|
|
|
|
|
m_town = 0;
|
2024-12-11 15:08:57 +08:00
|
|
|
//地图编号
|
|
|
|
|
m_mapId = 0;
|
|
|
|
|
//数据
|
|
|
|
|
m_data = null;
|
|
|
|
|
|
|
|
|
|
//地图长度
|
|
|
|
|
m_length = 0;
|
2024-12-25 11:34:23 +08:00
|
|
|
//地图高度
|
|
|
|
|
m_height = 0;
|
|
|
|
|
|
|
|
|
|
//摄像机
|
|
|
|
|
m_camera = null;
|
|
|
|
|
//地图的摄像机最大可移动参数
|
|
|
|
|
CameraMovableAreaX = null;
|
|
|
|
|
CameraMovableAreaY = null;
|
|
|
|
|
|
2024-12-25 19:58:03 +08:00
|
|
|
//背景音乐
|
|
|
|
|
BackGroundMusic = null;
|
|
|
|
|
|
2024-12-25 11:34:23 +08:00
|
|
|
function _typeof() {
|
|
|
|
|
return "townmap";
|
|
|
|
|
}
|
2024-12-11 15:08:57 +08:00
|
|
|
|
|
|
|
|
//初始化图层对象
|
|
|
|
|
function InitLayer() {
|
|
|
|
|
//图层ObjMap
|
|
|
|
|
LayerObject = {
|
2024-12-25 11:34:23 +08:00
|
|
|
contact = MapLayer(),
|
|
|
|
|
distantback = MapLayer(),
|
|
|
|
|
middleback = MapLayer(),
|
|
|
|
|
bottom = MapLayer(),
|
|
|
|
|
closeback = MapLayer(),
|
|
|
|
|
normal = MapLayer(),
|
|
|
|
|
close = MapLayer(),
|
|
|
|
|
cover = MapLayer(),
|
|
|
|
|
max = MapLayer()
|
2024-12-11 15:08:57 +08:00
|
|
|
};
|
|
|
|
|
//把所有图层Obj挂上Map的子对象
|
|
|
|
|
foreach(LayerObj in LayerObject) {
|
|
|
|
|
Addchild(LayerObj);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
local FristOrder = 10000;
|
|
|
|
|
//按照层级给Layer设置层级
|
2024-12-25 11:34:23 +08:00
|
|
|
LayerObject.contact.SetZOrder(FristOrder);
|
|
|
|
|
FristOrder += 50000;
|
2024-12-11 15:08:57 +08:00
|
|
|
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.normal.SetZOrder(FristOrder);
|
|
|
|
|
FristOrder += 50000;
|
2024-12-25 11:34:23 +08:00
|
|
|
LayerObject.close.SetZOrder(FristOrder);
|
2024-12-11 15:08:57 +08:00
|
|
|
FristOrder += 50000;
|
2024-12-25 11:34:23 +08:00
|
|
|
LayerObject.cover.SetZOrder(FristOrder);
|
2024-12-11 15:08:57 +08:00
|
|
|
FristOrder += 50000;
|
|
|
|
|
LayerObject.max.SetZOrder(FristOrder);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//初始化数据
|
|
|
|
|
function InitData(path) {
|
|
|
|
|
m_data = ScriptData.GetFileData(path, function(DataTable, Data) {
|
2024-12-25 11:34:23 +08:00
|
|
|
//在这里添加一些初始化的默认值
|
|
|
|
|
DataTable.wide_mode_camer_vertical_correction <- 0;
|
|
|
|
|
DataTable.background_pos <- 80;
|
2024-12-11 15:08:57 +08:00
|
|
|
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();
|
2024-12-25 11:34:23 +08:00
|
|
|
} else if (str == "[wide mode camera vertical correction]") {
|
|
|
|
|
DataTable.wide_mode_camer_vertical_correction <- Data.Get();
|
2024-12-11 15:08:57 +08:00
|
|
|
} 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 <- [];
|
2024-12-25 11:34:23 +08:00
|
|
|
DataTable.town_movable_area_info <- [];
|
2024-12-11 15:08:57 +08:00
|
|
|
while (true) {
|
|
|
|
|
local areadata = Data.Get();
|
|
|
|
|
if (areadata == "[/town movable area]") break;
|
2024-12-25 11:34:23 +08:00
|
|
|
DataTable.town_movable_area.push(areadata);
|
|
|
|
|
for (local i = 0; i< 3; i++) {
|
|
|
|
|
DataTable.town_movable_area.push(Data.Get());
|
2024-12-11 15:08:57 +08:00
|
|
|
}
|
2024-12-25 11:34:23 +08:00
|
|
|
local T = {
|
|
|
|
|
town = Data.Get(),
|
|
|
|
|
area = Data.Get(),
|
|
|
|
|
}
|
|
|
|
|
DataTable.town_movable_area_info.push(T);
|
2024-12-11 15:08:57 +08:00
|
|
|
}
|
|
|
|
|
} else if (str == "[virtual movable area]") {
|
|
|
|
|
DataTable.virtual_movable_area <- [];
|
|
|
|
|
while (true) {
|
|
|
|
|
local areadata = Data.Get();
|
|
|
|
|
if (areadata == "[/virtual movable area]") break;
|
2024-12-25 11:34:23 +08:00
|
|
|
DataTable.virtual_movable_area.push(areadata);
|
|
|
|
|
DataTable.virtual_movable_area.push(Data.Get());
|
|
|
|
|
DataTable.virtual_movable_area.push(Data.Get());
|
|
|
|
|
DataTable.virtual_movable_area.push(Data.Get());
|
2024-12-11 15:08:57 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
m_data.path <- path;
|
|
|
|
|
m_data.dirpath <- path.slice(0, path.lastfind("/") + 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//初始化地板
|
|
|
|
|
function InitTile() {
|
2024-12-25 11:34:23 +08:00
|
|
|
local NormalTileCount = 0;
|
2024-12-11 15:08:57 +08:00
|
|
|
//普通地板
|
|
|
|
|
if ("tile" in m_data) {
|
2024-12-25 11:34:23 +08:00
|
|
|
NormalTileCount = m_data.tile.len();
|
|
|
|
|
//计算地图长度
|
|
|
|
|
m_length = NormalTileCount * 224;
|
2024-12-11 15:08:57 +08:00
|
|
|
foreach(pos, path in m_data.tile) {
|
|
|
|
|
local realpath = m_data.dirpath + path.tolower();
|
|
|
|
|
local TileObj = Tile(realpath);
|
|
|
|
|
TileObj.SetAnchor(0.0, 0.0);
|
2025-01-02 19:19:36 +08:00
|
|
|
TileObj.SetPosition(pos * 224, -200 - m_data.background_pos);
|
2024-12-11 15:08:57 +08:00
|
|
|
LayerObject.bottom.Addchild(TileObj);
|
|
|
|
|
}
|
2024-12-25 11:34:23 +08:00
|
|
|
//默认地板 + 摄像机偏移 + 默认需要有一个40的添加地板
|
2024-12-25 19:58:03 +08:00
|
|
|
m_height = 560;
|
2024-12-11 15:08:57 +08:00
|
|
|
}
|
|
|
|
|
//补充地板
|
|
|
|
|
if ("extended_tile" in m_data) {
|
2024-12-25 11:34:23 +08:00
|
|
|
local ExTileCount = m_data.extended_tile.len();
|
|
|
|
|
//计算地图高度
|
|
|
|
|
local Buffer = (ExTileCount / NormalTileCount);
|
|
|
|
|
//这里默认加了40的高度 然后要读取pvf的 [wide mode camera vertical correction]
|
|
|
|
|
m_height += (Buffer< 1 ? 1 : Buffer) * 40;
|
2024-12-11 15:08:57 +08:00
|
|
|
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);
|
2024-12-25 11:34:23 +08:00
|
|
|
//根据基础地板的数量判断是第几排
|
2025-01-02 19:19:36 +08:00
|
|
|
TileObj.SetPosition((pos % NormalTileCount) * 224, 560 - 200 - m_data.background_pos + ((pos / NormalTileCount) * 40));
|
2024-12-11 15:08:57 +08:00
|
|
|
LayerObject.bottom.Addchild(TileObj);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//初始化背景动画
|
|
|
|
|
function InitBackgroundAnimation() {
|
2024-12-25 11:34:23 +08:00
|
|
|
local Rate = m_data.rawin("far_sight_scroll") ? (m_data.far_sight_scroll.tofloat() / 100.0) : 1.0;
|
|
|
|
|
m_camera.BackgroundMoveSpeed = Rate;
|
2024-12-11 15:08:57 +08:00
|
|
|
//背景动画
|
|
|
|
|
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);
|
2024-12-25 11:34:23 +08:00
|
|
|
for (local i = 1; i<((m_length * Rate) / width + 1); i++) {
|
2024-12-11 15:08:57 +08:00
|
|
|
local AniObj = Animation(realpath);
|
|
|
|
|
AniList.push(AniObj);
|
|
|
|
|
}
|
|
|
|
|
foreach(pos, ani in AniList) {
|
|
|
|
|
ani.SetAnchor(0.0, 0.0);
|
2024-12-25 11:34:23 +08:00
|
|
|
ani.SetPosition(pos * AniObj.GetSize().w, -120);
|
2024-12-11 15:08:57 +08:00
|
|
|
LayerObject[Info.layer].Addchild(ani);
|
2024-12-25 11:34:23 +08:00
|
|
|
ani.SetZOrder(-1000000);
|
2024-12-11 15:08:57 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//初始化场景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);
|
2024-12-25 11:34:23 +08:00
|
|
|
if (info.layer != "normal") AniObj.SetPositionNoLayer(info.xpos, info.ypos, info.zpos);
|
|
|
|
|
else AniObj.SetPosition(info.xpos, info.ypos, info.zpos);
|
2024-12-11 15:08:57 +08:00
|
|
|
LayerObject[info.layer].Addchild(AniObj);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-25 19:58:03 +08:00
|
|
|
|
2025-01-02 19:19:36 +08:00
|
|
|
//初始化NPC
|
|
|
|
|
function InitNPC() {
|
|
|
|
|
if (!m_data.rawin("npc")) return;
|
|
|
|
|
local Arr = [];
|
|
|
|
|
foreach(pos, info in m_data.npc) {
|
|
|
|
|
local NPCobj = GameObject.NPC(info.id);
|
|
|
|
|
NPCobj.SetDirection(info.direction);
|
|
|
|
|
NPCobj.SetPosition(info.xpos, info.ypos, info.zpos);
|
|
|
|
|
Arr.push(NPCobj);
|
|
|
|
|
AddObject(NPCobj);
|
|
|
|
|
}
|
|
|
|
|
//构造完成直接赋值对象
|
|
|
|
|
m_data.npc = Arr;
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-25 19:58:03 +08:00
|
|
|
|
2024-12-25 11:34:23 +08:00
|
|
|
//添加对象
|
|
|
|
|
function AddObject(obj, IsPlayer = false) {
|
|
|
|
|
//角色对象
|
|
|
|
|
if (typeof obj == "character") {
|
|
|
|
|
//如果已经处于某个地图中
|
|
|
|
|
if (obj.Parent) {
|
|
|
|
|
obj.Parent.Removechild(obj);
|
|
|
|
|
}
|
|
|
|
|
LayerObject.normal.Addchild(obj);
|
2025-01-04 20:03:17 +08:00
|
|
|
PlayerList[obj.Cid] <- obj;
|
2024-12-25 11:34:23 +08:00
|
|
|
obj.MySelfMap = this.weakref();
|
2024-12-25 19:58:03 +08:00
|
|
|
//如果是玩家自己
|
|
|
|
|
if (IsPlayer) {
|
|
|
|
|
m_camera.SetFromParent(obj);
|
|
|
|
|
if (BackGroundMusic == null) BackGroundMusic = {};
|
|
|
|
|
foreach(SoundName in m_data.sound) {
|
|
|
|
|
local BgMusic = Audio(getconsttable().MUSIC[SoundName]);
|
|
|
|
|
BgMusic.Play();
|
|
|
|
|
BackGroundMusic[SoundName] <- BgMusic;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-01-02 19:19:36 +08:00
|
|
|
} else if (typeof obj == "npc") {
|
|
|
|
|
LayerObject.normal.Addchild(obj);
|
2024-12-25 11:34:23 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-05 00:48:35 +08:00
|
|
|
//移除对象
|
|
|
|
|
function RemoveObject(obj) {
|
2025-01-04 20:03:17 +08:00
|
|
|
//图层对象中移除玩家
|
2025-01-05 00:48:35 +08:00
|
|
|
LayerObject.normal.Removechild(obj);
|
2025-01-04 20:03:17 +08:00
|
|
|
//玩家列表中移除玩家
|
|
|
|
|
PlayerList.rawdelete(obj.Cid);
|
2025-01-05 00:48:35 +08:00
|
|
|
//角色对象
|
|
|
|
|
if (typeof obj == "character") {
|
|
|
|
|
//将地图信息写入角色中
|
|
|
|
|
obj.MySelfMap = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//移除地图中所有的角色对象
|
|
|
|
|
function RemoveAllCharacterObject() {
|
2025-01-04 20:03:17 +08:00
|
|
|
foreach(obj in PlayerList) {
|
2025-01-05 00:48:35 +08:00
|
|
|
//角色对象
|
|
|
|
|
if (typeof obj == "character") {
|
|
|
|
|
RemoveObject(obj);
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-01-03 19:47:36 +08:00
|
|
|
}
|
|
|
|
|
|
2024-12-25 11:34:23 +08:00
|
|
|
//移动城镇的添加对象
|
2025-01-03 19:47:36 +08:00
|
|
|
function AddObjectByChangeTown(obj, pos) {
|
2024-12-25 11:34:23 +08:00
|
|
|
//角色对象
|
|
|
|
|
if (typeof obj == "character") {
|
2025-01-03 19:47:36 +08:00
|
|
|
//角色原城镇
|
|
|
|
|
local FromMapobj = obj.MySelfMap;
|
2025-01-05 00:48:35 +08:00
|
|
|
//清除原城镇里的玩家
|
|
|
|
|
FromMapobj.RemoveAllCharacterObject();
|
2024-12-25 19:58:03 +08:00
|
|
|
//背景音乐处理
|
|
|
|
|
BackGroundMusic = {};
|
|
|
|
|
if (FromMapobj.BackGroundMusic != null) {
|
|
|
|
|
//把老地图的音频先获取过来
|
|
|
|
|
foreach(SoundName, Music in FromMapobj.BackGroundMusic) {
|
|
|
|
|
//如果有背景音乐是新地图存在的 就添加
|
|
|
|
|
if (this.m_data.sound.find(SoundName) != null) {
|
|
|
|
|
BackGroundMusic[SoundName] <- Music;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//销毁老地图的音频列表
|
|
|
|
|
FromMapobj.BackGroundMusic = null;
|
|
|
|
|
|
|
|
|
|
//检查当前地图的背景音乐
|
|
|
|
|
foreach(SoundName in this.m_data.sound) {
|
|
|
|
|
//如果有一个背景音乐是新地图不存在的 就停止播放
|
|
|
|
|
if (!(BackGroundMusic.rawin(SoundName))) {
|
|
|
|
|
local BgMusic = Audio(getconsttable().MUSIC[SoundName]);
|
|
|
|
|
BgMusic.Play();
|
|
|
|
|
BackGroundMusic[SoundName] <- BgMusic;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-01-03 19:47:36 +08:00
|
|
|
//绑定摄像机
|
|
|
|
|
m_camera.SetFromParent(obj);
|
|
|
|
|
//获取当前场景
|
|
|
|
|
local Stage = sq_GetCurrentStage();
|
2025-01-05 00:48:35 +08:00
|
|
|
if (GlobalTownManager.CurrentMap) {
|
|
|
|
|
Stage.Removechild(GlobalTownManager.CurrentMap);
|
2025-01-03 19:47:36 +08:00
|
|
|
}
|
|
|
|
|
Stage.Addchild(this);
|
|
|
|
|
//添加全局
|
2025-01-05 00:48:35 +08:00
|
|
|
GlobalTownManager.CurrentMap = this.weakref();
|
2025-01-03 19:47:36 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
//如果已经处于某个地图中 则先移除
|
|
|
|
|
if (obj.Parent) {
|
|
|
|
|
obj.Parent.Removechild(obj);
|
|
|
|
|
}
|
|
|
|
|
//将角色添加到地图的normal图层
|
|
|
|
|
LayerObject.normal.Addchild(obj);
|
2025-01-04 20:03:17 +08:00
|
|
|
PlayerList[obj.Cid] <- obj;
|
2025-01-03 19:47:36 +08:00
|
|
|
//设置坐标
|
|
|
|
|
obj.SetPosition(pos);
|
|
|
|
|
//将地图信息写入角色中
|
|
|
|
|
obj.MySelfMap = this.weakref();
|
2024-12-25 11:34:23 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-11 15:08:57 +08:00
|
|
|
constructor(arg) {
|
2025-01-04 20:03:17 +08:00
|
|
|
PlayerList = {};
|
2024-12-11 15:08:57 +08:00
|
|
|
base.constructor();
|
|
|
|
|
|
|
|
|
|
if (typeof arg == "integer") {
|
|
|
|
|
|
|
|
|
|
} else if (typeof arg == "string") {
|
|
|
|
|
InitData(arg);
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-25 11:34:23 +08:00
|
|
|
//初始化摄像机
|
|
|
|
|
m_camera = MapCamera(this);
|
|
|
|
|
|
2024-12-11 15:08:57 +08:00
|
|
|
//初始化图层
|
|
|
|
|
InitLayer();
|
|
|
|
|
|
|
|
|
|
//初始化地板
|
|
|
|
|
InitTile();
|
|
|
|
|
//初始化背景动画
|
|
|
|
|
InitBackgroundAnimation();
|
|
|
|
|
//初始化场景Ani
|
|
|
|
|
InitAnimation();
|
2025-01-02 19:19:36 +08:00
|
|
|
//初始化NPC
|
|
|
|
|
InitNPC();
|
|
|
|
|
//注册鼠标判定逻辑
|
|
|
|
|
Reg_Yosin_Mouse_Logic("MapMLg_" + C_Object, OnMouseLogic.bindenv(this));
|
2024-12-25 11:34:23 +08:00
|
|
|
|
|
|
|
|
//设置摄像机的最大可行区域
|
|
|
|
|
m_camera.MovableAreaX = m_length;
|
2024-12-25 19:58:03 +08:00
|
|
|
m_camera.MovableAreaY = m_height - m_data.wide_mode_camer_vertical_correction;
|
2024-12-25 11:34:23 +08:00
|
|
|
|
|
|
|
|
m_camera.BackgroundOffset = m_data.background_pos;
|
|
|
|
|
// OpenMovableAreaBorder();
|
2025-01-03 19:47:36 +08:00
|
|
|
|
2024-12-25 11:34:23 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//DEBUG方法
|
|
|
|
|
function OpenMovableAreaBorder() {
|
|
|
|
|
for (local i = 0; i< m_data.virtual_movable_area.len(); i += 4) {
|
|
|
|
|
local x = m_data.virtual_movable_area[i];
|
|
|
|
|
local y = m_data.virtual_movable_area[i + 1];
|
|
|
|
|
local w = m_data.virtual_movable_area[i + 2];
|
|
|
|
|
local h = m_data.virtual_movable_area[i + 3];
|
|
|
|
|
local Ac = Actor();
|
|
|
|
|
Ac.SetPosition(x, y);
|
|
|
|
|
Ac.SetSize(w, h);
|
|
|
|
|
Ac.ShowBorder(true);
|
|
|
|
|
LayerObject.max.Addchild(Ac);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-02 19:19:36 +08:00
|
|
|
function OnMouseLogic(MouseState, Wheel, MousePos_X, MousePos_Y) {
|
|
|
|
|
//判断是人物所在的地图
|
|
|
|
|
if (ClientCharacter && this.C_Object == ClientCharacter.MySelfMap.C_Object) {
|
|
|
|
|
local Arr = [];
|
|
|
|
|
//遍历全部NPC位置
|
|
|
|
|
foreach(index, Npcobj in m_data.npc) {
|
|
|
|
|
//获取NPC的屏幕位置
|
|
|
|
|
local NPCpos = Npcobj.GetWorldPosition();
|
|
|
|
|
//在屏幕中的才添加比对 这里只判断了X轴
|
|
|
|
|
if (NPCpos.x > -20 && NPCpos.y< 1086) {
|
|
|
|
|
Arr.push(NPCpos.x - Npcobj.IdentifyWidth / 2);
|
|
|
|
|
Arr.push(NPCpos.y - Npcobj.IdentifyHeight);
|
|
|
|
|
Arr.push(Npcobj.IdentifyWidth);
|
|
|
|
|
Arr.push(Npcobj.IdentifyHeight);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
local Index = Math.PointIsInWhichRectangle(MousePos_X, MousePos_Y, Arr);
|
|
|
|
|
//有事件发生的NPC对象
|
|
|
|
|
if (Index != -1) {
|
|
|
|
|
return m_data.npc[Index].OnMouseLogic(MouseState, Wheel, MousePos_X, MousePos_Y);
|
|
|
|
|
} else {
|
|
|
|
|
foreach(Npcobj in m_data.npc) {
|
|
|
|
|
Npcobj.OutMouseLogic();
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-25 11:34:23 +08:00
|
|
|
//判断区域是否可行
|
|
|
|
|
function CheckMovableArea(gx, gxoffset, gy, gyoffset) {
|
|
|
|
|
local pos = {
|
|
|
|
|
x = gxoffset,
|
|
|
|
|
y = gyoffset
|
|
|
|
|
}
|
|
|
|
|
//都符合
|
|
|
|
|
if (Math.PointIsInSquare(gx + gxoffset, gy + gyoffset, m_data.virtual_movable_area)) {}
|
|
|
|
|
//X符合
|
|
|
|
|
else if (Math.PointIsInSquare(gx + gxoffset, gy, m_data.virtual_movable_area)) {
|
|
|
|
|
pos.y = 0;
|
|
|
|
|
}
|
|
|
|
|
//Y符合
|
|
|
|
|
else if (Math.PointIsInSquare(gx, gy + gyoffset, m_data.virtual_movable_area)) {
|
|
|
|
|
pos.x = 0;
|
|
|
|
|
} else {
|
|
|
|
|
pos.x = 0;
|
|
|
|
|
pos.y = 0;
|
|
|
|
|
}
|
|
|
|
|
return pos;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//判断区域是否传送
|
|
|
|
|
function CheckMovableAreaTransmit(obj, gx, gy) {
|
|
|
|
|
local Index = Math.PointIsInWhichRectangle(gx, gy, m_data.town_movable_area);
|
|
|
|
|
//走进了传送阵
|
|
|
|
|
if (Index != -1) {
|
|
|
|
|
if (!obj.TransmitFlag) {
|
2025-01-03 19:47:36 +08:00
|
|
|
//得到传送信息 目标城镇
|
2024-12-25 11:34:23 +08:00
|
|
|
local info = m_data.town_movable_area_info[Index];
|
2025-01-03 19:47:36 +08:00
|
|
|
//如果是未加载的城镇 则先构造城镇
|
2024-12-25 11:34:23 +08:00
|
|
|
if (!(GlobalTownManager.TownList.rawin(info.town))) {
|
|
|
|
|
Town(info.town);
|
|
|
|
|
}
|
2025-01-03 19:47:36 +08:00
|
|
|
//计算位移过去以后应该设置的位置
|
2024-12-25 11:34:23 +08:00
|
|
|
local MapObj = GlobalTownManager.TownList[info.town].map[info.area];
|
2025-01-03 19:47:36 +08:00
|
|
|
local movepos = {
|
|
|
|
|
z = 0
|
|
|
|
|
};
|
|
|
|
|
//遍历目标城镇的该区域 查找适当位移位置
|
|
|
|
|
foreach(index, mapinfo in MapObj.m_data.town_movable_area_info) {
|
|
|
|
|
if (mapinfo.town == m_town && mapinfo.area == m_mapId) {
|
|
|
|
|
movepos.x <- MapObj.m_data.town_movable_area[index * 4] + MapObj.m_data.town_movable_area[index * 4 + 2] / 2;
|
|
|
|
|
movepos.y <- MapObj.m_data.town_movable_area[index * 4 + 1] + MapObj.m_data.town_movable_area[index * 4 + 3] / 2;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//发包移动城镇
|
|
|
|
|
MySocket.Send(PACKET_ID.CHANGE_TOWN_AREA, {
|
|
|
|
|
town = info.town,
|
|
|
|
|
region = info.area,
|
|
|
|
|
pos = movepos
|
|
|
|
|
})
|
|
|
|
|
|
2024-12-25 11:34:23 +08:00
|
|
|
obj.TransmitFlag = true;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
obj.TransmitFlag = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-25 19:58:03 +08:00
|
|
|
//音乐逻辑
|
|
|
|
|
function MusicLogic() {
|
|
|
|
|
if (BackGroundMusic == null) return;
|
|
|
|
|
foreach(Music in BackGroundMusic) {
|
|
|
|
|
if (!Music.IsPlaying()) Music.Play();
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-12-25 11:34:23 +08:00
|
|
|
|
|
|
|
|
function OnUpdate(Dt) {
|
|
|
|
|
base.OnUpdate(Dt);
|
|
|
|
|
//更新摄像机
|
|
|
|
|
m_camera.OnUpdate(Dt);
|
2024-12-25 19:58:03 +08:00
|
|
|
|
|
|
|
|
//更新音乐逻辑
|
|
|
|
|
MusicLogic();
|
2024-12-11 15:08:57 +08:00
|
|
|
}
|
|
|
|
|
}
|