拍卖行超时物品智能重上架系统:设计精要与实现解析
在游戏拍卖行生态中,超时物品的处理是提升经济系统效率的关键环节。本文将深入分析一段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)
设计哲学总结
超时物品重上架系统体现了精妙的设计理念:
-
智能恢复:
- 自动匹配历史配置
- 精准恢复价格设置
- 继承原交易类型状态
-
操作精简:
-
状态感知:
-
用户体验优先:
在游戏经济系统中,流拍物品的处理效率直接影响玩家体验。本系统通过智能恢复和操作简化,将原本繁琐的重上架流程转化为两步操作:"取回"或"调整后重新上架",大幅提升了拍卖行的使用效率。正如游戏设计大师Jesse Schell所言:"好的游戏设计是让玩家感觉聪明,而不是让游戏看起来聪明。"
思考题:如何设计拍卖行物品自动降价策略?需要考虑哪些经济平衡因素?欢迎分享你的设计方案!