我正在创建一个俄罗斯方块的副本,以练习游戏编程。我在Java中使用OpenGL。
在俄罗斯方块中,正如大多数人所知,当创建TetrisBlock时,它从屏幕的顶部中间开始,每隔一秒左右,向下平移1个单位的Y.当块与底边碰撞时或另一个TetrisBlock,它存储在网格上,并从顶部再次创建一个新块。
我有一个父类(TetrisBlock)和扩展父类的子类(Z-Block,T-Block等)。每个类的必要片段在下面的代码中。对于以下示例,我将重点关注IBlock。
父类:
public abstract class TetrisBlock implements KeyListener {
protected int[] myTranslation;
public TetrisBlock(int[] startingTranslation) {
myTranslation = startingTranslation;
}
子类:
public class IBlock extends TetrisBlock {
private static final int[] startingTranslation = { 5, -1 } //the top left of my screen is [0,0] so [5,-1] is the translation for I-Block to start in the top middle of the screen
public IBlock() {
super(startingTranslation);
}
现在,当块向下移动1个单位时,如果它没有碰撞到任何东西,则在同一个类中调用这部分代码。
myTranslation[1]--;
问题在于,当我的主类中再次构造块时,如下所示:
currentBlock = new IBlock();
新的IBlock起点是先前创建和碰撞的IBlock的平移,而不是屏幕的顶部中间。 startingTranslation是静态final,并打印[5,-1],因此不会被更改。但是,当调用新的IBlock时,父类中的myTranslation是先前IBlock的冲突转换。我希望问题在于给出的信息。提前谢谢。
答案 0 :(得分:0)
不幸的是(对你而言).toggle
并不意味着数组的内容无法更改,即它不是只读数组。它只是意味着您无法为其分配新数组。 数组是最终的,它内部的int不是,所以你正在做的是使用对原始数组的引用,当你的块丢弃时它会被更改。
您希望使用例如private static final int[] startingTranslation = { 5, -1 }
制作数组的防御副本,因此原始数组不会更改。
clone()