XNA游戏项目拖放 - 如何实现对象交换?

时间:2012-09-15 18:01:35

标签: c# swap

我制作了一个库存系统,并且我被困在应该通过简单的拖动来逐项移动项目的部分。

有一个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;
}

2 个答案:

答案 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;

您将库存建模为插槽的二维数组,因此使用索引访问它似乎相当安全。