275 lines
8.0 KiB
Plaintext
275 lines
8.0 KiB
Plaintext
/*
|
|
文件名:ItemCollect.nut
|
|
路径:User/UI/Window/5_Inventory/ItemCollect.nut
|
|
创建日期:2025-01-06 13:50
|
|
文件用途: 物品栏
|
|
*/
|
|
//物品槽
|
|
class ItemSlot {
|
|
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;
|
|
//设置位置
|
|
this.ItemInfo.SetPosition(x, y);
|
|
this.ItemInfo.ResetFocus();
|
|
}
|
|
|
|
//关闭显示详细信息
|
|
function CloseInfo() {
|
|
if (this.ItemInfo) {
|
|
this.ItemInfoShowFlag = false;
|
|
this.ItemInfo.CloseWindow();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// 物品栏
|
|
class _ItemCollection extends Yosin_CommonUi {
|
|
|
|
// 悬浮时显示的框
|
|
HoverEffect = null;
|
|
//行数
|
|
RowNum = null;
|
|
//底层画布对象
|
|
BottomCanvas = null;
|
|
//顶层画布对象
|
|
TopCanvas = null;
|
|
//物品对象List
|
|
ItemList = null;
|
|
//当前显示详细信息的物品对象
|
|
CurrentShowItem = null;
|
|
//当前鼠标指向的位置
|
|
ItemPos = null;
|
|
//拖拽中的物品对象
|
|
DragItem = null;
|
|
//拖拽物品原来的位置
|
|
DragItemPos = null;
|
|
|
|
|
|
constructor(x, y, rowNum) {
|
|
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] = ItemSlot();
|
|
ItemList[Index].SetItem(ItemObject);
|
|
}
|
|
|
|
RefreshItemList();
|
|
}
|
|
|
|
//刷新道具列表
|
|
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) {
|
|
if (!Visible) return;
|
|
base.OnMouseProc(MousePos_X, MousePos_Y);
|
|
|
|
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 (!DragItem) {
|
|
//显示详细信息
|
|
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) {
|
|
if (!Visible) return;
|
|
base.OnMouseLbDown(MousePos_X, MousePos_Y);
|
|
//关闭显示的对象
|
|
if (CurrentShowItem) {
|
|
CurrentShowItem.CloseInfo();
|
|
}
|
|
|
|
if (ItemPos != null && ItemList[ItemPos]) {
|
|
DragItem = ItemList[ItemPos];
|
|
DragItemPos = ItemPos;
|
|
ItemList[ItemPos] = null;
|
|
local IconBuffer = DragItem.Item.GetIconSprite();
|
|
IconBuffer.SetPosition(-15, -15);
|
|
IMouse.AttachObjectBottom("ItemCollectDragItem", IconBuffer);
|
|
RefreshItemList();
|
|
}
|
|
}
|
|
|
|
//override
|
|
//鼠标左键弹起回调
|
|
function OnMouseLbUp(MousePos_X, MousePos_Y) {
|
|
if (!Visible) return;
|
|
base.OnMouseLbUp(MousePos_X, MousePos_Y);
|
|
|
|
if (DragItem) {
|
|
//如果这个格子不是空的 要把他放回交换的位置
|
|
if (ItemList[ItemPos] != null) {
|
|
local Temp = ItemList[ItemPos];
|
|
ItemList[DragItemPos] = Temp;
|
|
DragItemPos = null;
|
|
}
|
|
|
|
ItemList[ItemPos] = DragItem;
|
|
DragItem = null;
|
|
IMouse.RemoveObject("ItemCollectDragItem");
|
|
RefreshItemList();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// if (!getroottable().rawin("chongzaiflag")) {
|
|
// getroottable()["chongzaiflag"] <- true;
|
|
// } else {
|
|
// //遍历窗口队列 如果可见则调用Show
|
|
// for (local i = 0; i< _SYS_WINDOW_LIST_.len(); i++) {
|
|
// local Window = _SYS_WINDOW_LIST_[i];
|
|
// Window.Visible = false;
|
|
// Window.RemoveSelf();
|
|
// }
|
|
// TestStage();
|
|
// } |