/* 文件名:234_HUD_FuncInter.nut 路径:User/UI/Window/234_HUD_FuncInter.nut 创建日期:2025-01-29 13:35 文件用途:NPC 与 玩家 功能交互 */ _NameSpace_FunctionInteractive <- {}; class _NameSpace_FunctionInteractive._InteractiveButton extends Yosin_CommonUi { //按钮状态 State = 0; Sprite = null; SpriteState = -1; Info = null; FramePath = "sprite/interface2/popup_menu/popup_back.img"; FrameList = null; RoleTextActor = null; Role = null; RoleValue = null; constructor(RoleName, RoleValue) { this.Role = RoleName; this.RoleValue = RoleValue; base.constructor(0, 0, 100, 21); if (AssetManager.EtcConfig.NpcRole.rawin(RoleName)) { Info = AssetManager.EtcConfig.NpcRole[RoleName]; Init(); } else { error("NPC 功能交互 功能错误"); } } function Init() { FrameList = []; //基础态 FrameList.push(CL_SpriteFrameObject(this.FramePath, 0)); //悬停态 FrameList.push(CL_SpriteFrameObject(this.FramePath, Info.imgidx * 2 + 1)); //按下态 FrameList.push(CL_SpriteFrameObject(this.FramePath, Info.imgidx * 2 + 2)); Sprite = CL_SpriteObject(); Addchild(Sprite); //绘制功能图标 local RoleIconActor = CL_SpriteObject("sprite/interface2/popup_menu/popup_icon_" + Info.iconpath + ".img", Info.iconidx); RoleIconActor.SetZOrder(1); Addchild(RoleIconActor); //功能文本 RoleTextActor = FontAssetManager.GenerateNormal(Info.name, true, { color = Info.namecolor }); RoleTextActor.SetPosition(18 + (82 - RoleTextActor.GetSize().w) / 2, 1); RoleTextActor.SetZOrder(1); Addchild(RoleTextActor); OnClick = function(Btn) { _NameSpace_FunctionInteractive[Role](RoleValue); }; } function ChangeFrame() { //状态更改 刷新精灵帧 if (State != SpriteState) { //按下时 文本下移 if (State == 2) { RoleTextActor.MoveBy(0, 1); } else if (SpriteState == 2) { RoleTextActor.MoveBy(0, -1); } SpriteState = State; Sprite.SetFrame(FrameList[SpriteState]); } } function Proc(Dt) { //不可用 if (State == 3) { } else { //按下 if (isLBDown) { State = 2; } //悬停 else if (isInRect) { State = 1; } //普通 else { State = 0; } } ChangeFrame(); } } //窗口主类 class _NameSpace_FunctionInteractive._FunctionInteractive extends Yosin_Window { NpcInfo = null; //顶层窗口 IsTop = true; //生成器 如果这个窗口开着就刷新一下位置 如果没有就生成一个 function Generator(Id, Xpos, Ypos) { local RealId = "NPC交互窗口" + Id; foreach(Index, WindowObj in _SYS_WINDOW_LIST_) { if (WindowObj.ObjectId == RealId) { WindowObj.SetPosition(Xpos, Ypos); WindowObj.ResetFocus(); return WindowObj; } } return _NameSpace_FunctionInteractive._FunctionInteractive(Id, Xpos, Ypos); } //构造函数 constructor(Id, Xpos, Ypos) { //获取npc数据 NpcInfo = AssetManager.GetNpc(Id); //获取npc功能数量 local NpcFuncCount = NpcInfo.role.len(); // 默认构造数据 NpcFuncCount 要+1 因为还有他自己的头像 base.constructor("NPC交互窗口" + Id, Xpos, Ypos, 100, (NpcFuncCount + 1) * 21, 0); ResetFocus(); // OpenDeBug(); // 初始化窗口 InitWindow(); } // 初始化窗口 function InitWindow() { local Header = CL_SpriteObject("sprite/interface2/popup_menu/popup_back.img", 0); Addchild(Header); //NPC头像 local NpcFace = CL_SpriteObject(NpcInfo["popup_face"].img, NpcInfo["popup_face"].idx); Addchild(NpcFace); //NPC名字 local NpcNameTextActor = FontAssetManager.GenerateNormal(NpcInfo.name, true, { color = sq_RGBA(231, 199, 156, 250) }); NpcNameTextActor.SetPosition(18 + (82 - NpcNameTextActor.GetSize().w) / 2, 1); NpcNameTextActor.SetZOrder(1); Addchild(NpcNameTextActor); local pos = 1; foreach(Role, Value in NpcInfo.role) { local Buffer = _NameSpace_FunctionInteractive._InteractiveButton(Role, Value); Buffer.SetPosition(0, pos * 21) AddUIChild(Buffer); pos++; } } //override //鼠标左键单击回调 function OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) { //点到自己 先执行子类Button的事件 在关闭自己 base.OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag); CloseWindow(); } //override //鼠标左键按下回调 function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) { if (!WindowInteractiveFlag) base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag); else CloseWindow(); //没点到自己直接关闭 if (!Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, Width, Height)) CloseWindow(); } } //NPC商店回调 _NameSpace_FunctionInteractive["item shop"] <- function(Value) { //判断是否生成过 foreach(Index, WindowObj in _SYS_WINDOW_LIST_) { if (WindowObj.ObjectId == "NPC商店") { WindowObj.ResetFocus(); ClientCharacterInventory.ResetFocus(); return; } } //生成窗口 local WindowObj = UISpace_NpcShop.Shop("NPC商店", 130, 63, 366, 486, 20); WindowObj.Init(Value); WindowObj.ResetFocus(); ClientCharacterInventory.ResetFocus(); }