From 651902908c077337841c9915c0c7ef1a74a18b83 Mon Sep 17 00:00:00 2001 From: Lenheart <947330670@qq.com> Date: Wed, 25 Dec 2024 11:34:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E7=B1=BB=20=E6=9B=B4?= =?UTF-8?q?=E6=94=B9=E5=9B=BE=E5=B1=82=E9=A1=BA=E5=BA=8F=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=9C=B0=E5=9B=BE=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91?= =?UTF-8?q?=20=E6=96=B0=E5=A2=9E=E6=B7=BB=E5=8A=A0=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E6=96=B9=E6=B3=95=20=20=E6=96=B0=E5=A2=9E=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E5=9F=8E=E9=95=87=E6=B7=BB=E5=8A=A0=E5=AF=B9=E8=B1=A1=E6=96=B9?= =?UTF-8?q?=E6=B3=95=20=E6=96=B0=E5=A2=9E=E6=91=84=E5=83=8F=E6=9C=BA?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=20=E6=96=B0=E5=A2=9E=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=8F=AF=E8=A1=8C=E5=8C=BA=E5=9F=9F=E6=96=B9=E6=B3=95=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=A4=E6=96=AD=E5=8C=BA=E5=9F=9F=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E5=8F=AF=E8=A1=8C=20=E6=96=B0=E5=A2=9E=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E5=8C=BA=E5=9F=9F=E6=98=AF=E5=90=A6=E4=BC=A0=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sqr/User/Object/Map/MapObject.nut | 230 +++++++++++++++++++++++++----- 1 file changed, 197 insertions(+), 33 deletions(-) diff --git a/sqr/User/Object/Map/MapObject.nut b/sqr/User/Object/Map/MapObject.nut index fcfdbba..7c1c89d 100644 --- a/sqr/User/Object/Map/MapObject.nut +++ b/sqr/User/Object/Map/MapObject.nut @@ -4,10 +4,17 @@ 创建日期:2024-11-22 19:40 文件用途:地图对象 */ +class MapLayer extends Actor { + function _typeof() { + return "townmap"; + } +} class Map extends Actor { //图层对象Map LayerObject = null; + //所属城镇 + m_town = 0; //地图编号 m_mapId = 0; //数据 @@ -15,20 +22,32 @@ class Map extends Actor { //地图长度 m_length = 0; + //地图高度 + m_height = 0; + + //摄像机 + m_camera = null; + //地图的摄像机最大可移动参数 + CameraMovableAreaX = null; + CameraMovableAreaY = null; + + function _typeof() { + return "townmap"; + } //初始化图层对象 function InitLayer() { //图层ObjMap LayerObject = { - contact = Actor(), - normal = Actor(), - bottom = Actor(), - close = Actor(), - closeback = Actor(), - middleback = Actor(), - distantback = Actor(), - cover = Actor(), - max = Actor() + contact = MapLayer(), + distantback = MapLayer(), + middleback = MapLayer(), + bottom = MapLayer(), + closeback = MapLayer(), + normal = MapLayer(), + close = MapLayer(), + cover = MapLayer(), + max = MapLayer() }; //把所有图层Obj挂上Map的子对象 foreach(LayerObj in LayerObject) { @@ -37,6 +56,8 @@ class Map extends Actor { local FristOrder = 10000; //按照层级给Layer设置层级 + LayerObject.contact.SetZOrder(FristOrder); + FristOrder += 50000; LayerObject.distantback.SetZOrder(FristOrder); FristOrder += 50000; LayerObject.middleback.SetZOrder(FristOrder); @@ -45,13 +66,11 @@ class Map extends Actor { FristOrder += 50000; LayerObject.closeback.SetZOrder(FristOrder); FristOrder += 50000; - LayerObject.close.SetZOrder(FristOrder); - FristOrder += 50000; LayerObject.normal.SetZOrder(FristOrder); FristOrder += 50000; - LayerObject.cover.SetZOrder(FristOrder); + LayerObject.close.SetZOrder(FristOrder); FristOrder += 50000; - LayerObject.contact.SetZOrder(FristOrder); + LayerObject.cover.SetZOrder(FristOrder); FristOrder += 50000; LayerObject.max.SetZOrder(FristOrder); }; @@ -59,12 +78,17 @@ class Map extends Actor { //初始化数据 function InitData(path) { m_data = ScriptData.GetFileData(path, function(DataTable, Data) { + //在这里添加一些初始化的默认值 + DataTable.wide_mode_camer_vertical_correction <- 0; + DataTable.background_pos <- 80; 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 == "[wide mode camera vertical correction]") { + DataTable.wide_mode_camer_vertical_correction <- Data.Get(); } else if (str == "[tile]") { DataTable.tile <- []; while (true) { @@ -132,27 +156,29 @@ class Map extends Actor { } } else if (str == "[town movable area]") { DataTable.town_movable_area <- []; + DataTable.town_movable_area_info <- []; 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(areadata); + for (local i = 0; i< 3; i++) { + DataTable.town_movable_area.push(Data.Get()); } - DataTable.town_movable_area.push(info); + local T = { + town = Data.Get(), + area = Data.Get(), + } + DataTable.town_movable_area_info.push(T); } } 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); + 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()); } } } @@ -163,25 +189,35 @@ class Map extends Actor { //初始化地板 function InitTile() { + local NormalTileCount = 0; //普通地板 if ("tile" in m_data) { + NormalTileCount = m_data.tile.len(); + //计算地图长度 + m_length = NormalTileCount * 224; 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); + TileObj.SetPosition(pos * 224, -120 - m_data.background_pos); LayerObject.bottom.Addchild(TileObj); - //计算地图长度 - m_length += 224; } + //默认地板 + 摄像机偏移 + 默认需要有一个40的添加地板 + m_height = 560 + 40; } //补充地板 if ("extended_tile" in m_data) { + 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; 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); + //根据基础地板的数量判断是第几排 + TileObj.SetPosition((pos % NormalTileCount) * 224, 560 - 120 - m_data.background_pos + ((pos / NormalTileCount) * 40)); LayerObject.bottom.Addchild(TileObj); } } @@ -189,6 +225,8 @@ class Map extends Actor { //初始化背景动画 function InitBackgroundAnimation() { + local Rate = m_data.rawin("far_sight_scroll") ? (m_data.far_sight_scroll.tofloat() / 100.0) : 1.0; + m_camera.BackgroundMoveSpeed = Rate; //背景动画 if ("background_animation" in m_data) { foreach(Info in m_data.background_animation) { @@ -198,14 +236,15 @@ class Map extends Actor { local AniObj = Animation(realpath); local width = AniObj.GetSize().w; AniList.push(AniObj); - for (local i = 1; i< width; i++) { + for (local i = 1; i<((m_length * Rate) / width + 1); 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); + ani.SetPosition(pos * AniObj.GetSize().w, -120); LayerObject[Info.layer].Addchild(ani); + ani.SetZOrder(-1000000); } } } @@ -217,13 +256,63 @@ class Map extends Actor { 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); + if (info.layer != "normal") AniObj.SetPositionNoLayer(info.xpos, info.ypos, info.zpos); + else AniObj.SetPosition(info.xpos, info.ypos, info.zpos); LayerObject[info.layer].Addchild(AniObj); } } + //添加对象 + function AddObject(obj, IsPlayer = false) { + //角色对象 + if (typeof obj == "character") { + //如果已经处于某个地图中 + if (obj.Parent) { + obj.Parent.Removechild(obj); + } + LayerObject.normal.Addchild(obj); + obj.MySelfMap = this.weakref(); + if (IsPlayer) m_camera.SetFromParent(obj); + } + } + + //移动城镇的添加对象 + function AddObjectByChangeTown(obj, FromTown, FromMap) { + //角色对象 + if (typeof obj == "character") { + //如果已经处于某个地图中 + if (obj.Parent) { + obj.Parent.Removechild(obj); + } + LayerObject.normal.Addchild(obj); + //将地图信息写入角色中 + obj.MySelfMap = this.weakref(); + //绑定摄像机 + m_camera.SetFromParent(obj); + //获取应该设置的坐标 + foreach(index, info in m_data.town_movable_area_info) { + if (info.town == FromTown && info.area == FromMap) { + local pos = { + x = m_data.town_movable_area[index * 4] + m_data.town_movable_area[index * 4 + 2] / 2, + y = m_data.town_movable_area[index * 4 + 1] + m_data.town_movable_area[index * 4 + 3] / 2, + z = 0 + } + obj.SetPosition(pos); + break; + } + } + + //获取当前场景 + local Stage = sq_GetCurrentStage(); + if (GlobalTownManager.CurrentTown) { + Stage.Removechild(GlobalTownManager.CurrentTown); + } + Stage.Addchild(this); + //添加全局 + GlobalTownManager.CurrentTown = this.weakref(); + } + } + constructor(arg) { base.constructor(); @@ -233,6 +322,9 @@ class Map extends Actor { InitData(arg); } + //初始化摄像机 + m_camera = MapCamera(this); + //初始化图层 InitLayer(); @@ -242,5 +334,77 @@ class Map extends Actor { InitBackgroundAnimation(); //初始化场景Ani InitAnimation(); + + //设置摄像机的最大可行区域 + m_camera.MovableAreaX = m_length; + m_camera.MovableAreaY = m_height; + + m_camera.BackgroundOffset = m_data.background_pos; + + // OpenMovableAreaBorder(); + } + + //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); + } + } + + //判断区域是否可行 + 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) { + local info = m_data.town_movable_area_info[Index]; + //这里是未加载的城镇 + if (!(GlobalTownManager.TownList.rawin(info.town))) { + Town(info.town); + } + local MapObj = GlobalTownManager.TownList[info.town].map[info.area]; + MapObj.AddObjectByChangeTown(obj, m_town, m_mapId); + obj.TransmitFlag = true; + } + } else { + obj.TransmitFlag = false; + } + } + + + function OnUpdate(Dt) { + base.OnUpdate(Dt); + //更新摄像机 + m_camera.OnUpdate(Dt); } } \ No newline at end of file