11123
This commit is contained in:
357
Tool/UiClassTool.nut
Normal file
357
Tool/UiClassTool.nut
Normal file
@@ -0,0 +1,357 @@
|
||||
/*
|
||||
文件名: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());
|
||||
}
|
||||
Reference in New Issue
Block a user