0

我正在尝试在 XNA 中制作类似俄罗斯方块的游戏,目前我正在考虑最好的处理方式。

这就是我目前所拥有的:我有一个名为 Block 的类,它具有例如纹理和颜色色调。

然后我打算把所有东西都放在一个双数组中,比如:

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

这将是完整的网格。

然后当块向下移动时,我正在考虑这样做:

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

blocks[x,y] = null;

起初我认为这是一个好主意,但现在当我一直在思考时,我不太确定。它如何与内存等一起工作?每次我这样做时它会创建一个新对象还是什么?有人可以解释一下当我在数组中移动对象时它是如何工作的吗?

我并不是真的在寻找特定于俄罗斯方块的答案,我只是对它的实际工作方式感兴趣。

谢谢。

4

3 回答 3

2

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

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

你本质上做的是交换指针。该对象将准确地停留在它所在的位置,但现在它不是在索引 x,y 处,而是在 x 的索引处,y+1。当你说

blocks[x,y] = null;

在那里你正在删除对对象 x,y 的引用,如果没有其他东西持有引用,垃圾收集器将清理它。

于 2009-02-02T19:06:46.083 回答
1

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

于 2009-02-03T00:01:56.083 回答
0

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

于 2009-02-02T19:08:25.677 回答