地图类 更改图层顺序 修改地图加载逻辑 新增添加对象方法 新增移动城镇添加对象方法 新增摄像机系统 新增显示可行区域方法 新增判断区域是否可行 新增判断区域是否传送
This commit is contained in:
parent
bac9ec78b9
commit
651902908c
|
|
@ -4,10 +4,17 @@
|
||||||
创建日期:2024-11-22 19:40
|
创建日期:2024-11-22 19:40
|
||||||
文件用途:地图对象
|
文件用途:地图对象
|
||||||
*/
|
*/
|
||||||
|
class MapLayer extends Actor {
|
||||||
|
function _typeof() {
|
||||||
|
return "townmap";
|
||||||
|
}
|
||||||
|
}
|
||||||
class Map extends Actor {
|
class Map extends Actor {
|
||||||
//图层对象Map
|
//图层对象Map
|
||||||
LayerObject = null;
|
LayerObject = null;
|
||||||
|
|
||||||
|
//所属城镇
|
||||||
|
m_town = 0;
|
||||||
//地图编号
|
//地图编号
|
||||||
m_mapId = 0;
|
m_mapId = 0;
|
||||||
//数据
|
//数据
|
||||||
|
|
@ -15,20 +22,32 @@ class Map extends Actor {
|
||||||
|
|
||||||
//地图长度
|
//地图长度
|
||||||
m_length = 0;
|
m_length = 0;
|
||||||
|
//地图高度
|
||||||
|
m_height = 0;
|
||||||
|
|
||||||
|
//摄像机
|
||||||
|
m_camera = null;
|
||||||
|
//地图的摄像机最大可移动参数
|
||||||
|
CameraMovableAreaX = null;
|
||||||
|
CameraMovableAreaY = null;
|
||||||
|
|
||||||
|
function _typeof() {
|
||||||
|
return "townmap";
|
||||||
|
}
|
||||||
|
|
||||||
//初始化图层对象
|
//初始化图层对象
|
||||||
function InitLayer() {
|
function InitLayer() {
|
||||||
//图层ObjMap
|
//图层ObjMap
|
||||||
LayerObject = {
|
LayerObject = {
|
||||||
contact = Actor(),
|
contact = MapLayer(),
|
||||||
normal = Actor(),
|
distantback = MapLayer(),
|
||||||
bottom = Actor(),
|
middleback = MapLayer(),
|
||||||
close = Actor(),
|
bottom = MapLayer(),
|
||||||
closeback = Actor(),
|
closeback = MapLayer(),
|
||||||
middleback = Actor(),
|
normal = MapLayer(),
|
||||||
distantback = Actor(),
|
close = MapLayer(),
|
||||||
cover = Actor(),
|
cover = MapLayer(),
|
||||||
max = Actor()
|
max = MapLayer()
|
||||||
};
|
};
|
||||||
//把所有图层Obj挂上Map的子对象
|
//把所有图层Obj挂上Map的子对象
|
||||||
foreach(LayerObj in LayerObject) {
|
foreach(LayerObj in LayerObject) {
|
||||||
|
|
@ -37,6 +56,8 @@ class Map extends Actor {
|
||||||
|
|
||||||
local FristOrder = 10000;
|
local FristOrder = 10000;
|
||||||
//按照层级给Layer设置层级
|
//按照层级给Layer设置层级
|
||||||
|
LayerObject.contact.SetZOrder(FristOrder);
|
||||||
|
FristOrder += 50000;
|
||||||
LayerObject.distantback.SetZOrder(FristOrder);
|
LayerObject.distantback.SetZOrder(FristOrder);
|
||||||
FristOrder += 50000;
|
FristOrder += 50000;
|
||||||
LayerObject.middleback.SetZOrder(FristOrder);
|
LayerObject.middleback.SetZOrder(FristOrder);
|
||||||
|
|
@ -45,13 +66,11 @@ class Map extends Actor {
|
||||||
FristOrder += 50000;
|
FristOrder += 50000;
|
||||||
LayerObject.closeback.SetZOrder(FristOrder);
|
LayerObject.closeback.SetZOrder(FristOrder);
|
||||||
FristOrder += 50000;
|
FristOrder += 50000;
|
||||||
LayerObject.close.SetZOrder(FristOrder);
|
|
||||||
FristOrder += 50000;
|
|
||||||
LayerObject.normal.SetZOrder(FristOrder);
|
LayerObject.normal.SetZOrder(FristOrder);
|
||||||
FristOrder += 50000;
|
FristOrder += 50000;
|
||||||
LayerObject.cover.SetZOrder(FristOrder);
|
LayerObject.close.SetZOrder(FristOrder);
|
||||||
FristOrder += 50000;
|
FristOrder += 50000;
|
||||||
LayerObject.contact.SetZOrder(FristOrder);
|
LayerObject.cover.SetZOrder(FristOrder);
|
||||||
FristOrder += 50000;
|
FristOrder += 50000;
|
||||||
LayerObject.max.SetZOrder(FristOrder);
|
LayerObject.max.SetZOrder(FristOrder);
|
||||||
};
|
};
|
||||||
|
|
@ -59,12 +78,17 @@ class Map extends Actor {
|
||||||
//初始化数据
|
//初始化数据
|
||||||
function InitData(path) {
|
function InitData(path) {
|
||||||
m_data = ScriptData.GetFileData(path, function(DataTable, Data) {
|
m_data = ScriptData.GetFileData(path, function(DataTable, Data) {
|
||||||
|
//在这里添加一些初始化的默认值
|
||||||
|
DataTable.wide_mode_camer_vertical_correction <- 0;
|
||||||
|
DataTable.background_pos <- 80;
|
||||||
while (!Data.Eof()) {
|
while (!Data.Eof()) {
|
||||||
local str = Data.Get();
|
local str = Data.Get();
|
||||||
if (str == "[background pos]") {
|
if (str == "[background pos]") {
|
||||||
DataTable.background_pos <- (Data.Get());
|
DataTable.background_pos <- (Data.Get());
|
||||||
} else if (str == "[map name]") {
|
} else if (str == "[map name]") {
|
||||||
DataTable.name <- Data.Get();
|
DataTable.name <- Data.Get();
|
||||||
|
} else if (str == "[wide mode camera vertical correction]") {
|
||||||
|
DataTable.wide_mode_camer_vertical_correction <- Data.Get();
|
||||||
} else if (str == "[tile]") {
|
} else if (str == "[tile]") {
|
||||||
DataTable.tile <- [];
|
DataTable.tile <- [];
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
@ -132,27 +156,29 @@ class Map extends Actor {
|
||||||
}
|
}
|
||||||
} else if (str == "[town movable area]") {
|
} else if (str == "[town movable area]") {
|
||||||
DataTable.town_movable_area <- [];
|
DataTable.town_movable_area <- [];
|
||||||
|
DataTable.town_movable_area_info <- [];
|
||||||
while (true) {
|
while (true) {
|
||||||
local areadata = Data.Get();
|
local areadata = Data.Get();
|
||||||
if (areadata == "[/town movable area]") break;
|
if (areadata == "[/town movable area]") break;
|
||||||
local info = [];
|
DataTable.town_movable_area.push(areadata);
|
||||||
info.push(areadata);
|
for (local i = 0; i< 3; i++) {
|
||||||
for (local i = 0; i< 5; i++) {
|
DataTable.town_movable_area.push(Data.Get());
|
||||||
info.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]") {
|
} else if (str == "[virtual movable area]") {
|
||||||
DataTable.virtual_movable_area <- [];
|
DataTable.virtual_movable_area <- [];
|
||||||
while (true) {
|
while (true) {
|
||||||
local areadata = Data.Get();
|
local areadata = Data.Get();
|
||||||
if (areadata == "[/virtual movable area]") break;
|
if (areadata == "[/virtual movable area]") break;
|
||||||
local info = [];
|
DataTable.virtual_movable_area.push(areadata);
|
||||||
info.push(areadata);
|
DataTable.virtual_movable_area.push(Data.Get());
|
||||||
for (local i = 0; i< 3; i++) {
|
DataTable.virtual_movable_area.push(Data.Get());
|
||||||
info.push(Data.Get())
|
DataTable.virtual_movable_area.push(Data.Get());
|
||||||
}
|
|
||||||
DataTable.virtual_movable_area.push(info);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -163,25 +189,35 @@ class Map extends Actor {
|
||||||
|
|
||||||
//初始化地板
|
//初始化地板
|
||||||
function InitTile() {
|
function InitTile() {
|
||||||
|
local NormalTileCount = 0;
|
||||||
//普通地板
|
//普通地板
|
||||||
if ("tile" in m_data) {
|
if ("tile" in m_data) {
|
||||||
|
NormalTileCount = m_data.tile.len();
|
||||||
|
//计算地图长度
|
||||||
|
m_length = NormalTileCount * 224;
|
||||||
foreach(pos, path in m_data.tile) {
|
foreach(pos, path in m_data.tile) {
|
||||||
local realpath = m_data.dirpath + path.tolower();
|
local realpath = m_data.dirpath + path.tolower();
|
||||||
local TileObj = Tile(realpath);
|
local TileObj = Tile(realpath);
|
||||||
TileObj.SetAnchor(0.0, 0.0);
|
TileObj.SetAnchor(0.0, 0.0);
|
||||||
TileObj.SetPosition(pos * 224, 0);
|
TileObj.SetPosition(pos * 224, -120 - m_data.background_pos);
|
||||||
LayerObject.bottom.Addchild(TileObj);
|
LayerObject.bottom.Addchild(TileObj);
|
||||||
//计算地图长度
|
|
||||||
m_length += 224;
|
|
||||||
}
|
}
|
||||||
|
//默认地板 + 摄像机偏移 + 默认需要有一个40的添加地板
|
||||||
|
m_height = 560 + 40;
|
||||||
}
|
}
|
||||||
//补充地板
|
//补充地板
|
||||||
if ("extended_tile" in m_data) {
|
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) {
|
foreach(pos, path in m_data.extended_tile) {
|
||||||
local realpath = m_data.dirpath + path.tolower();
|
local realpath = m_data.dirpath + path.tolower();
|
||||||
local TileObj = Tile(realpath);
|
local TileObj = Tile(realpath);
|
||||||
TileObj.SetAnchor(0.0, 0.0);
|
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);
|
LayerObject.bottom.Addchild(TileObj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -189,6 +225,8 @@ class Map extends Actor {
|
||||||
|
|
||||||
//初始化背景动画
|
//初始化背景动画
|
||||||
function InitBackgroundAnimation() {
|
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) {
|
if ("background_animation" in m_data) {
|
||||||
foreach(Info in m_data.background_animation) {
|
foreach(Info in m_data.background_animation) {
|
||||||
|
|
@ -198,14 +236,15 @@ class Map extends Actor {
|
||||||
local AniObj = Animation(realpath);
|
local AniObj = Animation(realpath);
|
||||||
local width = AniObj.GetSize().w;
|
local width = AniObj.GetSize().w;
|
||||||
AniList.push(AniObj);
|
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);
|
local AniObj = Animation(realpath);
|
||||||
AniList.push(AniObj);
|
AniList.push(AniObj);
|
||||||
}
|
}
|
||||||
foreach(pos, ani in AniList) {
|
foreach(pos, ani in AniList) {
|
||||||
ani.SetAnchor(0.0, 0.0);
|
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);
|
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 realpath = m_data.dirpath + info.filename.tolower();
|
||||||
local AniObj = AnimationObject(realpath);
|
local AniObj = AnimationObject(realpath);
|
||||||
AniObj.SetAnchor(0.0, 0.0);
|
AniObj.SetAnchor(0.0, 0.0);
|
||||||
//注意这里默认要增加120的Y轴偏移
|
if (info.layer != "normal") AniObj.SetPositionNoLayer(info.xpos, info.ypos, info.zpos);
|
||||||
if (info.layer != "normal") AniObj.SetPositionNoLayer(info.xpos, info.ypos + m_data.background_pos + 120, info.zpos);
|
else AniObj.SetPosition(info.xpos, info.ypos, info.zpos);
|
||||||
else AniObj.SetPosition(info.xpos, info.ypos + m_data.background_pos + 120, info.zpos);
|
|
||||||
LayerObject[info.layer].Addchild(AniObj);
|
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) {
|
constructor(arg) {
|
||||||
base.constructor();
|
base.constructor();
|
||||||
|
|
||||||
|
|
@ -233,6 +322,9 @@ class Map extends Actor {
|
||||||
InitData(arg);
|
InitData(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//初始化摄像机
|
||||||
|
m_camera = MapCamera(this);
|
||||||
|
|
||||||
//初始化图层
|
//初始化图层
|
||||||
InitLayer();
|
InitLayer();
|
||||||
|
|
||||||
|
|
@ -242,5 +334,77 @@ class Map extends Actor {
|
||||||
InitBackgroundAnimation();
|
InitBackgroundAnimation();
|
||||||
//初始化场景Ani
|
//初始化场景Ani
|
||||||
InitAnimation();
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue