diff --git a/Game/StateMachine/StateMachine.nut b/Game/StateMachine/StateMachine.nut index 12c65c1..ff561e1 100644 --- a/Game/StateMachine/StateMachine.nut +++ b/Game/StateMachine/StateMachine.nut @@ -27,7 +27,7 @@ class StateMachine { /** * 静态方法:获取唯一实例 * @function - * @returns {table} + * @returns {StateMachine} */ function GetInstance() { if (!getroottable().rawin("__StateMachine__")) { diff --git a/SquirrelFileConfig.cfg b/SquirrelFileConfig.cfg index f12c885..17c46da 100644 --- a/SquirrelFileConfig.cfg +++ b/SquirrelFileConfig.cfg @@ -12,5 +12,10 @@ Game/CharacterScript/Common/Rest.nut Game/CharacterScript/Common/Move.nut +UI/ObjectClass/BaseNode.nut +UI/ObjectClass/Actor.nut +UI/ObjectClass/WindowNode.nut +UI/ObjectClass/GameWindow.nut +UI/ObjectClass/Sprite.nut UI/MainUI.nut main.nut \ No newline at end of file diff --git a/UI/MainUI.nut b/UI/MainUI.nut index a9dbae6..99b47f0 100644 --- a/UI/MainUI.nut +++ b/UI/MainUI.nut @@ -5,18 +5,23 @@ 文件用途:主界面UI */ //主界面UI初始化回调 -function _MainUI_Enter_() -{ +function _MainUI_Enter_(UI_Scene) { + if (!_SYS_UI_SCENE_Instance_) _SYS_UI_SCENE_Instance_ = Actor(UI_Scene) + + local TestWindow = sq_CreaterWindow("测试窗口", GameWindow) + TestWindow.ResetFoucus() + + local Sp = Sprite( + "sprite/interface2/worldmap/step_2(area)/step_2(area)_bg.img", + 12 + ) + TestWindow.AddChild(Sp) } //主界面UI事件回调 -function _MainUI_HandleEvents_(event) -{ -} +function _MainUI_HandleEvents_(event) {} //主界面UI更新回调 -function _MainUI_Update_(deltaTime) -{ +function _MainUI_Update_(deltaTime) { + _Global_Windows_Logic_(deltaTime) } //主界面UI退出回调 -function _MainUI_Exit_() -{ -} \ No newline at end of file +function _MainUI_Exit_() {} diff --git a/UI/ObjectClass/Actor.nut b/UI/ObjectClass/Actor.nut new file mode 100644 index 0000000..611cb6a --- /dev/null +++ b/UI/ObjectClass/Actor.nut @@ -0,0 +1,31 @@ +/* +文件名:Actor.nut +路径:UI/ObjectClass/Actor.nut +创建日期:2025-10-18 16:33 +文件用途: +*/ +class Actor extends BaseNode { + function _typeof() { + return "Actor" + } + + constructor(obj = null) { + if (obj) { + base.constructor(obj, false) + } else { + base.constructor(sq_CreateActor()) + } + } + + function AddChild(Act) { + sq_AddChild(this.C_Object, Act.C_Object) + } + + function RemoveChild(Act) { + sq_RemoveChild(this.C_Object, Act.C_Object) + } + + function SetZOrder(Order){ + sq_SetZOrder(this.C_Object, Order); + } +} diff --git a/UI/ObjectClass/BaseNode.nut b/UI/ObjectClass/BaseNode.nut new file mode 100644 index 0000000..24871ff --- /dev/null +++ b/UI/ObjectClass/BaseNode.nut @@ -0,0 +1,16 @@ +/* +文件名:BaseNode.nut +路径:UI/ObjectClass/BaseNode.nut +创建日期:2025-10-18 20:43 +文件用途: +*/ +class BaseNode { + /** @private */ + C_Object = null + + constructor(CObject, DestructFlag = true) { + this.C_Object = CObject + //析构对象 + if (DestructFlag) sq_RegisterDestruction(C_Object, this) + } +} diff --git a/UI/ObjectClass/GameWindow.nut b/UI/ObjectClass/GameWindow.nut new file mode 100644 index 0000000..cecbd9e --- /dev/null +++ b/UI/ObjectClass/GameWindow.nut @@ -0,0 +1,87 @@ +/* +文件名:GameWindow.nut +路径:UI/ObjectClass/GameWindow.nut +创建日期:2025-10-18 20:58 +文件用途:游戏窗口类 +*/ +_SYS_UI_SCENE_Instance_ <- null +_SYS_WINDOW_LIST_ <- [] + +class GameWindow extends WindowNode { + //窗口名称 + WindowName = "undefined" + + function _typeof() { + return "GameWindow" + } + + constructor(WindowName) { + base.constructor() + } + + 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 Proc(Dt) { + + } +} + +/** + * + * @function + * @param {any} WindowName + * @param {GameWindow} WindowClass + * @returns {any} + */ +function sq_CreaterWindow(WindowName, WindowClass) { + foreach (idx, val in _SYS_WINDOW_LIST_) { + if (val.WindowName == WindowName) return val; + } + + local NewWindow = WindowClass(WindowName); + 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); + } + } +} + + + + diff --git a/UI/ObjectClass/Sprite.nut b/UI/ObjectClass/Sprite.nut new file mode 100644 index 0000000..205174d --- /dev/null +++ b/UI/ObjectClass/Sprite.nut @@ -0,0 +1,15 @@ +/* +文件名:Sprite.nut +路径:UI/ObjectClass/Sprite.nut +创建日期:2025-10-18 19:51 +文件用途:精灵类 +*/ +class Sprite extends Actor { + function _typeof() { + return "Sprite" + } + + constructor(ImgPath, Idx) { + base.constructor(sq_CreateSprite(ImgPath, Idx)) + } +} diff --git a/UI/ObjectClass/WindowNode.nut b/UI/ObjectClass/WindowNode.nut new file mode 100644 index 0000000..285fc2a --- /dev/null +++ b/UI/ObjectClass/WindowNode.nut @@ -0,0 +1,43 @@ +/* +文件名:WindowNode.nut +路径:UI/ObjectClass/WindowNode.nut +创建日期:2025-10-18 20:54 +文件用途:窗口节点类 +*/ +class WindowNode extends Actor { + //演出状态 + PerformanceState = false; + //子控件 + Childrens = null; + //刷新函数 + UpdateFunc = null; + //是否可见 + Visible = true; + //宽度 + Width = null; + //高度 + Height = null; + //销毁Flag + DestroyFlag = false; + + + function _typeof() { + return "WindowNode" + } + + constructor() { + base.constructor() + + //子控件list初始化 + Childrens = [] + } + + function SetVisible(Flag) { + Visible = Flag + } + + function AddChild(Act) { + base.AddChild(Act) + Childrens.push(Act) + } +} diff --git a/folder-alias.json b/folder-alias.json index ef8839c..f655ec6 100644 --- a/folder-alias.json +++ b/folder-alias.json @@ -31,5 +31,20 @@ }, "UI/MainUI.nut": { "description": "UI入口" + }, + "UI/ObjectClass": { + "description": "对象类" + }, + "UI/ObjectClass/Actor.nut": { + "description": "演员类" + }, + "UI/ObjectClass/Sprite.nut": { + "description": "精灵类" + }, + "UI/ObjectClass/BaseNode.nut": { + "description": "基础节点" + }, + "UI/ObjectClass/WindowNode.nut": { + "description": "窗口节点" } } \ No newline at end of file diff --git a/internalInterfaceDoc/func.nut b/internalInterfaceDoc/func.nut index 35e173b..c6d3b17 100644 --- a/internalInterfaceDoc/func.nut +++ b/internalInterfaceDoc/func.nut @@ -81,9 +81,7 @@ function sq_SetVars(C_Object, Name, Type, Value) {} * @param {any} C_Object * @returns {void} */ -function sq_GetDirection(C_Object) { - -} +function sq_GetDirection(C_Object) {} /** * * @function @@ -92,3 +90,10 @@ function sq_GetDirection(C_Object) { * @returns {void} */ function sq_SetDirection(C_Object, Dir) {} + +function sq_CreateActor() {} +function sq_RegisterDestruction(a,b) {} +function sq_CreateSprite(a,b) {} +function sq_AddChild(a,b){} +function sq_RemoveChild(a,b){} +function sq_SetZOrder(a,b){} \ No newline at end of file diff --git a/main.nut b/main.nut index d3a8ebc..e566823 100644 --- a/main.nut +++ b/main.nut @@ -1,4 +1,5 @@ function main() { + local SM = StateMachine.GetInstance(); SM.RegisterState(CHARACTERJOB.SWORDMAN, "Character_Rest", 0);