DOF/sqr/User/UI/Window/5_Inventory/AvatarCollect.nut

343 lines
10 KiB
Plaintext

/*
文件名:AvatarCollect.nut
路径:User/UI/Window/5_Inventory/AvatarCollect.nut
创建日期:2025-02-16 09:07
文件用途:装扮物品栏
*/
//物品槽
class UISpace_Inventory.ItemSlot_Avatar {
X = null;
Y = null;
//物品对象
Item = null;
//物品对象的图标
ItemIcon = null;
//物品对象的详细信息窗口
ItemInfo = null;
//详细信息窗口显示Flag
ItemInfoShowFlag = false;
constructor() {
}
function SyncPos(x, y) {
this.X = x;
this.Y = y;
}
function SetItem(Item) {
this.Item = Item;
this.ItemIcon = this.Item.GetIconSprite();
}
//生成详细信息
function GenerateInfo() {
this.ItemInfo = this.Item.GetInfoWindow();
}
//显示详细信息
function ShowInfo(x, y) {
if (!this.ItemInfo) GenerateInfo();
this.ItemInfoShowFlag = true;
// 获取信息框尺寸
local infoW = 211;
local infoH = this.ItemInfo.RealCanvasHeight;
// X轴边界修正
if (x< 0) {
x = 0;
} else if (x + infoW > 1067) {
x = 1067 - infoW;
}
// Y轴边界修正
if (y< 0) {
y = 0;
} else if (y + infoH > 600) {
y = 600 - infoH;
}
//设置位置
this.ItemInfo.SetPosition(x, y);
this.ItemInfo.ResetFocus();
}
//关闭显示详细信息
function CloseInfo() {
if (this.ItemInfo) {
this.ItemInfoShowFlag = false;
this.ItemInfo.CloseWindow();
}
}
}
// 物品栏
class UISpace_Inventory.AvatarCollection extends Yosin_CommonUi {
//栏位类型
Type = null;
// 悬浮时显示的框
HoverEffect = null;
//行数
RowNum = null;
//底层画布对象
BottomCanvas = null;
//顶层画布对象
TopCanvas = null;
//物品对象List
ItemList = null;
//当前显示详细信息的物品对象
CurrentShowItem = null;
//当前鼠标指向的位置
ItemPos = null;
//拖拽物品原来的位置
DragItemPos = null;
constructor(x, y, rowNum, type) {
this.Type = type;
this.RowNum = rowNum;
//计算实际需要的高度
local RealH = 30 * rowNum;
base.constructor(x, y, 239, RealH);
//构造相应数量的槽
ItemList = array(8 * rowNum, null);
//整体底板
InitOverallBasePlate();
HoverEffect = CL_SpriteObject("sprite/interface/newstyle/windows/inventory/inventory.img", 131);
HoverEffect.SetZOrder(1);
HoverEffect.SetVisible(false);
Addchild(HoverEffect);
}
//根据高度绘制整体底板
function InitOverallBasePlate() {
// 创建画布
BottomCanvas = CL_CanvasObject();
// 重设大小并清空
BottomCanvas.ResizeAndClear(239, this.RowNum * 30);
// 开始绘制
BottomCanvas.BeginDraw();
foreach(pos, ItemObj in ItemList) {
local XPos = (pos % 8) * 30;
local YPos = (pos / 8) * 30;
local bg = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 49);
BottomCanvas.DrawSpriteFrame(bg, XPos, YPos);
}
// 结束绘制
BottomCanvas.EndDraw();
// 添加画布
Addchild(BottomCanvas);
}
//设置道具列表
function SetItemList(gItemList) {
//创建道具
foreach(Index, ItemObject in gItemList) {
ItemList[Index] = UISpace_Inventory.ItemSlot();
ItemList[Index].SetItem(ItemObject);
}
RefreshItemList();
}
//设置道具格子
function SetItemSlot(Idx, ItemObject) {
if (ItemObject == null) {
ItemList[Idx] = null;
} else {
ItemList[Idx] = UISpace_Inventory.ItemSlot();
ItemList[Idx].SetItem(ItemObject);
SetAddEffect(Idx);
}
RefreshItemList();
}
//设置添加特效
function SetAddEffect(Idx) {
local AddEffect = Animation("ui/inventory/slot.ani");
AddEffect.SetPosition((Idx % 8) * 30, (Idx / 8) * 30);
AddEffect.SetZOrder(100);
AddEffect.SetUpdateFunc(function(Ani, Dt) {
if (Ani.IsUsability == false) Ani.RemoveSelf();
});
Addchild(AddEffect);
}
//刷新道具列表
function RefreshItemList() {
//如果不存在则构造画布
if (!TopCanvas) {
// 创建画布
TopCanvas = CL_CanvasObject();
// 添加画布
Addchild(TopCanvas);
}
// 重设大小并清空
TopCanvas.ResizeAndClear(239, this.RowNum * 30);
// 开始绘制
TopCanvas.BeginDraw();
foreach(pos, ItemObj in ItemList) {
if (ItemObj) {
local XPos = (pos % 8) * 30;
local YPos = (pos / 8) * 30;
ItemObj.ItemIcon.SetPosition(XPos, YPos);
TopCanvas.DrawSprite(ItemObj.ItemIcon, XPos, YPos);
}
}
// 结束绘制
TopCanvas.EndDraw();
}
//override
//鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect) {
local WorldPosition = this.GetWorldPosition();
local xx = MousePos_X - WorldPosition.x;
local yy = MousePos_Y - WorldPosition.y;
local column = (yy / 30).tointeger();
//悬停的时候有可能悬停到最下面的最后一条缝 会导致判定行数多了一行 所以这里做限制
column = (column <= (RowNum - 1) ? column : (RowNum - 1));
local row = (xx / 30).tointeger();
//指向的项目位置
local Idx = column * 8 + row;
ItemPos = Idx;
//如果有道具
if (ItemList[Idx]) {
//设置透明度
HoverEffect.SetOpacity(0.4);
//如果没有物品信息窗口
if (!ItemList[Idx].ItemInfo) {
ItemList[Idx].GenerateInfo();
}
if (!ItemList[Idx].ItemInfoShowFlag) {
//关闭上一个显示的对象
if (CurrentShowItem) {
CurrentShowItem.CloseInfo();
}
//如果当前没有拖拽物品时才打开详细信息窗口
if (!IMouse.DragObj) {
//显示详细信息
ItemList[Idx].ShowInfo(MousePos_X - 50, MousePos_Y - ((ItemList[Idx].ItemInfo.RealCanvasHeight + 10) / 2));
//记录当前显示的对象
CurrentShowItem = ItemList[Idx];
}
}
} else {
//关闭上一个显示的对象
if (CurrentShowItem) {
CurrentShowItem.CloseInfo();
}
HoverEffect.SetOpacity(1);
}
//设置悬停槽
HoverEffect.SetVisible(true);
HoverEffect.SetPosition(row * 30, column * 30);
} else {
ItemPos = null;
HoverEffect.SetVisible(false);
//关闭所有详细信息显示
foreach(ItemObj in ItemList) {
if (ItemObj && ItemObj.ItemInfoShowFlag) {
ItemObj.CloseInfo();
}
}
}
}
//override
//鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//关闭显示的对象
if (CurrentShowItem) {
CurrentShowItem.CloseInfo();
}
if (ItemPos != null && ItemList[ItemPos]) {
//记录拖拽物品
IMouse.AddDragObject(ItemList[ItemPos]);
//记录拖拽物品原来的位置
DragItemPos = ItemPos;
//从槽中移除
ItemList[ItemPos] = null;
//刷新物品列表
RefreshItemList();
}
}
//override
//鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (IMouse.DragObj) {
//如果拖动到窗口内部 发包交换位置
local WorldPosition = this.GetWorldPosition();
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, WorldPosition.x, WorldPosition.y, Width, Height)) {
MySocket.Send(PACKET_ID.INVENTORY_SWAP_ITEM, {
oldBaid = 9,
newBaid = 9,
oldPos = this.DragItemPos,
newPos = this.ItemPos,
});
}
//移除鼠标上的拖动道具
local DragItem = IMouse.RemoveDragObject();
//发包完成后先把道具放回去
ItemList[DragItemPos] = DragItem;
DragItemPos = null;
RefreshItemList();
}
}
//override
//鼠标右键按下回调
function OnMouseRbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseRbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//关闭显示的对象
if (CurrentShowItem) {
CurrentShowItem.CloseInfo();
}
if (ItemPos != null && ItemList[ItemPos]) {
//穿戴装备
if (this.Type == 0) {
MySocket.Send(PACKET_ID.WEAR_EQUIPMENT, {
backpackId = 9,
oldPos = ItemPos
});
}
//使用道具
else if (this.Type == 1) {
}
}
}
//移动Item逻辑
function MoveItem(oldPos, newPos) {
//如果这个格子不是空的 要把他放回交换的位置
if (ItemList[newPos] != null) {
local Temp = ItemList[newPos];
ItemList[oldPos] = Temp;
}
ItemList[newPos] = DragItem;
RefreshItemList();
}
}