130 lines
3.6 KiB
Plaintext
130 lines
3.6 KiB
Plaintext
/*
|
|
文件名:GameWindow.nut
|
|
路径:UI/ObjectClass/GameWindow.nut
|
|
创建日期:2025-10-18 20:58
|
|
文件用途:游戏窗口类
|
|
*/
|
|
|
|
class GameWindow extends WindowNode {
|
|
//窗口名称
|
|
WindowName = "undefined";
|
|
//是否活动窗口Flag
|
|
IsActiveFlag = false;
|
|
|
|
//标题高度
|
|
TitleH = null;
|
|
//鼠标相对位置
|
|
M_Xpos = null;
|
|
M_Ypos = null;
|
|
//移动Flag
|
|
MoveFlag = false;
|
|
|
|
//是否为独立窗口
|
|
IsIndependent = true;
|
|
//是否为顶层窗口
|
|
IsTop = false;
|
|
|
|
function _typeof() {
|
|
return "GameWindow";
|
|
}
|
|
|
|
constructor(WindowName, gX, gY, gWidth, gHeight, gTitleHeight) {
|
|
base.constructor();
|
|
//窗口名字
|
|
this.WindowName = WindowName;
|
|
//宽度
|
|
Width = gWidth;
|
|
//高度
|
|
Height = gHeight;
|
|
//标题高度
|
|
TitleH = gTitleHeight;
|
|
|
|
//X坐标
|
|
X = gX;
|
|
//Y坐标
|
|
Y = gY;
|
|
SetPos(X, Y);
|
|
}
|
|
|
|
function ResetFoucus() {
|
|
SetVisible(true);
|
|
//遍历全局窗口数组将自己移除重新添加在末尾
|
|
foreach (Index, WindowObj in _SYS_WINDOW_LIST_) {
|
|
if (WindowObj.WindowName == this.WindowName) {
|
|
_SYS_WINDOW_LIST_.remove(Index);
|
|
break;
|
|
}
|
|
}
|
|
_SYS_WINDOW_LIST_.append(this);
|
|
SetZOrder(_SYS_WINDOW_LIST_.len());
|
|
}
|
|
|
|
//关闭窗口 -并没有销毁只是隐藏
|
|
function CloseWindow() {
|
|
this.Visible = false;
|
|
}
|
|
|
|
//销毁全局UI中的窗口 子窗口只要父窗口被销毁就会被销毁
|
|
function DestroyWindow() {
|
|
this.Visible = false;
|
|
this.DestroyFlag = true;
|
|
}
|
|
|
|
function Proc(Dt) {
|
|
base.Proc(Dt);
|
|
foreach (Window in Childrens) {
|
|
if (Window instanceof WindowNode) Window.Proc(Dt);
|
|
}
|
|
}
|
|
|
|
//鼠标事件回调
|
|
function OnMouseEvent(Type, Data, EventInteractiveFlag) {
|
|
if (!Visible) return;
|
|
foreach (Window in Childrens) {
|
|
if ("OnMouseEvent" in Window) Window.OnMouseEvent(Type, Data,EventInteractiveFlag);
|
|
}
|
|
//鼠标移动事件
|
|
if (Type == UI_EVENT.MOUSEMOTION) {
|
|
if (MoveFlag) {
|
|
//左键拖动
|
|
X = B_X - (M_Xpos - Data[0]);
|
|
Y = B_Y - (M_Ypos - Data[1]);
|
|
}
|
|
}
|
|
//鼠标按下事件
|
|
else if (Type == UI_EVENT.MOUSEBUTTONDOWN) {
|
|
local IMouse = Game_Cursor.GetInstance();
|
|
//如果点击事件在窗口内
|
|
if (Math.IsIntersectRect(IMouse.MouseX, IMouse.MouseY, 1, 1, X, Y, Width, Height) && !EventInteractiveFlag) {
|
|
if (IsIndependent) ResetFoucus();
|
|
//如果点下去在标题栏
|
|
if (Math.IsIntersectRect(IMouse.MouseX, IMouse.MouseY, 1, 1, X, Y, Width, TitleH)) {
|
|
MoveFlag = true;
|
|
M_Xpos = IMouse.MouseX; //原始鼠标位置数据
|
|
M_Ypos = IMouse.MouseY;
|
|
B_X = X; //原始窗口位置
|
|
B_Y = Y;
|
|
}
|
|
}
|
|
}
|
|
//鼠标弹起事件
|
|
else if (Type == UI_EVENT.MOUSEBUTTONUP) {
|
|
if (MoveFlag) {
|
|
MoveFlag = false;
|
|
M_Xpos = null;
|
|
M_Ypos = null;
|
|
B_X = null;
|
|
B_Y = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
//键盘事件回调
|
|
function OnKeyEvent(Type, Data, EventInteractiveFlag) {
|
|
if (!Visible) return;
|
|
foreach (Window in Childrens) {
|
|
if ("OnKeyEvent" in Window) Window.OnKeyEvent(Type, Data);
|
|
}
|
|
}
|
|
}
|