跳到主要内容

代码实现的自定义装备局

什么是装备局

装备局就是小型游戏局,和普通的游戏局不同的是加载内容不同,比方说默认不加载地形等

装备局和普通局的不同

装备局的逻辑入口默认是equipment_main.lua文件,普通局的逻辑入口是main.lua,可在地图设置中进行配置

服务端和客户端分别都有各自的main和equipment_main,在src目录下和ui/src目录下

注意,新版本装备局equipment_main由之前的 未自定义equipment_main文件从【main文件】生成 改为了未自定义equipment_main文件从【空文件】生成,如果之前在main.lua中有自己的逻辑,需要检查一下是否需要加在equipment_main.lua里

如何进入不同装备局

因为全游戏都是用一个装备局,服务端需要加载所有种类的装备局,不需要区分

客户端需要根据点开的装备局种类不同,有不同表现,由后台中的大厅模块配置进行配置,在打开游戏的时候传入配置中的模块Key,游戏客户端用common.get_value('Equipment_Game_Mode')获取后判断不同按钮进入的装备局

后台大厅模块配置中中有预制功能的key,使用时需注意不要重名

    base.game:event('游戏进入前台', function()
local Game_Mode = common.get_value('Equipment_Game_Mode');
log.info('游戏进入前台',Game_Mode)
if Game_Mode == "task" then
--打开任务界面
end
end)

进入装备局前的确认

在点下大厅装备局按钮之后,真正的“游戏进入前台”事件触发之前,还有一个时机点可以确认是否进入这个装备局,或者延迟一段时间,进行数据的预载,再进入装备局,通过base.startup.register_pre_enter_foreground_callback注册,传入的参数为一个回调函数,函数中执行一些判断,如果执行cancel()则取消进入装备局,执行confirm()则立刻进入装备局

cancel后立刻confirm也是能进入的,所以cancel后最好确保不再执行confirm

如果没有confirm也没有cancel,会转圈15秒

local send_request_callback

base.startup.register_pre_enter_foreground_callback(function(confirm, cancel)
local Game_Mode = common.get_value('Equipment_Game_Mode');
if Game_Mode == 'wrong_equipment' then
--直接取消进入装备局,客户端表现为还在大厅
cancel()
elseif Game_Mode == 'pre_load_equipment' then
--发送请求后,等待请求返回再确认进入装备局,客户端表现为转一两圈后进入装备局
base.game:server 'send_request' {}
send_request_callback = function(data)
--do something
confirm()
end
else
--直接确认,客户端表现为直接进入装备局
confirm()
end
end)

-- 举例,上文中send_request消息对应的返回消息,单次触发的服务器请求回调
base.proto.receive_request = function(data)
if send_request_callback then
send_request_callback(data)
send_request_callback = nil
end
end

特殊装备局

目前预留了两个特殊字段有特殊逻辑,不要使用

Game_Mode == '' --空字符串 是预加载,什么都不要做

Game_Mode == 'startup_dialog' 是开屏弹窗,每次打开大厅都会进入一次(如果有的话)

开屏弹窗

类似目前游戏中有的签到,月卡每日领取这种界面,会在打开大厅,可以进行任何操作前直接打开,必须关闭后才能回到大厅的装备局

base.startup.register_startup_function(
function()
local is_open = true

return is_open
end,
function(open_next_dialog)
-- 打开界面
--自定义的DialogComponent界面
local dialog = DialogComponent{
custom_close_btn_on_click = function()
if open_next_dialog then open_next_dialog() end
end
}:new()
end
)

传入参数为两个函数

第一个函数是确认是否有弹窗,只有在这个函数返回true的情况下才会打开弹窗

第二个函数是打开弹窗的函数,其中参数是用来打开下一个弹窗的,为固定写法

弹窗需要一个关闭再打开另一个,所以需要把open_next_dialog的执行时机放在当前窗口关闭的时候,目前只有代码写的界面可以支持这么操作,ui编辑器还暂时不行

然后这里的关闭不需要添加返回大厅逻辑,开屏弹窗功能会在所有弹窗弹完之后自动回到大厅

返回大厅

    local lobby = require '@common.base.lobby'
lobby.return_to_lobby()