找回密码
马上加入

QQ登录

只需一步,快速开始

搜索
发新帖

0

收听

1

听众

134

主题
发表于 昨天 19:55 | 查看: 1| 回复: 0

拍卖行超时物品智能重上架系统:设计精要与实现解析

在游戏拍卖行生态中,超时物品的处理是提升经济系统效率的关键环节。本文将深入分析一段Lua实现的拍卖行超时物品重上架系统,揭示其背后的智能恢复机制和用户体验优化策略。

系统核心架构

graph TD
    A[物品超时] --> B[打开重上架界面]
    B --> C[加载原配置]
    C --> D[恢复默认设置]
    D --> E[锁定不可修改项]
    E --> F[智能货币匹配]
    F --> G[折扣系统恢复]
    G --> H[双重操作支持]
    H --> I[重新上架]
    H --> J[取回物品]

设计亮点分析

🔄 1. 智能配置恢复引擎

系统自动恢复原拍卖配置,极大简化玩家操作:

-- 匹配原货币类型
local defaultCurrency = 1
for k, v in pairs(AuctionTimeout._currcies) do
    if itemData.type == v.id then
        defaultCurrency = k
        break
    end
end

-- 匹配原折扣设置
local defaultRebate = 1
for k, v in pairs(AuctionTimeout._rebateItems) do
    if itemData.meguildrate == v.value then
        defaultRebate = k
        break
    end
end

-- 应用默认值
AuctionTimeout._currencyIndex = defaultCurrency
AuctionTimeout._rebateIndex = defaultRebate
GUI:TextInput_setString(textBidPrice, itemData.price)  -- 恢复原竞拍价
GUI:TextInput_setString(textBuyPrice, itemData.lastprice) -- 恢复原一口价

恢复策略

  • 遍历匹配原货币类型
  • 精准定位原折扣设置
  • 自动填充历史价格
  • 继承原交易类型状态(是否支持竞价/一口价)

🔒 2. 智能锁定机制

针对超时物品的特殊属性,系统锁定不可修改项:

-- 数量输入框事件处理
GUI:TextInput_addOnEvent(TextField_count, function(_, eventType)
    if eventType == 1 then -- 输入完成事件
        SL:ShowSystemTips("无法修改数量")
        GUI:TextInput_setString(TextField_count, itemData.OverLap)
    end
end)

-- 禁用数量加减按钮
GUI:Button_setGrey(AuctionTimeout._ui["Button_countadd"], true)
GUI:setTouchEnabled(AuctionTimeout._ui["Button_countadd"], false)
GUI:Button_setGrey(AuctionTimeout._ui["Button_countsub"], true)
GUI:setTouchEnabled(AuctionTimeout._ui["Button_countsub"], false)

锁定范围

  • 物品数量(不可修改)
  • 数量调整按钮(完全禁用)
  • 折扣类型(保持原样)
  • 货币类型(保持原样)

⚖️ 3. 双重操作支持

系统提供两种处理超时物品的途径:

-- 操作1:取回物品
GUI:addOnClickEvent(AuctionTimeout._ui["Button_cancel"], function()
    if SL:GetMetaValue("BAG_IS_FULL", true) then
        return
    end
    SL:RequestAuctionPutout(itemData.MakeIndex)      
end)

-- 操作2:重新上架
GUI:addOnClickEvent(AuctionTimeout._ui["Button_submit"], function()
    -- 复杂的验证逻辑...
    SL:RequestAuctionPutin(itemData.MakeIndex, ...)      
end)

操作差异

特性 取回物品 重新上架
前置检查 背包空间 价格验证+交易类型
操作复杂度 简单 复杂
结果 物品回包 重新拍卖
适用场景 放弃出售 调整后继续出售

💱 4. 动态货币系统

系统保持原货币类型,但允许查看其他选项:

function AuctionTimeout.ShowCurrencyCells()
    for key, value in ipairs(AuctionTimeout._currcies) do
        local cell = AuctionTimeout.CreateCurrencyCell(value)
        -- 创建货币图标
        local goodsItem = GUI:ItemShow_Create(cell["Node_item"], "goodsItem", 
            0, 0, { index = value.item.Index, itemData = value.item })
        GUI:setScale(goodsItem, 0.6) -- 统一缩放

        -- 添加选择事件
        GUI:addOnClickEvent(cell["nativeUI"], function()
            AuctionTimeout._currencyIndex = key
            AuctionTimeout.HideCurrencyCells()
            AuctionTimeout.UpdateCurrency()
        end)
    end
end

货币处理特点

  • 显示当前选中货币
  • 下拉展示所有可选货币
  • 选择后实时更新界面
  • 保持图标统一缩放比例(0.6倍)

🎛️ 5. 折扣管理系统

系统提供直观的折扣选择界面:

-- 折扣表构造
AuctionTimeout._rebateItems = {}
table.insert(AuctionTimeout._rebateItems, { value = 100, name = "无" })
for i = 9, 1, -1 do
    table.insert(AuctionTimeout._rebateItems, { value = i * 10, name = string.format("%s折", i) })
end

-- 折扣选择界面
function AuctionTimeout.ShowRebateCells()
    for key, value in ipairs(AuctionTimeout._rebateItems) do
        local cell = AuctionTimeout.CreateCurrencyCell()
        GUI:Text_setString(cell["Text_name"], value.name)
        GUI:addOnClickEvent(cell["nativeUI"], function()
            AuctionTimeout._rebateIndex = key
            AuctionTimeout.HideRebateCells()
            AuctionTimeout.UpdateRebate()
        end)
    end
end

折扣设计亮点

  • 从9折到1折的完整阶梯
  • "无折扣"作为默认选项
  • 倒序排列(高折扣在前)
  • 动态下拉选择界面

🔄 6. 状态联动系统

交易类型选择实时影响界面状态:

function AuctionTimeout.UpdateAuctionAble()
    -- 更新复选框状态
    GUI:CheckBox_setSelected(CheckBox_bid, AuctionTimeout._bidAble)
    GUI:CheckBox_setSelected(CheckBox_buy, AuctionTimeout._buyAble)

    -- 切换输入区域显示
    GUI:setVisible(Panel_bid_able, not AuctionTimeout._bidAble)
    GUI:setVisible(Panel_buy_able, not AuctionTimeout._buyAble)

    -- 重置禁用状态的价格
    if not AuctionTimeout._bidAble then
        GUI:TextInput_setString(TextField_bid_price, 0)
    end
end

关键技术实现

跨平台定位策略

local posX = SL:GetMetaValue("SCREEN_WIDTH") / 2
local posY = SL:GetMetaValue("WINPLAYMODE") and SL:GetMetaValue("PC_POS_Y") 
    or SL:GetMetaValue("SCREEN_HEIGHT") / 2
GUI:setPosition(Panel_2, posX, posY)

定位逻辑

  • PC端:使用特定Y坐标(PC_POS_Y)
  • 移动端:屏幕垂直居中
  • 水平方向始终居中

物品展示优化

local goodsInfo = {
    itemData = itemData, 
    look = true,           -- 仅查看模式
    index = itemData.Index,
    disShowCount = true    -- 隐藏数量显示
}

local goodsItem = GUI:ItemShow_Create(Image_icon, "goodsItem", 
    itemSize.width/2, itemSize.height/2, goodsInfo)
GUI:setAnchorPoint(goodsItem, 0.5, 0.5)

视觉优化

  • 图标居中显示
  • 隐藏数量信息(数量不可修改)
  • 精确锚点控制
  • 查看模式禁止交互

扩展设计建议

1. 智能降价推荐

-- 根据流拍次数自动降价
local failCount = SL:GetAuctionFailCount(itemData.id)
if failCount > 0 then
    local discountRate = 1.0 - (failCount * 0.05) -- 每次流拍降价5%
    local newPrice = math.floor(itemData.price * discountRate)

    -- 添加推荐按钮
    GUI:addOnClickEvent(Button_suggest, function()
        GUI:TextInput_setString(textBidPrice, newPrice)
        SL:ShowSystemTips("已应用智能降价推荐")
    end)
end

2. 批量处理功能

-- 添加全选复选框
GUI:addOnClickEvent(CheckBox_selectAll, function()
    for _, item in ipairs(timeoutItems) do
        item.selected = GUI:CheckBox_isSelected(CheckBox_selectAll)
    end
end)

-- 批量重新上架
GUI:addOnClickEvent(Button_batchRelist, function()
    for _, item in ipairs(timeoutItems) do
        if item.selected then
            SL:RequestAuctionPutin(item.MakeIndex, ...)
        end
    end
end)

3. 市场分析报告

-- 显示同类物品销售数据
local marketData = SL:GetMarketAnalysis(itemData.id)
if marketData then
    local successRate = math.floor((marketData.sold / marketData.total) * 100)
    GUI:Text_setString(Text_market, 
        string.format("同类物品成交率: %d%%", successRate))

    -- 添加详情按钮
    GUI:addOnClickEvent(Button_detail, function()
        SL:ShowMarketReport(itemData.id)
    end)
end

4. 自动上架策略

-- 添加"自动重新上架"选项
GUI:addOnClickEvent(CheckBox_autoRelist, function()
    local autoRelist = GUI:CheckBox_isSelected(CheckBox_autoRelist)
    if autoRelist then
        SL:SetAutoRelist(itemData.id, {
            times = 3, -- 最多尝试3次
            discount = 0.9 -- 每次降价10%
        })
    end
end)

性能优化策略

1. 条件渲染优化

-- 只在需要时更新货币显示
if currencyChanged then
    AuctionTimeout.UpdateCurrency()
    currencyChanged = false
end

-- 折扣同理
if rebateChanged then
    AuctionTimeout.UpdateRebate()
    rebateChanged = false
end

2. 图标缓存机制

local iconCache = {}

function GetCachedIcon(itemId)
    if not iconCache[itemId] then
        iconCache[itemId] = GUI:CreateItemIcon(itemId)
    end
    return iconCache[itemId]:clone()
end

3. 事件代理模式

-- 使用单一事件处理所有货币选项
GUI:addOnClickEvent(CurrencyContainer, function(event)
    local target = event:getTarget()
    if target.name == "CurrencyItem" then
        local index = target:getTag()
        AuctionTimeout._currencyIndex = index
        AuctionTimeout.UpdateCurrency()
    end
end)

设计哲学总结

超时物品重上架系统体现了精妙的设计理念:

  1. 智能恢复

    • 自动匹配历史配置
    • 精准恢复价格设置
    • 继承原交易类型状态
  2. 操作精简

    • 锁定不可修改项
    • 双重操作选择
    • 智能默认值
  3. 状态感知

    • 交易类型联动
    • 实时输入验证
    • 条件渲染优化
  4. 用户体验优先

    • 明确的操作限制提示
    • 跨平台统一体验
    • 视觉反馈清晰

在游戏经济系统中,流拍物品的处理效率直接影响玩家体验。本系统通过智能恢复和操作简化,将原本繁琐的重上架流程转化为两步操作:"取回"或"调整后重新上架",大幅提升了拍卖行的使用效率。正如游戏设计大师Jesse Schell所言:"好的游戏设计是让玩家感觉聪明,而不是让游戏看起来聪明。"

思考题:如何设计拍卖行物品自动降价策略?需要考虑哪些经济平衡因素?欢迎分享你的设计方案!

您需要登录后才可以回帖 登录 | 马上加入

QQ|Archiver|手机版|小黑屋|alg阿灵戈社区 ( 苏ICP备2023026137号-1|苏ICP备2023026137号-1 )

GMT+8, 2025-7-27 08:04 , Processed in 0.484473 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表