DOF/sqr/User/UI/Window/7_Npc_Shop.nut

375 lines
12 KiB
Plaintext

/*
文件名:7_Npc_Shop.nut
路径:User/UI/Window/7_Npc_Shop.nut
创建日期:2025-01-26 18:30
文件用途:NPC商店
*/
//NPC商店命名空间
UISpace_NpcShop <- {};
class UISpace_NpcShop.Item extends Yosin_CommonUi {
//槽位
Index = null;
//物品
Item = null;
//物品图标
ItemIcon = null;
//物品对象的详细信息窗口
ItemInfo = null;
//详细信息窗口显示Flag
ItemInfoShowFlag = false;
//物品需求图标
ItemRequireIcon = null;
//物品需求数量
ItemRequireCount = null;
//物品需求名称
ItemRequireName = null;
//信息
Info = null;
//画布对象
Canvas = null;
//悬停框
HoverBox = null;
constructor(gIndex, gInfo) {
base.constructor(0, 0, 165, 57);
this.Index = gIndex;
this.Info = gInfo;
InitItem();
InitDraw();
}
function InitItem() {
//构造道具
this.Item = GameItem.Item.ConstructionItemById(Info.Id);
//构造图标
this.ItemIcon = this.Item.GetIconSprite();
//构造详细信息窗口
this.ItemInfo = this.Item.GetInfoWindow();
this.ItemInfo.SetZOrder(1);
//构造需求图标
//物品
if (this.Info.Material) {
}
//金币
else if (this.Info.Gold) {
ItemRequireCount = this.Info.Gold;
ItemRequireIcon = CL_SpriteObject("sprite/interface/lenheartwindowcommon.img", 299);
ItemRequireName = "金币";
}
//点卷
else if (this.Info.Cera) {
ItemRequireName = "点卷";
}
//代币券
else if (this.Info.CeraPoint) {
ItemRequireName = "代币券";
}
}
function InitDraw() {
Canvas = CL_CanvasObject();
Addchild(Canvas);
Canvas.ResizeAndClear(321, 5000);
Canvas.BeginDraw();
//绘制背景
Canvas.DrawSpriteFrame(CL_SpriteFrameObject("sprite/interface2/ui/shop/shop_slot.img", 0), 0, 0);
//绘制图标
Canvas.DrawSprite(ItemIcon, 5, 7);
//绘制名称
local Name = FontAssetManager.GenerateNormal(Item.Name, false, {
color = AssetManager.EtcConfig.ItemInfoTag.rarity_color[Item.Rarity]
});
Canvas.DrawActor(Name, 44, 7);
//绘制价格槽
local SlotBg = CL_SpriteObject("sprite/interface/lenheartwindowcommon.img", 391);
SlotBg.SetScale(5.2, 1.0);
SlotBg.SetPosition(84, 38);
Canvas.DrawSprite(SlotBg);
//绘制需求道具图标
if (ItemRequireIcon) {
ItemRequireIcon.SetScale(0.5, 0.5);
ItemRequireIcon.SetPosition(142, 38);
Canvas.DrawSprite(ItemRequireIcon);
}
//绘制需求数量
if (ItemRequireCount) {
local RequireCount = FontAssetManager.GenerateNormal(ItemRequireCount.tostring(), false, {
color = sq_RGBA(255, 255, 255, 255) //TODO 这里要计算我是否有足够的道具去购买他 选择是否标红
});
Canvas.DrawActor(RequireCount, 142 - (RequireCount.GetSize().w), 37);
}
Canvas.EndDraw();
//构造悬停框精灵
HoverBox = CL_SpriteObject("sprite/interface2/ui/shop/shop_slot.img", 1);
HoverBox.SetMode(0);
HoverBox.SetVisible(false);
Addchild(HoverBox);
}
//override
//鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect) {
//没有输入框的时候才会显示悬停框
if (!Parent.QuantityInput || Parent.QuantityInput.Visible == false) HoverBox.SetVisible(true);
//判断是否有悬停到道具图标
local Pos = GetWorldPosition();
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x + 5, Pos.y + 7, 32, 32)) {
if (!ItemInfoShowFlag) {
ItemInfoShowFlag = true;
ItemInfo.SetPosition(MousePos_X + 16, MousePos_Y + 16);
ItemInfo.ResetFocus();
}
}
} else {
HoverBox.SetVisible(false);
if (ItemInfoShowFlag) {
ItemInfoShowFlag = false;
ItemInfo.CloseWindow();
}
}
//输入框出来了关闭道具显示信息
if (Parent.QuantityInput && Parent.QuantityInput.Visible) {
HoverBox.SetVisible(false);
if (ItemInfoShowFlag) {
ItemInfoShowFlag = false;
ItemInfo.CloseWindow();
}
}
}
//override
//鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//关闭显示的对象
if (ItemInfoShowFlag) {
ItemInfoShowFlag = false;
ItemInfo.CloseWindow();
}
}
//鼠标左键单击回调
function OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//购买逻辑
if (isInRect && !WindowInteractiveFlag) {
if (!Parent.QuantityInput) {
Parent.QuantityInput = _QuantityInput(MousePos_X - 35, MousePos_Y - 35);
} else {
Parent.QuantityInput.SetPosition(MousePos_X - 35, MousePos_Y - 35);
Parent.QuantityInput.ResetFocus();
}
Parent.QuantityInput.SetOnConfirmFunc(function(Count) {
//设置购买信息
Parent.Parent.SetBuyInfo({
npcshopId = Parent.Parent.ShopId,
shopId = Parent.Type,
pos = Index,
num = Count
});
local NoticeBox = _Yosin_MessageBox(format("购买[%s]数量 %d 个\n总购买费用为 %d %s\n您确定要购买吗?", Item.Name, Count, Count * ItemRequireCount, ItemRequireName));
NoticeBox.SetOnConfirmFunc(function() {
Parent.Parent.SendBuyInfo();
}.bindenv(this));
}.bindenv(this));
}
}
}
// 物品栏
class UISpace_NpcShop.ItemCollection extends Yosin_Window {
//是否为独立窗口
IsIndependent = false;
//是否为图层窗口
IsLayer = true;
//栏位类型
Type = null;
//信息
Info = null;
//物品列表
ItemList = null;
//数量输入框
QuantityInput = null;
constructor(x, y, type, gInfo) {
this.Type = type;
this.Info = gInfo;
//计算实际需要的高度
base.constructor("商店页面" + type + clock(), x, y, 336, 400, 0);
SetClipRect(0, 0, 336, 400);
// OpenDeBug();
Init();
}
function Init() {
ItemList = [];
foreach(Index, ItemObject in Info) {
local Buffer = UISpace_NpcShop.Item(Index, ItemObject);
Buffer.SetPosition(2 + (168 * (Index % 2)), 2 + (61 * (Index / 2)));
AddUIChild(Buffer);
}
}
}
class UISpace_NpcShop.Shop extends Yosin_Window {
//商店信息
Info = null;
//商店ID
ShopId = null;
//栏
ItemCollection = null;
//滚动条
ScrollObject = null;
//购买信息包
BuyInfo = null;
function _typeof() {
return "Game_Window";
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
ItemCollection = [];
base.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
}
function Init(gShopId) {
ShopId = gShopId;
//判断NPC是否有商店
Info = AssetManager.GetNpcShop(ShopId);
if (Info) {
local title = Yosin_TopTitle(Width, Height, Info.name);
AddUIChild(title);
//注册控件
} else throw "NPC没有商店";
//注册控件
RegisterWidget();
}
function RegisterWidget() {
//关闭按钮
local closeBtn = Yosin_BaseButton(Width - 20, 4, 12, 12, "sprite/interface/lenheartwindowcommon.img", 544);
closeBtn.DownSimulateOffset = false;
closeBtn.SetZOrder(1);
closeBtn.OnClick = function(btn) {
DestroyWindow();
}.bindenv(this);
AddUIChild(closeBtn);
//分页按钮
local titlesBtn = Yosin_RowMoreTitleBtn(5, 30, 354, Info.PageNameList, "sprite/interface/lenheartwindowcommon.img", 160);
AddUIChild(titlesBtn);
titlesBtn.LBDownOnClick = function(btns, index) {
// ChangPage(index);
}.bindenv(this);
titlesBtn.LBDownOnClick = function(btns, index) {
foreach(Iindex, ItemCollectionBuffer in ItemCollection) {
if (Iindex == index) {
ItemCollectionBuffer.SetVisible(true);
} else {
ItemCollectionBuffer.SetVisible(false);
}
}
}.bindenv(this);
//底框
local Bg = Yosin_NineBoxStretch(353, 407, "sprite/interface/lenheartwindowcommon.img", 97);
Bg.SetPosition(8, 51);
Addchild(Bg);
//滚动条
ScrollObject = Yosin_ScrollBar(347, 55, 400, 20);
ScrollObject.SetScrollBarState(false);
ScrollObject.SetChangeCallBack(function(Value) {
MsgTextWindow.SetScrollPos(Value);
}.bindenv(this));
AddUIChild(ScrollObject);
//创建栏位
foreach(Index, LInfo in Info.PageList) {
local Buffer = UISpace_NpcShop.ItemCollection(10, 53, Index, LInfo);
ItemCollection.push(Buffer);
AddUIChild(Buffer);
if (Index != 0) Buffer.SetVisible(false);
}
//购买按钮
local BuyButton = Yosin_SplicingButton(115, 456, 59, 24 "sprite/interface/lenheartwindowcommon.img", 172, true, false);
//购买按钮文本
local BuyTextActor = FontAssetManager.GenerateNormal("购买", false, {
color = sq_RGBA(186, 147, 97, 255)
});
BuyTextActor.SetZOrder(1);
BuyTextActor.SetPosition(18, 3);
BuyButton.OnClick = function(Button) {
}.bindenv(this);
BuyButton.Addchild(BuyTextActor);
AddUIChild(BuyButton);
//出售按钮
local SellButton = Yosin_SplicingButton(184, 456, 59, 24 "sprite/interface/lenheartwindowcommon.img", 172, true, false);
//出售按钮文本
local SellTextActor = FontAssetManager.GenerateNormal("出售", false, {
color = sq_RGBA(186, 147, 97, 255)
});
SellTextActor.SetZOrder(1);
SellTextActor.SetPosition(18, 3);
SellButton.OnClick = function(Button) {
}.bindenv(this);
SellButton.Addchild(SellTextActor);
AddUIChild(SellButton);
}
//设置购买信息
function SetBuyInfo(gTable) {
BuyInfo = gTable;
}
//发送购买信息
function SendBuyInfo() {
if (BuyInfo) {
//发送购买信息
MySocket.Send(PACKET_ID.BUY_ITEM, BuyInfo);
//清空购买信息
BuyInfo = null;
}
}
//逻辑入口
function Proc(Dt) {
SyncPos(X, Y);
base.Proc(Dt);
}
//在Esc按下时
function OnEsc() {
//下帧执行
Timer.SetNextFrame(function(Window) {
Window.DestroyWindow();
}, this);
}
}