240 lines
8.6 KiB
Plaintext
240 lines
8.6 KiB
Plaintext
|
|
/*
|
||
|
|
文件名: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);
|