【问题标题】:how to swap actors in libgdx如何在 libgdx 中交换演员
【发布时间】:2016-04-04 04:04:46
【问题描述】:

所以我正在尝试创建一个简单的三消游戏。 我创建了一个 Actor 类 Tile 来存储有关行和列的图像和数据,并创建了另一个类 GameField,它具有一个大小为 9 * 9 的 tile 数组。

我创建了一个名为交换图块的函数来交换图块,如下所示,但它有一个奇怪的行为,即在交换任何两个图块后,其中一个响应点击,而另一个停止响应进一步的点击。

这里是Tile类的输入监听器和gamefield的swap tile函数:

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 libgdx


    【解决方案1】:

    这样你就不会交换对象 - 你只是在分配引用。内部方法变量不会在 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 = ...;
    

    【讨论】:

    • 如果知道类的内容,则可以使用构造函数,如果不知道内容,例如 Texture 类,因为我的 Actor 扩展了一个 Image 并且也包含一个纹理类。
    • 您可以使用 Image 的 Image(Drawable drawable) 构造函数并将 getDrawable() 其他 Tile 的结果传递给此
    【解决方案2】:

    如果你想在 3 场比赛中实现交换。你应该同时对两个演员使用移动动作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-23
      • 2014-10-20
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多