2009-02-02 57 views
0

我想在XNA中制作类似俄罗斯方块的游戏,目前我正在考虑以何种方式处理它。在阵列中移动对象

这就是我到目前为止: 我有一个叫Block的类,它有例如纹理和颜色色调。

然后我打算在双阵列,其具有的一切,如:

Block[,] blocks = new Block[10,20]; 

那么这将是满格。

然后当块向下移动,我想这样做是这样的:

blocks[x,y+1] = blocks[x,y]; 

blocks[x,y] = null; 

起初我还以为这是个好主意,但现在当我一直在想我没有那么当然。它如何与记忆等一起工作?每当我这样做或什么时,它会创建一个新对象吗?有人可以解释一下,当我在数组中移动一个对象时它是如何工作的?

我不是真的在寻找一个特定于俄罗斯方块的答案,我只是对它是如何工作感兴趣的。

谢谢。

回答

2

不,你只是在移动指针。当你说:

blocks[x,y+1] = blocks[x,y]; 

你基本上做的是交换指针。该对象将保持原来的位置,但现在不是索引x,y它将位于索引x,y + 1处。当你说

blocks[x,y] = null; 

有您要移除参照对象x,y和如果没有其他人拿着一个参考,垃圾集气器将它清理干净。

0

如果您在数组中存储值类型(例如int,string),那么您确实会在每次复制值时创建数据的副本,因为值类型在C#中是不可变的。由于您在数组中存储了一个类(这是一个引用类型),因此您的代码实际上只是制作指针的副本,而不是整个对象。

1

上面的第一个答案几乎是正确的,但分配不交换指针,它正在复制它。在第一行代码之后,有两个对块最初引用的对象的引用[x,y]。 null赋值将删除原始引用,但您仍然拥有生活在块[x,y + 1]的新引用。没有一个和堆对象是GC的公平游戏。