/* 文件名: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); } }