# CSOL缔造者_MaiMaiFramework **Repository Path**: UmaruIsBoy/MaiMaiFramework.lua ## Basic Information - **Project Name**: CSOL缔造者_MaiMaiFramework - **Description**: CSOL缔造者游戏模式开发框架 - **Primary Language**: Lua - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 2 - **Created**: 2021-10-06 - **Last Updated**: 2025-12-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: CSOL缔造者 ## README
# 前言 CSOL缔造者LUA的脚本多种多样。但是往往地图作者不会使用LUA,而LUA的编写者又不会做地图。或者当你需要移植其他作者的脚本却无从下手。为了建立起作者与脚本编写者的桥梁,为了能够让脚本能够模块化,更高的移植性,能够让不会编写LUA的作者们也能够轻易的使用,扩展,移植别人的插件,MaiMaiFramework诞生了
注意:这个LUA框架只能在CSOL缔造者游戏模式环境下使用 # 一、MaiMaiFramework是什么? MaiMaiFramework是基于事件的隐式调用的CSOL缔造者框架。为了能够让不会LUA的作者也能够快速掌握使用、扩展、移植其他LUA脚本编写者的脚本。为了实现这一目标,脚本编写者必须按照一定的规则来编写脚本。这些脚本将作为插件通过注册的方式静态或者动态的载入到框架中。 # 二、插件使用者看这里 ## 1.下载MaiMaiFramework.lua 下载main分支的MaiMaiFramework.lua[就是这个文件](https://gitee.com/UmaruIsBoy/MaiMaiFramework.lua/blob/main/MaiMaiFramework.lua). ## 2.更改project.json内容 ```c { "game": ["MaiMaiFramework.lua"], "ui": ["MaiMaiFramework.lua"] } ``` 现在还没有插件,如果有,就像这样添加新的插件 ```c { "game": ["MaiMaiFramework.lua", "ExamplePlug.lua"], "ui": ["MaiMaiFramework.lua", "ExamplePlug.lua"] } ```
# 三、插件开发者看这里 ## 1.新建一个插件 一般插件会同时写在Game和UI文件中,新建AddHealthPlug.lua放在工程目录下 ## 2.编写插件和注册方法 ```lua --编写插件 if Game then function MyGameFunc(player,msg) if string.find(msg,"增加生命值") then local value=string.gsub(msg,"增加生命值","") player.health=player.health+tonumber(value) end end end if UI then function MyUIFunc(msg) UI.SignalPlus(msg) end end --注册方法到框架中 if Game then Framework.GamePlug.OnPlayerSignalPlus:Register(MyGameFunc) end if UI then Framework.UIPlug.OnChat:Register(MyUIFunc) end ``` 聊天框输入增加生命值100,输入消息的玩家生命值增加100 ## 3.在json中添加插件 [下载MaiMaiFramework.lua](https://gitee.com/UmaruIsBoy/MaiMaiFramework.lua/releases)并且添加你的插件 ```c { "game": ["MaiMaiFramework.lua", "AddHealthPlug.lua"], "ui": ["MaiMaiFramework.lua", "AddHealthPlug.lua"] } ``` 在CSOL缔造者游戏模式中测试脚本查看效果 # 四、开发文档 ## 1、注册方法 例:服务端插件注册 ```lua Framework.GamePlug.OnUpdate:Register() Framework.GamePlug.OnUpdate:UnRegister() ``` 例:客户端插件注册 ```lua Framework.UIPlug.OnUpdate:Register() Framework.UIPlug.OnUpdate:UnRegister() ``` 服务端(Game)中能够注册的方法 OnKilled OnRoundStart OnRoundStartFinished OnPlayerJoiningSpawn OnPlayerSignal OnTakeDamage OnPlayerKilled OnPlayerSpawn OnPlayerConnect OnPlayerDisconnect OnGetWeapon OnGameSave OnLoadGameSave OnClearGameSave OnReload OnReloadFinished OnSwitchWeapon PostFireWeapon CanBuyWeapon CanHaveWeaponInHand OnUpdate OnPlayerUpdate OnPlayerLaterUpdate OnPlayerSignalPlus 客户端(UI)中能够注册的方法 OnRoundStart OnSpawn OnKilled OnChat OnInput OnKeyDown OnKeyUp OnSignal OnKeyDown OnUpdate OnLaterUpdate OnSignalPlus ## 2、参数说明 ### 1)官方方法 官方方法注册的方法参数看:[官方文档](https://tw.beanfun.com/cso/STUDIO/api/index.html)(已失效) 注册到官方客户端(UI)方法示例 ```lua --注册匿名方法 Framework.UIPlug.OnUpdate:Register( function(t) print("在UI中每帧执行") end ) --注册普通方法 function MyOnKeyDown(inputs) if inputs[UI.KEY.A]==true then print("a key is pressed!") end end Framework.UIPlug.OnKeyDown:Register(MyOnKeyDown) ``` ### 2)部分扩展方法示例 服务端(Game)扩展方法 OnLaterUpdate **OnLaterUpdate(time)** 会在OnUpdate的下一帧执行 ```lua function MyOnLaterUpdate(time) end --注册你的方法 Framework.GamePlug.OnLaterUpdate:Register(MyOnLaterUpdate) ``` ### 3)详细文档 [跳转](https://gitee.com/UmaruIsBoy/MaiMaiFramework.lua/wikis/Home) # 五、交流群 **MaiMaiFramework框架/插件开发群691763332** # 六、已知问题 同一个游戏lua脚本中player:Signal()和player:SignalPlus()不能混用 ```lua Framework.GamePlug.OnPlayerSignalPlus:Register(function(player,msg) end) ``` 和 ```lua Framework.GamePlug.OnPlayerSignal:Register(function(player,msg) end) ``` 不能混用 ```lua Framework.UIPlug.OnSignal:Register(function(signal) end) ``` 和 ```lua Framework.UIPlug.OnSignalPlus:Register(function(signal) end) ``` 不能混用 # Draw的文档 ## 介绍 独立的绘制文字和图片的插件,用于在屏幕上绘制图片和文字 [下载文字图片生成器](https://gitee.com/UmaruIsBoy/MaiMaiFramework.lua/raw/dev_maimaiPlug/%E7%BB%98%E5%88%B6%E6%96%87%E5%AD%97%E5%92%8C%E5%9B%BE%E7%89%87/%E6%96%87%E5%AD%97%E5%9B%BE%E7%89%87%E7%94%9F%E6%88%90%E5%99%A8.msi) [文字图片生成器安装使用教程](https://gitee.com/UmaruIsBoy/MaiMaiFramework.lua/blob/dev_maimaiPlug/%E7%BB%98%E5%88%B6%E6%96%87%E5%AD%97%E5%92%8C%E5%9B%BE%E7%89%87/%E6%95%99%E7%A8%8B.md) [压缩字形的工具](https://gitee.com/UmaruIsBoy/MaiMaiFramework.lua/releases/download/v0.7.5/PackedFont.zip) 如果你不想下载这里有线上的生成器 [国外网页版生成器](http://104.168.157.239:61810/DrawCreater) [国内网页版生成器](http://8.138.151.215:61810/DrawCreater) ## 一、添加引用,底下两种配置二选一 ### 1·无需框架的绘制,部分功能无法使用 把Draw.lua放到project.json同文件夹下 ```lua { "game": [], "ui": ["Draw.lua"] } ``` ### 2·框架版的绘制,完整功能 把Draw.lua和MaiMaiFramework.lua放到project.json同文件夹下 需要下载 [Draw.lua](https://gitee.com/UmaruIsBoy/MaiMaiFramework.lua/blob/main/Draw.lua)最新版本和[MaiMaiFramework.lua](https://gitee.com/UmaruIsBoy/MaiMaiFramework.lua/blob/main/MaiMaiFramework.lua)最新版本 ```lua { "game": ["MaiMaiFramework.lua"], "ui": ["MaiMaiFramework.lua","Draw.lua"] } ``` ## 二、创建你的ui文件 在project.json同文件夹下右键,新建文本文档 更改命名为ui.lua ## 添加ui.lua引用,底下两种配置二选一 ### 1·不使用框架 ```lua { "game": [], "ui": ["Draw.lua","ui.lua"] } ``` ### 2·使用框架 ```lua { "game": ["MaiMaiFramework.lua"], "ui": ["MaiMaiFramework.lua","Draw.lua","ui.lua"] } ``` ## 三、根据你实际情况的配置 比如1280*800是你在创作模式下的游戏设置里的屏幕分辨率 则在Draw.lua中修改MVC的值为 ```lua MVC={ width=1280, height=800 } ``` ## 四、复制下面的代码到ui.lua Draw.Texts里面放文字的数据,数据是[生成器](https://gitee.com/UmaruIsBoy/MaiMaiFramework.lua/raw/dev_maimaiPlug/%E7%BB%98%E5%88%B6%E6%96%87%E5%AD%97%E5%92%8C%E5%9B%BE%E7%89%87/%E6%96%87%E5%AD%97%E5%9B%BE%E7%89%87%E7%94%9F%E6%88%90%E5%99%A8.msi)生成的 Draw.TextsBase91里面放文字压缩后的数据,数据是[生成器](https://gitee.com/UmaruIsBoy/MaiMaiFramework.lua/raw/dev_maimaiPlug/%E7%BB%98%E5%88%B6%E6%96%87%E5%AD%97%E5%92%8C%E5%9B%BE%E7%89%87/%E6%96%87%E5%AD%97%E5%9B%BE%E7%89%87%E7%94%9F%E6%88%90%E5%99%A8.msi)生成后[压缩字形的工具](https://gitee.com/UmaruIsBoy/MaiMaiFramework.lua/releases/download/v0.7.5/PackedFont.zip)压缩的 ```lua --存放文字数据 Draw.Texts={ ['测']={{0,1,1,1,0,5,1,1,0,10,1,1,1,2,2,1,1,6,2,1,1,9,1,1,2,1,5,1,2,3,1,6,2,11,1,1,3,10,1,1,4,3,1,7,5,10,1,1,6,2,1,7,6,11,1,1,8,2,1,7,9,11,2,1,10,0,1,12},{11,12,17}}, ['试']={{0,0,1,1,0,4,2,1,1,1,1,1,1,5,1,7,2,10,1,1,4,2,7,1,4,5,3,1,4,10,2,1,5,6,1,5,6,9,1,1,8,0,1,10,9,10,2,1,10,0,1,1,10,9,1,3},{11,12,14}}, --字不存在时会用空格代替,11代表空格的宽,12代表空格的高 [' ']={{},{11,12,0}}, } --存放压缩后的文字数据 Draw.TextsBase91={ ['欢'] = 'C<7FDDUE%ABN%F"CpB:"?(fLjLpBzw?(8M!W]C#FCO"Gu9MznfL?J+t;C$WbX>CYO("/Lg4bDtP3PA', ['迎'] = 'X|vWFtm"FYAMlHi<>ayi,nJx{WH,*nxw5uyc.ORgjB', ['杀'] = 'Bf,hbDGO&tmunLmG9FlBmB]W,L%F0InBquj"UMKOtBCy>W"i/FgA%A!M&y"C!M:twwpLs).A', ['敌'] = 'Yq7F{C5F*At5IA1B+"~LnL_QGAj"eGWOvBVE@W:i&FcA0?([jCA', } --创建文字框架 myText=DrawText:Create() --设置显示的文字为text为"测试欢迎杀敌",屏幕位置在x=500,y=800处,大小为2 myText:Set({text="测试欢迎杀敌",x=500,y=500,size=2}) ``` ## 以下是文档 ```lua --存放文字数据 Draw.Pictures={} --存放图片数据 Draw.Texts={} ``` ## Draw.SetArg类 ```lua Draw.SetArg= { text=nil, --optional string 在畫線顯示的文字 font="medium",--optional string 字體大小 (small, medium, large, verylarge) x=0, --optional int x 座標 y=0, --optional int y 座標 r=255, --optional int 文字顏色(紅色). 0~255 範圍 g=255, --optional int 文字顏色(綠色). 0~255 範圍 b=255, --optional int 文字顏色(藍色). 0~255 範圍 a=255, --optional int 文字顏色(透明度). 0~255 範圍 --首次调用Set方法时内部自动赋值 width=-1, --optional int 寬度 height=-1, --optional int 高度 needBox=-1, --需要的UI.Box数目 } ``` ## Draw类 ### Draw:Create() 產生静态文字介面框架 ### Draw:Set(Draw.SetArg) 设置静态文字的属性 ### Draw:Hide() 隐藏静态文字 ### Draw:Show() 显示静态文字 ### Draw:Adaptation([mode]) 根据Draw.lua中的MVC对屏幕进行适配 开发模式下的屏幕分辨率 ```lua MVC={ width=1280, height=800 } ``` [mode] 文字的宽度和高度会随着分辨率的改变适配 "center" x向左移动width的1/2,y向上移动height的1/2 "downLeft" y向上移动height "upRight" x向右移动width "upCenter" x向右移动width的1/2 "downCenter" x向左移动width的1/2,y向上移动height "downRight" x向左移动width,y向上移动height "widthHeight" 不改变位置,只适配宽高 缺省mode:适配宽高和位置 ### Draw:Get() 获取静态文字属性 返回Draw.SetArg ## DrawText类 继承Draw类所有方法 ### DrawText:Create() 產生动态文字介面框架 ### DrawText:Set(DrawText.SetArg) 设置动态文字属性 ### DrawText:DisPlayMode(mode) 改变文字显示方向 ```lua "vertical" --从上往下显示 ``` ### DrawText:GetChildText(index) 获得第index个文字信息 返回Draw类 ### DrawText:Get() 获得动态文字属性 返回DrawText.SetArg ## DrawText.SetArg类 继承Draw.SetArg类 ```lua DrawText.SetArg= { kerning, --number字间距 text=nil, --optional string 在畫線顯示的文字 font="medium",--optional string 字體大小 (small, medium, large, verylarge) x=0, --optional int x 座標 y=0, --optional int y 座標 r=255, --optional int 文字顏色(紅色). 0~255 範圍 g=255, --optional int 文字顏色(綠色). 0~255 範圍 b=255, --optional int 文字顏色(藍色). 0~255 範圍 a=255, --optional int 文字顏色(透明度). 0~255 範圍 --首次调用Set方法时内部自动赋值 width=-1, --optional int 寬度 height=-1, --optional int 高度 needBox=-1, --需要的UI.Box数目 } ``` ## DrawPicture类 继承Draw类所有方法 ### DrawPicture:Create() 產生图片的框架 ### DrawPicture:Set(DrawPicture.SetArg) 设置图片属性 ### DrawPicture:Get() 获取图片属性 返回DrawPicture.SetArg ## DrawPicture.SetArg类 继承Draw.SetArg类 ```lua DrawPicture.SetArg={ picture=nil, --图片名字 string size=1, --图片大小 number x=0, --optional int x 座標 y=0, --optional int y 座標 --首次调用Set方法时内部自动赋值 width=-1, --optional int 寬度 height=-1, --optional int 高度 needBox=-1, --需要的UI.Box数目 } ``` ## DrawLine类 继承Draw类所有方法 ### DrawLine:Create() 产生直线的框架(不会进行box拼接,因此可能会消耗大量的box) ### DrawLine:Set(DrawLine.SetArg) 设置直线属性 ### DrawLine:Get() 获取直线属性 返回DrawLine.SetArg ## DrawLine.SetArg类 ```lua DrawLine.SetArg={ size=3,--size越小越清晰,消耗box越多 r=255, g=255, b=255, a=255, pos1={} --起点 pos2={} --始点 --首次调用Set方法时内部自动赋值 width=-1, height=-1, --最左侧,最上侧的坐标 x=nil, y=nil } ``` ## DrawPolygon类 继承Draw类所有方法 ### DrawPolygon:Create() 产生多边形的框架(不会进行box拼接,因此可能会消耗大量的box) ### DrawPolygon:Set(DrawPolygon.SetArg) 设置多边形属性 ### DrawPolygon:Get() 获取多边形属性 返回DrawPolygon.SetArg ## DrawPolygon.SetArg类 ```lua DrawPolygon.SetArg ={ n=4, --顶点数 radius=10, --到顶点的距离 center={x=0,y=0}, --中心坐标 size=10, --size越小越清晰,消耗box越多 r=255,g=255,b=255,a=255, --首次调用Set方法时内部自动赋值 width=nil, height=nil, --最左侧,最上侧的坐标 x=nil, y=nil, } ``` ## 例子 ```lua if UI then Draw.Pictures={ ["马里奥"]={{{{236,62,1},{0,12,5,2,1,11,4,3,2,2,13,1,2,10,3,4,2,14,1,1,3,0,7,3,5,14,1,1,6,10,3,2,9,10,1,1,9,14,1,1,10,11,4,3,12,14,1,1,14,12,2,2}}, {{248,195,125},{0,14,2,4,2,4,1,3,2,15,1,2,3,7,6,3,3,14,2,1,5,4,4,1,6,3,3,7,9,5,1,2,9,8,4,2,10,3,2,2,10,14,2,1,12,4,3,3,12,15,4,2,13,14,3,4,15,5,1,2}}, {{115,53,42},{0,21,5,1,1,4,1,4,1,19,4,3,2,3,4,1,2,7,1,1,3,4,2,3,5,5,1,2,9,7,6,1,10,5,2,3,10,19,5,3,15,21,1,1}}, {{30,56,133},{2,17,11,2,3,15,9,4,5,10,1,4,6,12,3,7,9,11,1,3}}, {{16,17,21},{9,3,1,2}}},{16,22,45}}, } Draw.Texts= { ['嗨']={{0,2,3,1,0,3,1,7,1,8,2,1,2,3,1,7,3,1,1,1,3,5,1,1,3,10,1,1,4,2,1,1,4,6,7,1,4,9,7,1,5,0,1,2,5,3,5,1,5,4,1,6,6,1,5,1,7,5,1,2,7,8,1,2,7,11,2,1,9,4,1,7},{11,12,18}}, [' ']={{},{5,13,0}}, } myPicture=DrawPicture:Create() --创建一个產生图片的框架myPicture myPicture:Set({x=640,y=400,picture="马里奥",size=5}) --设置myPicture的属性,屏幕坐标x=640,800,(屏幕左上角坐标为x=0,y=0),picture图片:马里奥,大小size:5(如果不是整数倍放大/缩小可能会出现问题) myPicture:Adaptation("center") --图片的适配模式:居中(将图片向左移动 图片宽的1/2,向上移动图片高的1/2) myText=DrawText:Create() --创建一个產生文字的框架myText myText:Set({x=640,y=400,text="嗨嗨 嗨嗨",font="small"}) --设置文字的屏幕坐标x=640,y=400,text文字:"嗨嗨 嗨嗨",文字尺寸font:"small",除此之外还有small, medium, large, verylarge myText:Adaptation("center") --适配模式:居中 myUIBox=UI.Box.Create() --创建绘制矩形的UI框架myUIBox myUIBox:Set(myPicture:Get()) --将myUIBox的属性设置为myPicture的属性 myUIBox:Set({a=100}) --调整myUIBox的透明度:a=100 end ``` [效果](https://gitee.com/UmaruIsBoy/MaiMaiFramework.lua/blob/dev_maimaiPlug/%E7%BB%98%E5%88%B6%E6%96%87%E5%AD%97%E5%92%8C%E5%9B%BE%E7%89%87/%E6%95%88%E6%9E%9C.png) ## 以下方法只有在使用[MaiMaiFramework](https://gitee.com/UmaruIsBoy/MaiMaiFramework.lua/releases)的情况下才能使用(用最新的版本) ```lua DoMove.type= { OutQuad, --default InQuad, InSine, OutSine, InCubic, OutCubic, InExpo, OutExpo, Linear, } ``` ### DoMove 平滑的从屏幕一处移动到另一处 startPos table {x=x,y=y}开始的屏幕坐标 endPos table {x=x,y=y}结束的屏幕坐标 time number 移动花费的时间 [type] DoMove.type string 移动的类型 Draw:DoMove(startPos,endPos,time,type) DrawText:DoMove(startPos,endPos,time,type) DrawPicture:DoMove(startPos,endPos,time,type) DrawPolygon:DoMove(startPos,endPos,time,type) DrawLine:DoMove(startPos,endPos,time,type) ### DoColor startColor table {r=r,g=g,b=b}开始时的颜色 endColor table {r=r,g=g,b=b}结束时的颜色 time number 变化颜色花费的时间 [type] DoMove.type string 移动的类型 Draw:DoColor(startColor,endColor,time,type) DrawText:DoColor(startColor,endColor,time,type) ### DoScale startSize table {width=width,height=height}开始时的大小 endSize table {width=width,height=height}结束时的大小 time number 变化大小花费的时间 [type] DoMove.type string 移动的类型 Draw:DoScale(startSize,endSize,time,type) DrawText:DoScale(startSize,endSize,time,type) DrawPicture:DoScale(startSize,endSize,time,type) ### UI.Text/UI.Box 扩展 ```lua UI.Text:OnDoMoveStart() UI.Text:OnDoMoveEnd() UI.Text:OnDoColorStart() UI.Text:OnDoColorEnd() UI.Box:OnDoMoveStart() UI.Box:OnDoMoveEnd() UI.Box:OnDoColorStart() UI.Box:OnDoColorEnd() UI.Box:OnDoScaleStart() UI.Box:OnDoScaleEnd() ``` ### Do事件 DrawEntity包括Draw,DrawText,DrawPicture,DrawLine,DrawPolygon **DoMove** DoMove开始时触发 ```lua DrawEntity.OnDoMoveStart:Register(function() end) ``` DoMove结束时触发 ```lua DrawEntity.OnDoMoveEnd:Register(function() end) ``` DoMove时触发 ```lua DrawEntity.OnDoMove:Register(function() end) ``` **DoScale** DoScale开始时触发 ```lua DrawEntity.OnDoScaleStart:Register(function() end) ``` DoScale结束时触发 ```lua DrawEntity.OnDoScaleEnd:Register(function() end) ``` DoScale时触发 ```lua DrawEntity.OnDoScale:Register(function() end) ``` ### DrawText:BlinkShow 每个文字分开显示 time 每个字之间显示的间隔 DrawText:BlinkShow(time) ## Draw.MenuStrip类 ### Draw.MenuStrip:Create(args) 产生菜单的框架 args table参数表 参数: args.x 产生菜单的屏幕位置 args.y [args.itemsHeight] 每个子菜单的高,默认30 [args.itemsWidth] 每个子菜单宽,默认100 [args.size] 文字显示大小,默认1 ### Draw.MenuStrip:SetBGColor(r,g,b,a) 设置背景颜色 ### Draw.MenuStrip:SetFocusBGColor(r,g,b,a) 设置光标背景颜色 ### Draw.MenuStrip:SetTextColor(r,g,b) 设置文字颜色 ### Draw.MenuStrip:Add(name) 添加一个选项 参数: name string类型,添加选项的名字 ### Draw.MenuStrip:Remove(itemIndex) 删除第(从上往下数)itemIndex选项 参数: itemIndex number类型,第几个选项 ### Draw.MenuStrip:OnFocus(itemIndex) 光标移动到菜单的第(从上往下数)itemIndex个选项 参数: itemIndex number类型,第几个选项 ### Draw.MenuStrip:CreateChild(itemIndex) 在第(从上往下数)itemIndex个选项下创建子菜单 参数: itemIndex number类型,第几个选项 返回: Draw.MenuStrip ### Draw.MenuStrip:Show() 显示菜单 ### Draw.MenuStrip:OnlyShowOnFocus(boolean) 是否只在光标处显示文字(用于长菜单节省box用) 参数: boolean boolean类型,true是,false否 ### Draw.MenuStrip:Hide() 隐藏菜单包括他的子菜单 ### Draw.MenuStrip:Dispose() 释放资源 删除所有选项,包括子菜单,以及菜单子菜单数据,根节点需要手动删除 ### 注册方法 左键选择时调用 参数: menu Draw.MenuStrip focusIndex 当前选项编号(1开始从上往下增加) ```lua Draw.MenuStrip.OnSelect:Register(function(menu,focusIndex) end) ``` 焦点改变时调用 参数: menu Draw.MenuStrip focusIndex 当前选项编号(1开始从上往下增加) ```lua Draw.MenuStrip.OnFocusEvent:Register(function(menu,index) end) ``` ### Draw.MenuStrip例子:创建 ```lua MainMenu=Draw.MenuStrip:Create({x=300,y=100,size=2,itemsHeight=30,itemsWidth=400}) --创建主菜单到屏幕x=300,y=300位置 --size文字大小2,[itemsHeight]每个子菜单高 --[itemsWidth]每个子菜单宽 MainMenu:SetBGColor(255,0,0,255) --设置主菜单背景颜色 MainMenu:SetFocusBGColor(0,255,0,255) --设置主菜单光标颜色 MainMenu:SetTextColor(0,0,255) --设置主菜单文字颜色 MainMenu:Add("主菜单") --添加选项:"主菜单" MainMenu:Add("主菜单1") --添加选项:"主菜单1" MainMenu:Add("主菜单2") --添加选项:"主菜单2" MainMenu:Add("主菜单3") --添加选项:"主菜单3" MainMenu:Add("主菜单4") --添加选项:"主菜单4" ChildMenu=MainMenu:CreateChild(3) --在主菜单3的位置添加子菜单 ChildMenu:Add("子1菜单1") --添加子菜单选项:"子1菜单1" ChildMenu:Add("子1菜单3") --添加子菜单选项:"子1菜单3" ChildMenu:Add("子1菜单4") --添加子菜单选项:"子1菜单4" ChildMenu:Add("子1菜单2",2) --添加子菜单选项:"子1菜单2"到子菜单2号位置 Child2Menu=ChildMenu:CreateChild(4) --在子菜单3的位置添加子菜单的子菜单 Child2Menu:Add("子2菜单1") Child2Menu:Add("子2菜单2") Child3Menu=Child2Menu:CreateChild(2) Child3Menu:Add("子3菜单1") Child3Menu:Add("子3菜单2") Child4Menu=Child3Menu:CreateChild(2) Child4Menu:Add("子4菜单1") Child4Menu:Add("子4菜单2") MainMenu:OnFocus(1) --设置主菜单光标到1号位置 MainMenu:Show() --显示主菜单 --子菜单4被点击事件注册 Child4Menu.OnSelect:Register(function(menu,focusIndex) print("子4菜单"..focusIndex.."被点击") if focusIndex==1 then MainMenu:Hide() end end) Child4Menu.OnFocusEvent:Register(function(menu,index) end) ``` ### Draw.MenuStrip例子:隐藏 续上 ```lua --隐藏菜单和他的子菜单,数据会被保留,以供下次打开 --不会占用box MainMenu:Hide() ``` ### Draw.MenuStrip例子:释放 续上 ```lua --如果要永久废弃掉这个菜单采用这个方法 --否则可以使用Hide进行隐藏 MainMenu:Dispose() --释放菜单所有资源,包括子菜单以及他的数据,最顶级菜单需要手动删除 MainMenu=nil --删除最顶级菜单的引用 collectgarbage() --垃圾回收 ``` ## 例子 ```lua Draw.Pictures['picture']={{{{0,0,0},{0,6,1,1,0,8,1,1,0,10,1,1,1,0,1,1,1,3,1,2,1,14,1,1,1,16,1,1,2,1,1,1,2,17,1,1,5,0,1,1,5,23,1,1,6,2,1,1,6,32,1,1,7,28,1,2,8,5,1,1,8,34,2,1,9,6,1,1,11,35,1,1,12,36,1,1,13,9,1,1,14,37,2,1,15,12,1,1,16,13,1,1,16,36,2,1,18,14,1,1,18,37,1,1,19,15,1,1,20,30,1,4,21,18,1,1,21,34,1,1,21,36,3,1,21,38,1,2,22,19,1,1,22,30,1,1,22,41,1,1,23,27,1,3,23,34,1,3,24,26,1,1,24,29,1,2,24,32,1,1,24,38,1,2,24,41,1,1,25,21,1,1,25,30,1,1,26,23,1,2,26,27,3,1,26,31,1,2,27,26,1,3}},{{0,0,255},{0,7,1,1,0,9,1,1,1,6,1,1,1,10,1,4,2,14,1,3,3,18,2,1,4,19,1,2,5,21,1,2,6,23,1,3,7,24,1,1,7,27,1,1,7,30,2,1,7,31,1,4,8,29,1,2,9,18,3,2,10,15,1,1,11,23,2,2,12,20,1,7,12,35,1,1,13,22,1,1,13,25,1,2,13,28,1,1,14,26,1,1,14,29,1,2,15,27,1,2,15,30,1,1,15,34,1,1,16,19,1,1,16,23,1,1,16,29,1,1,16,32,1,2,16,37,1,1,18,27,1,1,19,28,1,1,19,31,1,1,19,35,1,2,20,25,1,2,20,36,1,1,21,26,1,1,22,35,1,1,23,25,1,1,23,31,1,2,23,39,1,1,27,29,1,1}},{{0,255,255},{1,5,4,1,2,2,1,6,2,11,8,1,3,3,1,10,3,17,1,1,4,6,1,9,5,7,1,10,5,20,1,1,6,8,1,10,6,26,2,1,7,9,1,12,7,25,1,2,8,10,1,12,8,27,1,2,8,31,4,1,8,32,3,1,8,33,2,1,9,12,1,6,9,20,3,3,9,28,2,1,9,29,1,5,10,13,2,2,10,16,4,1,10,17,3,1,10,23,1,3,10,34,5,1,11,15,2,3,11,25,1,2,12,18,1,2,12,27,3,1,12,28,1,3,13,19,1,3,13,23,3,1,13,24,2,1,13,29,1,3,14,22,2,2,14,25,2,1,14,28,1,1,14,31,4,1,14,32,2,2,14,35,1,1,15,18,1,1,15,21,1,3,15,26,2,1,15,29,1,1,15,36,1,1,16,27,2,1,16,30,1,2,16,34,3,1,17,32,1,4,18,28,1,1,18,33,1,4,19,37,1,2,20,22,1,1,20,29,1,1,21,27,1,1,22,31,1,1,22,38,2,1,22,39,1,2,23,37,1,2,23,40,1,2,26,28,1,1}},{{255,255,255},{1,7,1,3,2,8,1,3,2,12,1,2,3,2,1,1,3,13,1,4,4,3,1,2,4,15,1,3,5,6,1,1,5,17,1,3,6,7,1,1,6,18,1,5,7,21,1,3,8,9,1,1,8,22,1,5,9,10,3,1,9,23,1,5,10,11,2,2,10,26,1,2,10,29,2,2,10,33,4,1,11,27,1,4,11,32,3,2,12,13,1,2,12,31,1,3,13,14,1,2,13,18,1,1,13,35,1,2,14,16,1,1,14,19,1,3,14,36,1,1,15,20,1,1,16,16,1,1,16,18,2,1,17,17,1,3,18,20,3,1,19,21,1,1,20,27,1,1,21,22,1,2,21,30,1,1,22,24,1,1}},{{255,0,0},{2,0,1,1,3,1,3,1,4,2,2,1,5,3,2,1,6,4,2,2,7,6,2,1,10,7,1,2,11,8,1,1,12,9,1,3,13,10,1,3,14,12,1,2,15,13,1,1,16,14,2,1,17,15,2,2,17,24,1,1,19,16,1,3,20,18,1,2,21,19,1,1,22,20,2,1,23,21,2,3,24,24,2,2,25,22,2,1,25,23,1,4,26,26,1,1}},{{255,255,0},{5,4,1,2,6,6,1,1,7,7,3,2,9,9,3,1,12,12,1,1,13,13,1,1,13,17,4,1,14,14,2,2,14,18,1,1,15,16,1,2,16,15,1,1,18,17,1,3,19,19,1,1,20,21,3,1,21,20,1,2,22,22,1,2,23,24,1,1}},{{0,255,0},{15,19,1,1}},{{255,0,255},{22,28,1,1}},},{29,42,237}} myPic=DrawPicture:Create() myPic:Set({picture="picture",size=3}) myPic:DoMove({x=0,y=0},{x=UI.ScreenSize().width,y=UI.ScreenSize().height},3) ``` ## 例子2 ```lua Draw.Texts={ ['生']={{0,5,1,1,0,11,11,1,1,4,1,1,2,1,1,3,2,7,7,1,3,3,7,1,5,0,1,12},{11,12,7}}, ['活']={{0,1,1,1,0,5,1,1,0,10,1,1,1,2,1,1,1,6,1,1,1,9,1,1,2,4,9,1,2,8,2,1,3,1,4,1,3,7,7,1,3,9,1,3,4,10,6,1,6,2,1,6,7,0,3,1,9,8,1,4},{11,12,15}}, ['就']={{0,2,5,1,0,4,5,1,0,5,1,3,0,9,1,2,1,0,1,1,1,7,4,1,1,11,2,1,2,1,1,2,2,8,1,4,3,9,1,1,4,5,1,3,4,10,1,1,5,3,6,1,5,11,1,1,6,0,1,11,8,1,1,1,8,4,1,7,9,2,1,2,9,11,2,1,10,9,1,3},{11,12,20}}, ['像']={{0,4,2,1,1,2,1,10,2,0,1,2,2,3,8,1,3,2,1,4,3,7,2,1,3,9,2,1,3,11,2,1,4,0,1,2,4,5,6,1,5,1,4,1,5,6,1,1,5,8,1,1,5,10,1,1,6,4,1,2,6,7,1,1,6,9,2,1,6,11,2,1,7,8,2,1,7,10,1,2,8,2,1,2,9,4,1,2,9,7,1,1,9,9,1,1,10,10,1,1},{11,12,25}}, ['海']={{0,0,1,1,0,4,1,1,0,10,1,1,1,1,1,1,1,5,1,1,1,9,1,1,2,3,1,1,2,6,9,1,3,2,1,1,3,7,1,3,4,0,1,2,4,3,6,1,4,4,1,3,4,9,7,1,5,1,6,1,6,5,1,2,6,8,1,2,7,11,2,1,9,4,1,7},{11,12,19}}, ['洋']={{0,1,1,1,0,5,1,1,0,10,1,1,1,2,1,1,1,6,1,1,1,9,1,1,2,8,9,1,3,2,7,1,3,5,7,1,4,0,1,1,5,1,1,2,6,3,1,9,7,1,1,2,8,0,1,1},{11,12,14}}, [',']={{0,6,2,2,0,9,1,1,1,8,1,1},{2,4,3}}, ['只']={{0,11,1,1,1,1,9,1,1,2,1,5,1,10,1,1,2,6,8,1,2,9,1,1,8,9,1,1,9,2,1,5,9,10,1,1,10,11,1,1},{11,11,10}}, ['有']={{0,2,11,1,0,6,1,1,1,5,2,1,2,4,8,1,2,6,8,1,2,7,1,5,3,3,1,2,3,8,7,1,4,0,1,3,8,11,2,1,9,5,1,7},{11,12,11}}, ['意']={{0,3,11,1,0,11,1,1,1,1,9,1,1,9,1,2,2,4,1,4,3,2,1,2,3,5,6,1,3,7,6,1,3,9,1,2,4,11,5,1,5,0,1,2,5,8,1,1,6,9,1,1,7,2,1,2,8,4,1,4,8,10,1,2,9,9,1,1,10,10,1,2},{11,12,18}}, ['志']={{0,2,11,1,0,10,1,1,1,5,9,1,1,8,1,2,3,8,1,3,4,11,5,1,5,0,1,6,5,7,1,1,6,8,1,2,8,10,1,2,9,8,1,1,10,9,1,2},{11,12,12}}, ['坚']={{0,1,1,5,0,11,11,1,1,8,9,1,3,0,1,7,5,1,5,1,5,2,1,1,5,6,1,6,6,3,1,1,6,5,1,1,7,4,1,1,8,3,1,1,8,5,1,1,9,2,1,1,9,6,2,1},{11,12,14}}, ['强']={{0,1,3,1,0,4,3,1,0,5,1,3,0,11,2,1,1,7,2,1,2,2,1,3,2,8,1,3,4,5,7,1,4,6,1,3,4,11,7,1,5,0,5,1,5,1,1,3,5,8,6,1,6,3,4,1,7,4,1,8,9,1,1,3,9,10,1,2,10,6,1,3},{11,12,18}}, ['的']={{0,2,5,1,0,3,1,9,1,1,1,2,1,6,4,1,1,10,4,1,2,0,1,1,4,3,1,9,5,4,1,1,6,3,1,1,7,0,1,3,7,5,1,1,8,2,3,1,8,6,1,2,8,11,2,1,10,3,1,8},{11,12,15}}, ['人']={{0,11,1,1,1,10,1,1,2,9,1,1,3,7,1,2,4,5,1,2,5,0,1,5,6,5,1,2,7,7,1,2,8,9,1,1,9,10,1,1,10,11,1,1},{11,12,11}}, ['才']={{0,9,2,1,1,3,10,1,2,8,2,1,4,7,1,1,5,6,1,1,6,5,1,1,6,11,3,1,7,4,2,1,8,0,1,12},{11,12,9}}, ['能']={{0,2,5,1,1,1,1,2,1,4,4,1,1,5,1,7,2,0,1,1,2,6,3,1,2,8,3,1,3,11,2,1,4,1,1,2,4,5,1,7,6,0,1,4,6,6,1,5,7,2,1,1,7,4,4,1,7,9,1,1,7,11,4,1,8,1,1,1,8,8,1,1,9,0,1,1,9,7,1,1,10,3,1,2,10,9,1,3},{11,12,22}}, ['到']={{0,1,7,1,0,4,7,1,0,7,7,1,0,11,3,1,1,3,1,2,2,2,1,1,3,5,1,6,4,10,3,1,5,3,1,2,6,5,1,1,8,2,1,7,9,11,2,1,10,0,1,12},{11,12,13}}, ['达']={{0,4,3,1,0,11,1,1,1,0,1,1,1,10,1,1,2,1,1,1,2,5,1,5,3,10,1,1,4,3,7,1,4,9,1,1,4,11,7,1,5,8,1,1,6,6,1,2,7,0,1,6,8,6,1,1,9,7,1,1,10,8,1,2},{11,12,16}}, ['彼']={{0,3,1,1,0,6,1,1,1,2,1,1,1,5,2,1,2,1,1,1,2,4,1,8,3,0,1,1,3,3,2,1,3,11,1,1,4,2,7,1,4,4,1,7,5,5,5,1,5,11,1,1,6,6,1,3,6,10,1,1,7,0,1,6,7,9,1,1,8,8,1,1,8,10,1,1,9,6,1,2,9,11,2,1,10,3,1,1},{11,12,22}}, ['岸']={{0,11,1,1,1,1,1,2,1,4,9,1,1,5,1,6,2,2,8,1,2,8,9,1,3,6,7,1,5,0,1,3,6,7,1,5,9,1,1,2},{11,12,10}}, } myText=DrawText:Create() myText:Set({text="生活就像海洋,只有意志坚强的人才能到达彼岸",x=UI.ScreenSize().width/2,y=UI.ScreenSize().height/2,kerning=5}) myText:Adaptation("center") myText:BlinkShow(0.1) ```