所以我试图创建一个简单的比赛3游戏。 我创建了一个actor类Tile来存储关于行和列的图像和数据,并创建了另一个类GameField,它有一个大小为9 * 9的tile数组。
我创建了一个名为swap tiles的函数来交换tile,如下所示,但它有一个奇怪的行为,即在交换任意两个tile之后,其中一个响应点击而另一个停止响应点击。< / p>
以下是Tile类的输入监听器和gamefield的交换磁贴功能:
App-Id
请通知我我认为swapTile函数中存在的错误
答案 0 :(得分:2)
这样您就不会交换对象 - 您只是分配引用。内部方法变量没有被Java中的值复制 - 然后在
之后 Tile Temp = gameField[activeTile.row][activeTile.column];
您在gameField[activeTile.row][activeTile.column]
和Temp
中都有相同的实例,所以当您在此处更改其中一个时:
gameField[activeTile.row][activeTile.column] = gameField[r][c];
第二个因素也会受到影响。
您需要做的是逐步复制对象通过实现复制构造函数可以实现的目标。 Take a look at this thread。简而言之,它看起来像
class Tile extends Actor {
int row, column; //and others
public Tile() {}
public Tile(Tile tile) {
this();
//now copying another tile's values
this.row = tile.row;
this.column = tile.column;
}
}
交换应该不是通过分配引用来实现,而是创建新对象,如
Tile temp = new Tile( gameField[activeTile.row][activeTile.column] );
另请注意,良好的做法是命名以小写字母开头的变量和以大写字母开头的类。那么你的temp
变量定义应该是
Tiled temp = ...;
答案 1 :(得分:1)
如果你想在3场比赛中实现交换。你应该同时对两个角色使用移动动作。