| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 文件名:ItemCollect.nut | 
					
						
							|  |  |  | 路径:User/UI/Window/5_Inventory/ItemCollect.nut | 
					
						
							|  |  |  | 创建日期:2025-01-06	13:50 | 
					
						
							|  |  |  | 文件用途: 物品栏 | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  | //物品槽 | 
					
						
							|  |  |  | class ItemSlot { | 
					
						
							|  |  |  |     X = null; | 
					
						
							|  |  |  |     Y = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //物品对象 | 
					
						
							|  |  |  |     Item = null; | 
					
						
							|  |  |  |     //物品对象的图标 | 
					
						
							|  |  |  |     ItemIcon = null; | 
					
						
							|  |  |  |     //物品对象的详细信息窗口 | 
					
						
							|  |  |  |     ItemInfo = null; | 
					
						
							|  |  |  |     //详细信息窗口显示Flag | 
					
						
							|  |  |  |     ItemInfoShowFlag = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     constructor() { | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |     function SyncPos(x, y) { | 
					
						
							|  |  |  |         this.X = x; | 
					
						
							|  |  |  |         this.Y = y; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |     function SetItem(Item) { | 
					
						
							|  |  |  |         this.Item = Item; | 
					
						
							| 
									
										
										
										
											2025-01-19 09:48:40 +08:00
										 |  |  |         this.ItemIcon = this.Item.GetIconSprite(); | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //生成详细信息 | 
					
						
							|  |  |  |     function GenerateInfo() { | 
					
						
							| 
									
										
										
										
											2025-01-19 09:48:40 +08:00
										 |  |  |         this.ItemInfo = this.Item.GetInfoWindow(); | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |     //显示详细信息 | 
					
						
							|  |  |  |     function ShowInfo(x, y) { | 
					
						
							|  |  |  |         if (!this.ItemInfo) GenerateInfo(); | 
					
						
							|  |  |  |         this.ItemInfoShowFlag = true; | 
					
						
							|  |  |  |         //设置位置 | 
					
						
							|  |  |  |         this.ItemInfo.SetPosition(x, y); | 
					
						
							|  |  |  |         this.ItemInfo.ResetFocus(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |     //关闭显示详细信息 | 
					
						
							|  |  |  |     function CloseInfo() { | 
					
						
							|  |  |  |         if (this.ItemInfo) { | 
					
						
							|  |  |  |             this.ItemInfoShowFlag = false; | 
					
						
							|  |  |  |             this.ItemInfo.CloseWindow(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  | // 物品栏 | 
					
						
							|  |  |  | class _ItemCollection extends Yosin_CommonUi { | 
					
						
							| 
									
										
										
										
											2025-01-08 01:50:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |     // 悬浮时显示的框 | 
					
						
							|  |  |  |     HoverEffect = null; | 
					
						
							|  |  |  |     //行数 | 
					
						
							|  |  |  |     RowNum = null; | 
					
						
							|  |  |  |     //底层画布对象 | 
					
						
							|  |  |  |     BottomCanvas = null; | 
					
						
							|  |  |  |     //顶层画布对象 | 
					
						
							|  |  |  |     TopCanvas = null; | 
					
						
							|  |  |  |     //物品对象List | 
					
						
							|  |  |  |     ItemList = null; | 
					
						
							|  |  |  |     //当前显示详细信息的物品对象 | 
					
						
							|  |  |  |     CurrentShowItem = null; | 
					
						
							|  |  |  |     //当前鼠标指向的位置 | 
					
						
							|  |  |  |     ItemPos = null; | 
					
						
							| 
									
										
										
										
											2025-01-09 22:23:33 +08:00
										 |  |  |     //拖拽中的物品对象 | 
					
						
							|  |  |  |     DragItem = null; | 
					
						
							|  |  |  |     //拖拽物品原来的位置 | 
					
						
							|  |  |  |     DragItemPos = null; | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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); | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //根据高度绘制整体底板 | 
					
						
							|  |  |  |     function InitOverallBasePlate() { | 
					
						
							| 
									
										
										
										
											2025-01-08 01:50:43 +08:00
										 |  |  |         // 创建画布 | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |         BottomCanvas = CL_CanvasObject(); | 
					
						
							| 
									
										
										
										
											2025-01-08 01:50:43 +08:00
										 |  |  |         // 重设大小并清空 | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |         BottomCanvas.ResizeAndClear(239, this.RowNum * 30); | 
					
						
							| 
									
										
										
										
											2025-01-08 01:50:43 +08:00
										 |  |  |         // 开始绘制 | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |         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); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |     //设置道具列表 | 
					
						
							|  |  |  |     function SetItemList(gItemList) { | 
					
						
							| 
									
										
										
										
											2025-01-09 22:23:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         //创建道具 | 
					
						
							|  |  |  |         foreach(Index, ItemObject in gItemList) { | 
					
						
							|  |  |  |             ItemList[Index] = ItemSlot(); | 
					
						
							| 
									
										
										
										
											2025-01-19 09:48:40 +08:00
										 |  |  |             ItemList[Index].SetItem(ItemObject); | 
					
						
							| 
									
										
										
										
											2025-01-09 22:23:33 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         RefreshItemList(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //刷新道具列表 | 
					
						
							|  |  |  |     function RefreshItemList() { | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |         //如果不存在则构造画布 | 
					
						
							|  |  |  |         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); | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-01-08 01:50:43 +08:00
										 |  |  |         // 结束绘制 | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |         TopCanvas.EndDraw(); | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //override | 
					
						
							|  |  |  |     //鼠标事件回调 | 
					
						
							|  |  |  |     function OnMouseProc(MousePos_X, MousePos_Y) { | 
					
						
							| 
									
										
										
										
											2025-01-19 09:48:40 +08:00
										 |  |  |         if (!Visible) return; | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  |         base.OnMouseProc(MousePos_X, MousePos_Y); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-07 20:52:28 +08:00
										 |  |  |         if (isInRect) { | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  |             local WorldPosition = this.GetWorldPosition(); | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |             local xx = MousePos_X - WorldPosition.x; | 
					
						
							|  |  |  |             local yy = MousePos_Y - WorldPosition.y; | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  |             local column = (yy / 30).tointeger(); | 
					
						
							| 
									
										
										
										
											2025-01-19 09:48:40 +08:00
										 |  |  |             //悬停的时候有可能悬停到最下面的最后一条缝 会导致判定行数多了一行 所以这里做限制 | 
					
						
							|  |  |  |             column = (column <= (RowNum - 1) ? column : (RowNum - 1)); | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  |             local row = (xx / 30).tointeger(); | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |             //指向的项目位置 | 
					
						
							|  |  |  |             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(); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2025-01-09 22:23:33 +08:00
										 |  |  |                     //如果当前没有拖拽物品时才打开详细信息窗口 | 
					
						
							|  |  |  |                     if (!DragItem) { | 
					
						
							|  |  |  |                         //显示详细信息 | 
					
						
							| 
									
										
										
										
											2025-01-19 09:48:40 +08:00
										 |  |  |                         ItemList[Idx].ShowInfo(MousePos_X - 50, MousePos_Y - ((ItemList[Idx].ItemInfo.RealCanvasHeight + 10) / 2)); | 
					
						
							| 
									
										
										
										
											2025-01-09 22:23:33 +08:00
										 |  |  |                         //记录当前显示的对象 | 
					
						
							|  |  |  |                         CurrentShowItem = ItemList[Idx]; | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 //关闭上一个显示的对象 | 
					
						
							|  |  |  |                 if (CurrentShowItem) { | 
					
						
							|  |  |  |                     CurrentShowItem.CloseInfo(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 HoverEffect.SetOpacity(1); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             //设置悬停槽 | 
					
						
							|  |  |  |             HoverEffect.SetVisible(true); | 
					
						
							|  |  |  |             HoverEffect.SetPosition(row * 30, column * 30); | 
					
						
							|  |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2025-01-09 22:23:33 +08:00
										 |  |  |             ItemPos = null; | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |             HoverEffect.SetVisible(false); | 
					
						
							|  |  |  |             //关闭所有详细信息显示 | 
					
						
							|  |  |  |             foreach(ItemObj in ItemList) { | 
					
						
							|  |  |  |                 if (ItemObj && ItemObj.ItemInfoShowFlag) { | 
					
						
							|  |  |  |                     ItemObj.CloseInfo(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |     //override | 
					
						
							|  |  |  |     //鼠标左键按下回调 | 
					
						
							|  |  |  |     function OnMouseLbDown(MousePos_X, MousePos_Y) { | 
					
						
							|  |  |  |         if (!Visible) return; | 
					
						
							|  |  |  |         base.OnMouseLbDown(MousePos_X, MousePos_Y); | 
					
						
							|  |  |  |         //关闭显示的对象 | 
					
						
							|  |  |  |         if (CurrentShowItem) { | 
					
						
							|  |  |  |             CurrentShowItem.CloseInfo(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-09 22:23:33 +08:00
										 |  |  |         if (ItemPos != null && ItemList[ItemPos]) { | 
					
						
							|  |  |  |             DragItem = ItemList[ItemPos]; | 
					
						
							|  |  |  |             DragItemPos = ItemPos; | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |             ItemList[ItemPos] = null; | 
					
						
							| 
									
										
										
										
											2025-01-19 09:48:40 +08:00
										 |  |  |             local IconBuffer = DragItem.Item.GetIconSprite(); | 
					
						
							| 
									
										
										
										
											2025-01-09 22:23:33 +08:00
										 |  |  |             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; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-09 22:23:33 +08:00
										 |  |  |             ItemList[ItemPos] = DragItem; | 
					
						
							|  |  |  |             DragItem = null; | 
					
						
							|  |  |  |             IMouse.RemoveObject("ItemCollectDragItem"); | 
					
						
							|  |  |  |             RefreshItemList(); | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-09 19:56:55 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2025-01-06 21:00:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-11 01:27:48 +08:00
										 |  |  | // 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(); | 
					
						
							|  |  |  | // } |