[英]how to swap actors in libgdx
因此,我嘗試創建一個簡單的三消游戲。 我創建了一個演員類Tile來存儲有關行和列的圖像和數據,並創建了另一個類GameField,它具有9×9大小的tile數組。
我創建了一個名為swap tile的函數來交換圖塊,如下所示,但是它具有一種奇怪的行為,即在交換了兩個圖塊之后,其中一個響應點擊,而另一個停止響應。
這是Tile類的輸入偵聽器和gamefield的swap瓦片函數:
addListener(new InputListener() {
@Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
setActiveSprite(row, column, colour);
System.out.println("clicked" + "row :" + row + "column" + column);
return false;
}
});
public void setActiveSprite(int r, int c, int colour){
System.out.print(colour);
if (!(gf.activeTile.colour==0)){
gf.swapTiles(r, c, colour);
gf.activeTile.colour=0;
} else {
gf.activeTile.setAll(r, c, colour);
}
}
public void swapTiles(int r, int c, int colour) {
gameField[activeTile.row][activeTile.column].addAction(Actions.moveTo(
(40 + ((gameField[r][c].getHeight() * c) + (10 * c))),
(200 + (gameField[r][c].getWidth() * r)),
0.5f));
//setting the new position of clicked tile
gameField[r][c].addAction((Actions.moveTo(
(40 + ((gameField[r][c].getHeight() * activeTile.column) + (10 * activeTile.column))),
(200 + (gameField[r][c].getWidth() * activeTile.row)),
0.5f)));
Tile Temp = gameField[activeTile.row][activeTile.column];
gameField[activeTile.row][activeTile.column] = gameField[r][c];
gameField[activeTile.row][activeTile.column].row = activeTile.row;
gameField[activeTile.row][activeTile.column].column = activeTile.column;
gameField[r][c] = Temp;
gameField[r][c].row = r;
gameField[r][c].column = c;
}
請通知我我認為swapTile函數中可能存在的錯誤
這樣,您就不會交換對象, 而只是分配引用 。 內部方法變量不在Java中按值復制-然后
Tile Temp = gameField[activeTile.row][activeTile.column];
您在gameField[activeTile.row][activeTile.column]
和Temp
都具有相同的實例,因此當您更改其中一個實例時,如下所示:
gameField[activeTile.row][activeTile.column] = gameField[r][c];
第二個因素也受到影響,是什么導致了問題。
您需要做的是一步一步地復制對象,這可以通過實現復制構造函數來實現。 看一下這個線程 。 簡而言之,它看起來像
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 = ...;
如果要在3個對戰游戲中實現互換,則應在兩個角色上同時使用move Action。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.