簡體   English   中英

如何在libgdx中交換演員

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM