9.背包面板逻辑

9.背包面板逻辑


9.1 知识点

创建背包面板BagPanel.lua脚本,在Lua主脚本启动。

require("BagPanel")

背包面板继承面板基类

--一个面板对应一个表
BasePanel:subClass("BagPanel")

声明背包面板的成员变量

--Item内容父对象 Item的父物体
BagPanel.Content = nil
--用来存储当前 显示的格子
BagPanel.items = {}
--用来存储当前显示的页签 类型 避免重复刷新
BagPanel.nowType = -1

创建切换页签方法。外部传入页签值。判断是否要切换页签。切换的话把以前道具删掉,得到当前页签的数据并创建格子。

--逻辑处理函数 用来切页签的
--type 1装备 2道具 3宝石
function BagPanel:ChangeType(type)

    --判断如果已经是该页签 就别更新了
    if self.nowType == type then
        return
    end

    --切页  根据玩家信息 来进行格子创建

    --更新之前 把老的格子删掉 BagPanel.items
    for i = 1, #self.items do
        --销毁格子对象
        self.items[i]:Destroy()
    end
    self.items = {}

    --再根据当前选择的类型 来创建新的格子 BagPanel.items
    --要根据 传入的 type 来选择 显示的数据
    local nowItems = nil
    if type == 1 then
        nowItems = PlayerData.equips
    elseif type == 2 then
        nowItems = PlayerData.items
    else
        nowItems = PlayerData.gems
    end

    --创建格子
    for i = 1, #nowItems do

        --根据数据 创建一个格子对象
        local grid = ItemGrid:new()

        --要实例化对象 设置位置
        grid:Init(self.Content, (i - 1) % 4 * 175, math.floor((i - 1) / 4) * 175)

        --初始化它的信息 数量和图标
        grid:InitData(nowItems[i])

        --把它存起来
        table.insert(self.items, grid)
    end

    self.nowType = type
end

创建初始化方法。添加事件监听。

--初始化方法
function BagPanel:Init(name)

    self.base.Init(self, name)

    if self.isInitEvent == false then

        --找到Item的父物体 没有挂在UI控件的 对象 还是需要手动去找
        self.Content = self:GetControl("svBag", "ScrollRect").transform:Find("Viewport"):Find("Content")

        --加事件

        --关闭按钮
        self:GetControl("btnClose", "Button").onClick:AddListener(function()
            self:HideMe()
        end)

        --单选框事件
        --切页签
        --toggle 对应委托 是 UnityAction<bool>
        self:GetControl("togEquip", "Toggle").onValueChanged:AddListener(function(value)
            if value == true then
                self:ChangeType(1)
            end
        end)
        self:GetControl("togItem", "Toggle").onValueChanged:AddListener(function(value)
            if value == true then
                self:ChangeType(2)
            end
        end)
        self:GetControl("togGem", "Toggle").onValueChanged:AddListener(function(value)
            if value == true then
                self:ChangeType(3)
            end
        end)

        self.isInitEvent = true
    end
end

重写显示面板方法。第一次显示时要切换页签

--显示隐藏
function BagPanel:ShowMe(name)
    self.base.ShowMe(self, name)
    --第一次打开时 更新数据
    if self.nowType == -1 then
        self:ChangeType(1)
    end
end

在主脚本初始化显示主面板

MainPanel:ShowMe("MainPanel")

9.2 知识点代码

BagPanel.lua

--一个面板对应一个表
BasePanel:subClass("BagPanel")


--成员变量

--Item内容父对象 Item的父物体
BagPanel.Content = nil
--用来存储当前 显示的格子
BagPanel.items = {}
--用来存储当前显示的页签 类型 避免重复刷新
BagPanel.nowType = -1


--成员方法

--初始化方法
function BagPanel:Init(name)

    self.base.Init(self, name)

    if self.isInitEvent == false then

        --找到Item的父物体 没有挂在UI控件的 对象 还是需要手动去找
        self.Content = self:GetControl("svBag", "ScrollRect").transform:Find("Viewport"):Find("Content")

        --加事件

        --关闭按钮
        self:GetControl("btnClose", "Button").onClick:AddListener(function()
            self:HideMe()
        end)

        --单选框事件
        --切页签
        --toggle 对应委托 是 UnityAction<bool>
        self:GetControl("togEquip", "Toggle").onValueChanged:AddListener(function(value)
            if value == true then
                self:ChangeType(1)
            end
        end)
        self:GetControl("togItem", "Toggle").onValueChanged:AddListener(function(value)
            if value == true then
                self:ChangeType(2)
            end
        end)
        self:GetControl("togGem", "Toggle").onValueChanged:AddListener(function(value)
            if value == true then
                self:ChangeType(3)
            end
        end)

        self.isInitEvent = true
    end
end

--显示隐藏
function BagPanel:ShowMe(name)
    self.base.ShowMe(self, name)
    --第一次打开时 更新数据
    if self.nowType == -1 then
        self:ChangeType(1)
    end
end

--逻辑处理函数 用来切页签的
--type 1装备 2道具 3宝石
function BagPanel:ChangeType(type)

    --判断如果已经是该页签 就别更新了
    if self.nowType == type then
        return
    end

    --切页  根据玩家信息 来进行格子创建

    --更新之前 把老的格子删掉 BagPanel.items
    for i = 1, #self.items do
        --销毁格子对象
        self.items[i]:Destroy()
    end
    self.items = {}

    --再根据当前选择的类型 来创建新的格子 BagPanel.items
    --要根据 传入的 type 来选择 显示的数据
    local nowItems = nil
    if type == 1 then
        nowItems = PlayerData.equips
    elseif type == 2 then
        nowItems = PlayerData.items
    else
        nowItems = PlayerData.gems
    end

    --创建格子
    for i = 1, #nowItems do

        --根据数据 创建一个格子对象
        local grid = ItemGrid:new()

        --要实例化对象 设置位置
        grid:Init(self.Content, (i - 1) % 4 * 175, math.floor((i - 1) / 4) * 175)

        --初始化它的信息 数量和图标
        grid:InitData(nowItems[i])

        --把它存起来
        table.insert(self.items, grid)
    end

    self.nowType = type
end

LuaMain.lua

print("Lua主脚本准备就绪")
--初始化所有准备好的类别名
require("InitClass")

--初始化数据
--初始化道具表信息
require("ItemData")

--玩家信息 
--1.从本地读取  本地存储有几种方式 PlayerPrefs 和 Json 或者 二进制
--2.网络游戏 从服务器获取
require("PlayerData")
PlayerData:Init()

--初始化面板基类
require("BasePanel")

require("MainPanel")
require("BagPanel")
require("ItemGrid")

MainPanel:ShowMe("MainPanel")


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏