/* 文件名:UiClassTool.nut 路径:Tool/UiClassTool.nut 创建日期:2024-03-20 11:27 文件用途:UI */ LenheartNewUI <- {} //基础窗口类 class LenheartNewUI.BaseWindow extends BasicsDrawTool { constructor() { } //鼠标事件回调 function OnMouseProc(Flag, MousePos_X, MousePos_Y) {} //鼠标左键按下回调 function OnMouseLbDown(MousePos_X, MousePos_Y) { } //鼠标左键弹起回调 function OnMouseLbUp(MousePos_X, MousePos_Y) { } //鼠标右键按下回调 function OnMouseRbDown(MousePos_X, MousePos_Y) { } //鼠标右键弹起回调 function OnMouseRbUp(MousePos_X, MousePos_Y) { } //鼠标滚轮时间回调 function OnMouseWheel(Flag, MousePos_X, MousePos_Y) { } } class LenheartNewUI.Windows extends LenheartNewUI.BaseWindow { //MyObjectId ObjectId = null; //可用性 Visible = true; //宽度 Width = null; //高度 Height = null; //标题高度 TitleH = null; //调试模式 DeBugMode = false; //X坐标 X = null; B_X = null; //Y坐标 Y = null; B_Y = null; M_Xpos = null; M_Ypos = null; //移动Flag MoveFlag = false; YMouseSw = true; //焦点 Focus = true; constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) { ObjectId = gObjectId; foreach(Index, WindowObj in L_Windows_List) { if (WindowObj.ObjectId == this.ObjectId) return; } //宽度 Width = gWidth; //高度 Height = gHeight; //标题高度 TitleH = gTitleH; //X坐标 X = gX; //Y坐标 Y = gY; Init(); } function ResetFocus() { foreach(Index, WindowObj in L_Windows_List) { if (WindowObj.ObjectId == this.ObjectId) L_Windows_List.remove(Index); WindowObj.Focus = false; } this.Focus = true; L_Windows_List.append(this); } //加入窗口队列 function Init() { ResetFocus(); } //设定鼠标逻辑 function LockMouse(MousePos_X, MousePos_Y) { if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, Width, Height)) { IMouse.LockMouseClick(); YMouseSw = false; L_sq_WA(0x1b46898, 1); IMouse.LockState <- true; } else { if (YMouseSw == false && sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, 0, 0, 800, 600) && !MoveFlag) { IMouse.ReleaseMouseClick(); YMouseSw = true; L_sq_WA(0x1b46898, 0); IMouse.LockState <- false; } } } function Show(obj) { if (!Visible) return; // L_sq_DrawImg("interface2/yosin/tbjp.img", 4, X, Y + 1); if (DeBugMode) DeBug(obj); } function DeBug(obj) { sq_DrawBox(X, Y, Width, Height, 0xffffffff); sq_DrawBox(X, Y, Width, TitleH, 0xffffffff); } //override function OnMouseProc(Flag, MousePos_X, MousePos_Y) { if (!Visible) return; //设定鼠标逻辑 if (!MoveFlag) LockMouse(MousePos_X, MousePos_Y); if (Flag == 1) { if (MoveFlag) { //左键拖动 X = B_X - (M_Xpos - MousePos_X); Y = B_Y - (M_Ypos - MousePos_Y); } } } //override //鼠标左键按下回调 function OnMouseLbDown(MousePos_X, MousePos_Y) { if (!Visible) return; //如果点击事件在窗口内 if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, Width, Height)) { ResetFocus(); //如果点下去在标题栏 if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, Width, TitleH)) { MoveFlag = true; M_Xpos = MousePos_X; //原始鼠标位置数据 M_Ypos = MousePos_Y; B_X = X; //原始窗口位置 B_Y = Y; } } } //override //鼠标左键弹起回调 function OnMouseLbUp(MousePos_X, MousePos_Y) { if (!Visible) return; if (MoveFlag) { MoveFlag = false; M_Xpos = null; M_Ypos = null; B_X = null; B_Y = null; } } //override //鼠标右键按下回调 function OnMouseRbDown(MousePos_X, MousePos_Y) { if (!Visible) return; } //override //鼠标右键弹起回调 function OnMouseRbUp(MousePos_X, MousePos_Y) { if (!Visible) return; } //override //鼠标滚轮时间回调 function OnMouseWheel(Flag, MousePos_X, MousePos_Y) { if (!Visible) return; } } //遍历窗口查询是否有悬停在新窗口中 function CheackMouseInNewWindows(MousePos_X, MousePos_Y) { local Flag = false; foreach(Window in L_Windows_List) { if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Window.X, Window.Y, Window.Width, Window.Height)) { Flag = true; return Flag; } } return Flag; } //鼠标事件 /* a1 常规状态 200 左键点击 201 左键松开 202 右键点击 204 右键松开 205 滚轮滚动事件 20a 看a2 如果是ff880000 向下 如果是780000 向上 中建按下没有事件 鼠标事件为200 并且a2 = 1 为左键拖动 a2=2为右键拖动 中建按下拖动a2 =10 a2=3的时候代表2个键一起按下 事件代表后按下的键*/ //如果根空间没有选定AB层的Flag 就新建一个 默认是false 渲染在下层 if (!("WindowsShowABFlag" in getroottable())) { getroottable().WindowsShowABFlag <- false; } function L_MouseCallBack(MouseState, MouseFlag, MousePos_X, MousePos_Y) { //如果渲染层级在下级 即A层 或者是 鼠标没有悬停在任何新窗口上时 执行判断 如果悬停在原生窗口 就解除鼠标锁定 如果点击 就改变渲染层级 if (!getroottable().WindowsShowABFlag || !CheackMouseInNewWindows(MousePos_X, MousePos_Y)) { if (L_sq_RA(0x1A32950) != 92 && L_sq_RA(0x1A32950) != 2396) { if ("LockState" in IMouse) { if (IMouse.LockState) { IMouse.ReleaseMouseClick(); IMouse.LockState <- false; } } //如果点击了原生窗口 就把渲染队列改成下 if (MouseState == 0x201) getroottable().WindowsShowABFlag <- false; return; } } //克隆一遍窗口列表 local WindowListF = clone(L_Windows_List); WindowListF.reverse(); //判断滚石是向上还是向下的 local Flag = MouseFlag == 0xff880000 ? 0 : 1; foreach(Window in WindowListF) { if (Window.Visible) { switch (MouseState) { //常规或者拖动事件 case 0x200: { Window.OnMouseProc(MouseFlag, MousePos_X, MousePos_Y); break; } //左键点击 case 0x201: { //如果点击了新窗口就把渲染队列改成上 getroottable().WindowsShowABFlag <- true; Window.OnMouseLbDown(MousePos_X, MousePos_Y); break; } //左键松开 case 0x202: { Window.OnMouseLbUp(MousePos_X, MousePos_Y); break; } //右键点击 case 0x204: { Window.OnMouseRbDown(MousePos_X, MousePos_Y); break; } //右键松开 case 0x205: { Window.OnMouseRbUp(MousePos_X, MousePos_Y); break; } //滚轮事件 case 0x20a: { Window.OnMouseWheel(Flag, MousePos_X, MousePos_Y); break; } } if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Window.X, Window.Y, Window.Width, Window.Height)) return; } } } // if (!getroottable().rawin("L_Windows_List")) L_Windows_List <- []; // if (!getroottable().rawin("asdasdasd")) { // getroottable().asdasdasd <- 1; // local Win = LenheartNewUI.Windows("测试框",120, 100, 329, 382, 30); // Win.DeBugMode = true; // local Win2 = LenheartNewUI.Windows(250, 100, 329, 382, 30); // Win2.Init(); // local Win3 = LenheartNewUI.Windows(360, 100, 329, 382, 30); // Win3.Init(); // } //窗口逻辑入口 function L_WindowsLogic(obj) { // print(Clock()); //是否存在一个窗口Flag local WindowExistence = false; //遍历窗口队列 如果可见则调用Show 只要有一个可见就写入Flag foreach(Window in L_Windows_List) { if (Window.Visible) { Window.Proc(obj); Window.Show(obj); WindowExistence = true; } } //如果可见 需要调用一个原生窗口抵消ESC if (WindowExistence) { local W = sq_GetPopupWindowMainCotrol(170); if (!W) L_NewWindows("Lenheart", 170, 0x65535); else { W.SetVisible(false); W.SetEnable(false); } } //如果按下ESC键要将所有的窗口关闭 if (KeyPressNB.isKeyPress(48, "AllLenheartWindows")) { foreach(Window in L_Windows_List) { Window.Visible = false; Window.YMouseSw = true; } L_sq_WA(0x1b46898, 0); IMouse.ReleaseMouseClick(); } } function L_DrawWindow_A() { local obj = sq_GetMyMasterCharacter(); if (!obj) return; //A层只在下层渲染 if (getroottable().WindowsShowABFlag == false) L_WindowsLogic(obj); } function L_DrawWindow_B() { local obj = sq_GetMyMasterCharacter(); if (!obj) return; //B层只在上层渲染 if (getroottable().WindowsShowABFlag) L_WindowsLogic(obj); //因为图层太高会盖掉鼠标 所以重新画一个 L_sq_DrawImg("interface/newstyle/windows/cursor.img", 0, IMouse.GetXPos(), IMouse.GetYPos()); }