饥荒Mod 开发(十三):木牌传送
在上一个文章里面制作了一个传送选择页面,是一个全屏的窗口,那饥荒中如何制作一个全屏的窗口,下面介绍一下如何从零开始制作一个全屏窗口
制作屏幕窗口
饥荒中的全屏窗口都有一个基类 “Screen”,我们需要从这个基类派生一个子类
在widgets 目录下新建一个 myscreen.lua 文件
下面是一个最简单的 屏幕类的实现
local Screen = require "widgets/screen" -- 引入"widgets/screen"模块
local Widget = require "widgets/widget"
local Image = require "widgets/image"
local TravelScreen = Class(Screen, function(self, homesign, traveller)Screen._ctor(self, "myscreen") -- 构造函数,创建一个名为"myscreen"的屏幕--画一个背景self.root = self:AddChild(Widget("ROOT"))self.root:SetVAnchor(ANCHOR_MIDDLE)self.root:SetHAnchor(ANCHOR_MIDDLE)self.root:SetScaleMode(SCALEMODE_PROPORTIONAL)--添加一个背景self.bg = self.root:AddChild(Image("images/globalpanels.xml", "panel.tex"))self.bg:SetSize(500, 650)self.bg:SetPosition(0, 25)
end)function TravelScreen:Close()TheFrontEnd:PopScreen(self) -- 当取消时,弹出当前屏幕
endreturn TravelScreen -- 返回TravelScreen类
测试弹出页面
监听F3 按键进入游戏 按F3 键,弹出这个页面
local myscreen = GLOBAL.require("widgets/myscreen")
GLOBAL.TheInput:AddKeyHandler(function(key, down)-- 检查按下的键是否是 F1 键if (key == GLOBAL.KEY_F3 and not down) thenlocal screen = TheFrontEnd:GetActiveScreen()-- End if we can't find the screen name (e.g. asleep)if not screen or not screen.name then return true end-- If the hud exists, open the UIif screen.name:find("HUD") then-- We want to pass in the (clientside) player entity TheFrontEnd:PushScreen(myscreen())return trueelse-- If the screen is already open, close itif screen.name == "myscreen" thenscreen:Close()endendend
end)
效果如下
增加一个关闭按钮
在myscreen.lua 文件的 ”构造函数”中 添加一个按钮
-- 添加一个菜单,用来显示关闭self.menu = self.root:AddChild(Menu(nil, 200, true)) -- 在root上添加一个菜单self.menu:SetScale(0.6) -- 设置菜单的缩放比例self.menu:SetPosition(0, -225, 0) -- 设置菜单的位置self.cancelbutton = self.menu:AddItem("关闭", function() -- 在菜单上添加一个名为"关闭"的项,点击后执行self:Close()函数self:Close()end)
点击关闭按钮会触发 self:Close() 函数调用关闭页面