控件框架基础引入
This commit is contained in:
@@ -4,8 +4,6 @@
|
||||
创建日期:2025-10-18 20:58
|
||||
文件用途:游戏窗口类
|
||||
*/
|
||||
_SYS_UI_SCENE_Instance_ <- null;
|
||||
_SYS_WINDOW_LIST_ <- [];
|
||||
|
||||
class GameWindow extends WindowNode {
|
||||
//窗口名称
|
||||
@@ -13,12 +11,39 @@ class GameWindow extends WindowNode {
|
||||
//是否活动窗口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() {
|
||||
@@ -34,83 +59,71 @@ class GameWindow extends WindowNode {
|
||||
SetZOrder(_SYS_WINDOW_LIST_.len());
|
||||
}
|
||||
|
||||
function Proc(Dt) {}
|
||||
//关闭窗口 -并没有销毁只是隐藏
|
||||
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) {
|
||||
function OnMouseEvent(Type, Data, EventInteractiveFlag) {
|
||||
if (!Visible) return;
|
||||
foreach (Window in Childrens) {
|
||||
if (Window instanceof WindowNode) Window.OnMouseEvent(Type, Data);
|
||||
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) {
|
||||
function OnKeyEvent(Type, Data, EventInteractiveFlag) {
|
||||
if (!Visible) return;
|
||||
foreach (Window in Childrens) {
|
||||
if (Window instanceof WindowNode) Window.OnKeyEvent(Type, Data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @function
|
||||
* @param {any} WindowName
|
||||
* @param {GameWindow} WindowClass
|
||||
* @returns {any}
|
||||
*/
|
||||
function sq_CreaterWindowInstance(WindowName, WindowClass, gX, gY, gWidth, gHeight, gTitleHeight) {
|
||||
foreach (idx, val in _SYS_WINDOW_LIST_) {
|
||||
if (val.WindowName == WindowName) return val;
|
||||
}
|
||||
|
||||
local NewWindow = WindowClass(WindowName, gX, gY, gWidth, gHeight, gTitleHeight);
|
||||
getroottable()._SYS_WINDOW_LIST_.push(NewWindow);
|
||||
return NewWindow;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @function
|
||||
* @param {float} Dt
|
||||
* @returns {void}
|
||||
*/
|
||||
function _Global_Windows_Logic_(Dt) {
|
||||
if (_SYS_UI_SCENE_Instance_) {
|
||||
for (local i = 0; i < _SYS_WINDOW_LIST_.len(); i++) {
|
||||
local Window = _SYS_WINDOW_LIST_[i];
|
||||
//如果窗口不可见并且 处于演出状态
|
||||
if (!Window.Visible && Window.PerformanceState) {
|
||||
Window.PerformanceState = false;
|
||||
_SYS_UI_SCENE_Instance_.RemoveChild(Window);
|
||||
if (Window.DestroyFlag) {
|
||||
_SYS_WINDOW_LIST_.remove(i);
|
||||
i--;
|
||||
}
|
||||
} else if (Window.Visible && !Window.PerformanceState) {
|
||||
_SYS_UI_SCENE_Instance_.AddChild(Window);
|
||||
Window.PerformanceState = true;
|
||||
}
|
||||
//无论窗口是否显示都需要调用Proc
|
||||
Window.Proc(Dt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function _Global_Windows_Events_(EventType, EventData) {
|
||||
//先传递鼠标事件
|
||||
Game_Cursor.GetInstance().Event(EventType, EventData);
|
||||
//事件是否被响应Flag
|
||||
local EventInteractiveFlag = false;
|
||||
for (local i = _SYS_WINDOW_LIST_.len() - 1; i > -1; i--) {
|
||||
local Window = _SYS_WINDOW_LIST_[i];
|
||||
if (Window.Visible) {
|
||||
if (EventType == UI_EVENT.MOUSEMOTION || EventType == UI_EVENT.MOUSEBUTTONDOWN || EventType == UI_EVENT.MOUSEBUTTONUP) {
|
||||
Window.OnMouseEvent(EventType, EventData);
|
||||
} else if (EventType == UI_EVENT.KEYDOWN || EventType == UI_EVENT.KEYUP) {
|
||||
Window.OnKeyEvent(EventType, EventData);
|
||||
}
|
||||
if ("OnKeyEvent" in Window) Window.OnKeyEvent(Type, Data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user