/* 文件名:NewWorldMap.nut 路径:Project/NewWorldMap/NewWorldMap.nut 创建日期:2024-10-27 10:24 文件用途:新世界地图 */ class NewWorldMapC extends LenheartNewUI_Windows { //调试模式 // DeBugMode = true; //不是窗口 // NoWindow = true; //是否可见 // Visible = false; //区域 Region = null; //Img WorldMapImg = null; Ani = null; constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) { Childrens = []; Region = []; //注册控件 RegisterWidget(); LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH); InitData(); // printT(Region); LoadImg(); } function LoadImg() { WorldMapImg = Rindro_Image("worldmap.img"); } function InitData() { local RegionLst = R_Utils.GetScriptFileReader("region/region.lst"); if (RegionLst) { local IO = Sq_Point2Blob(L_sq_P2I(RegionLst.Buffer.C_Object), RegionLst.Size); local i = 2; while (i< RegionLst.Size) { if ((RegionLst.Size - i) >= 10) { IO.seek(i + 6); //内容指示位 local FindKey = IO.readn('i'); local Key = Rindro_Script.GetBinString(FindKey); if (Key) { local StrFilePath = "region/" + Key.tolower(); InitRegion(StrFilePath); } } else break; i += 10; } InitMiniMap(); } } function InitRegion(Path) { local RegionData = R_Utils.GetScriptFileReader(Path); if (RegionData) { local Data = {}; if (RegionData.Size >= 7) { //创建Blob对象 local IO = Sq_Point2Blob(L_sq_P2I(RegionData.Buffer.C_Object), RegionData.Size); //以5为单步从第二位开始遍历字节 local i = 2; while (true) { if (i< RegionData.Size && RegionData.Size - i >= 5) { local str = Rindro_Script.UnpackData(IO, i); i += 5; //城镇编号 if (str == "[towns]") { Data.Towns <- {}; while (true) { local Ret = Rindro_Script.UnpackData(IO, i); i += 5; if (Ret == "[/towns]") break; Data.Towns.rawset((Ret.tointeger() - 9), {}); } } //名称 else if (str == "[name]" || str == "[english name]" || str == "[minimap]") { local RealKey = str.slice(1, str.len() - 1); local Ret = Rindro_Script.UnpackData(IO, i); if (str == "[name]") Ret = Sq_ConvertWideChar(Ret, "big5") Data[RealKey] <- Ret; i += 5; } } else break; } } Region.append(Data); } } function InitMiniMap() { foreach(Pos, Value in Region) { local Path = "region/" + Value.minimap.tolower(); local MiniMapData = R_Utils.GetScriptFileReader(Path); if (MiniMapData) { local Data = {}; if (MiniMapData.Size >= 7) { //创建Blob对象 local IO = Sq_Point2Blob(L_sq_P2I(MiniMapData.Buffer.C_Object), MiniMapData.Size); //以5为单步从第二位开始遍历字节 local i = 2; while (true) { if (i< MiniMapData.Size && MiniMapData.Size - i >= 5) { local str = Rindro_Script.UnpackData(IO, i); i += 5; //城镇编号 if (str == "[image]") { Data.Image <- {}; while (true) { local Ret = Rindro_Script.UnpackData(IO, i); i += 5; if (Ret == "[/image]") break; local imgpath = Rindro_Script.UnpackData(IO, i); i += 5; local imgframe = Rindro_Script.UnpackData(IO, i).tointeger() - 9; i += 5; Data.Image.rawset(Ret, { path = imgpath, frame = imgframe }); } } } else break; } } } } } function RegisterWidget() { // //关闭按钮 // local CloseButton = LenheartNewUI_BaseButton(278, 0, 11, 12, "interface/lenheartwindowcommon.img", 276); // CloseButton.OnClick = function() { // this.Visible = false; // }.bindenv(this); // Childrens.append(CloseButton); } Timer = Clock(); function GetMoveOffset(L, R) { return (-L) + (L.tofloat() * (R.tofloat() / 100.0)).tointeger() } //绘制主界面 function DrawMain(obj) { //绘制背景 WorldMapImg.DrawExPng(0, 0, -83, 0, 0xffffffff, 0.84, 0.84); local UniRate = sq_GetAccel(0, 100, Clock() - Timer, 1000); local AccRate = sq_GetAccel(0, 100, Clock() - Timer, 1000, true); //绘制左上云1 WorldMapImg.DrawExPng(1, GetMoveOffset(100, AccRate), 0, 0, sq_RGBA(255, 255, 255, ((UniRate.tofloat() / 100.0) * 255.0).tointeger()), 0.84, 0.84); //绘制左上云2 WorldMapImg.DrawExPng(2, GetMoveOffset(100, AccRate), GetMoveOffset(50, AccRate), 0, sq_RGBA(255, 255, 255, ((UniRate.tofloat() / 100.0) * 255.0).tointeger()), 0.84, 0.84); //绘制左下云 WorldMapImg.DrawExPng(3, GetMoveOffset(100, AccRate), 404 + GetMoveOffset(-50, AccRate), 0, sq_RGBA(255, 255, 255, ((UniRate.tofloat() / 100.0) * 255.0).tointeger()), 0.84, 0.84); //绘制右上云 WorldMapImg.DrawExPng(4, 868 + GetMoveOffset(-100, AccRate), 0, 0, sq_RGBA(255, 255, 255, ((UniRate.tofloat() / 100.0) * 255.0).tointeger()), 0.84, 0.84); //绘制右下云 WorldMapImg.DrawExPng(5, 762 + GetMoveOffset(-100, AccRate), 389 + GetMoveOffset(-50, AccRate), 0, sq_RGBA(255, 255, 255, ((UniRate.tofloat() / 100.0) * 255.0).tointeger()), 0.84, 0.84); // local ani = obj.getVar().GetAnimationMap("test", "common/test.ani"); // sq_SetfRotateAngle(ani, sq_ToRadian(60.0)); // sq_AnimationProc(ani); // sq_drawCurrentFrame(ani, 200, 200, true); // Ani.Draw(400, 400); local angle = (GetMoveOffset(135, UniRate).tofloat()) % 360; //中心点 local centerX = 120.0 * 0.6 / 2; local centerY = 120.0 * 0.6 / 2; local Lenght = sqrt(centerX * centerX + centerY * centerY); local atan = sq_ToDegree(sq_Atan2(centerY, centerX)); local NextAngle = (atan + angle).tointeger(); local NextX = (Lenght * sq_CosTable(NextAngle)); local NextY = (Lenght * sq_SinTable(NextAngle)); local newRelX = (centerX - NextX); local newRelY = (centerY - NextY); WorldMapImg.DrawExPng(7, 20, 470, 0, sq_RGBA(255, 255, 255, ((UniRate.tofloat() / 100.0) * 255.0).tointeger()), 0.6, 0.6); WorldMapImg.DrawExPng(6, 39 + newRelX, 489 + newRelY, sq_ToRadian(-angle.tofloat()), 0xffffffff, 0.6, 0.6); } function Show(obj) { DrawMain(obj); LenheartNewUI_Windows.Show(obj); } //逻辑入口 function Proc(obj) { LenheartNewUI_Windows.SyncPos(X, Y); } //简便性能高的开平方 function sqrt(sum) { local i = (sum / 2).tofloat(); local isb = 0; for (isb = 0; isb< 10; isb++) { i = (i - ((i * i - sum) / (2 * i))).tofloat(); } return i; } } getroottable().rawdelete("NewWorldMap_Obj"); function Lenheart_NewWorldMap_Fun(obj) { local RootTab = getroottable(); if (!RootTab.rawin("NewWorldMap_Obj")) { RootTab.rawset("NewWorldMap_Obj", true); LenheartNewUI_CreateWindow(NewWorldMapC, "新世界地图", 0, 0, getroottable().Rindro_Scr_Width, 600, 0); } } getroottable()["LenheartFuncTab"].rawset("NewWorldMapFuncN", Lenheart_NewWorldMap_Fun);