我制作了一个库存系统,并且我被困在应该通过简单的拖动来逐项移动项目的部分。
有一个Item[,] Inventory
数组,用于保存项目object fromCell, toCell
,它应该保存对鼠标按钮释放时要操作的单元格的引用,但是当我尝试这样做时:
object temp = toCell;
toCell = fromCell;
fromCell = temp;
......游戏只交换对象引用而不是实际对象。我如何使这项工作?
UPD:感谢Bartosz,我想出了这个。事实证明,您可以安全地使用对象数组的引用,并使用保存的要交换的对象索引更改 it 。
代码可以是这样的:
object fromArray, toArray;
int fromX, fromY, toX, toY;
// this is where game things happen
void SwapMethod()
{
object temp = ((object[,])toArray)[toX, toY];
((object[,])toArray)[toX, toY] = ((object[,])fromArray)[fromX, fromY];
((object[,])fromArray)[fromX, fromY] = temp;
}
答案 0 :(得分:2)
这个怎么样?
internal static void Swap<T>(ref T one, ref T two)
{
T temp = two;
two = one;
one = temp;
}
你所有的交换都变成了这个。
Swap(Inventory[fromCell], Inventory[toCell]);
此外,您可以添加数组的扩展名(如果更加舒适)。
public static void Swap(this Array a, int indexOne, int indexTwo)
{
if (a == null)
throw new NullReferenceException(...);
if (indexOne < 0 | indexOne >= a.Length)
throw new ArgumentOutOfRangeException(...);
if (indexTwo < 0 | indexTwo >= a.Length)
throw new ArgumentOutOfRangeException(...);
Swap(a[indexOne], a[indexTwo]);
}
像这样使用它:
Inventory.Swap(fromCell, toCell);
答案 1 :(得分:1)
为什么不使用索引到Inventory
数组:int fromCell, toCell
。
var temp = Inventory[toCell];
Inventory[toCell] = fromCell;
Inventory[fromCell] = temp;
您将库存建模为插槽的二维数组,因此使用索引访问它似乎相当安全。