2016-04-04 10 views
2

Also versuche ich ein einfaches Match 3 Spiel zu erstellen. Ich habe eine Aktorklasse Tile erstellt, um das Bild und die Daten über Zeile und Spalte zu speichern und eine andere Klasse GameField erstellt, die ein Array der Größe 9 * 9 der Kachel hat.Wie tausche ich Schauspieler in libgdx

Ich habe eine Funktion namens swap kacheln erstellt, um die Kacheln wie folgt zu tauschen, aber es hat ein seltsames Verhalten, dass nach zwei vertauschten Kacheln einer von ihnen auf Klicks reagiert, während der andere nicht mehr reagiert.

Hier sind die Eingänge Hörer von Tile-Klasse und die Swap-Kachel-Funktion von Spielfeld:

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; 


} 

Bitte informieren Sie mir, die möglichen Fehler, die ich denke, in der swapTile Funktion gibt

Antwort

2

So tauschen Sie keine Objekte aus - Sie vergeben nur Referenzen. Innerhalb Methode Variablen werden in Java kopiert nicht von Wert ist - dann nach

 Tile Temp = gameField[activeTile.row][activeTile.column]; 

Sie haben gleiche Instanzen sowohl in gameField[activeTile.row][activeTile.column] und Temp so, wenn Sie einer von ihnen verändern sich wie hier:

 gameField[activeTile.row][activeTile.column] = gameField[r][c]; 

die zweite man wird auch beeinflusst, was Probleme verursacht.

Was Sie tun müssen, ist Objekt kopieren Schritt-für-Schritt was Sie erreichen können, indem Sie Konstruktor implementieren implementieren. Take a look at this thread. Auf den Punkt gebracht würde es aussehen

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; 
     } 
    } 

Und sollte die Swap durch Zuweisung Referenzen werden implementieren nicht aber Schaffung neuer Objekt wie

Tile temp = new Tile(gameField[activeTile.row][activeTile.column]); 

Beachten Sie auch bitte, dass gute Praxis Name ist Variablen beginnend mit Kleinbuchstaben und Klassen mit Großbuchstaben. Dann werden Ihre temp Variablendefinition sollte sieht aus wie

Tiled temp = ...; 
+0

Konstruktor verwendet werden kann, wenn der Inhalt der Klassen bekannt ist, was ist, wenn der Inhalt nicht bekannt ist, wie Textur-Klasse als meine Actor erweitert ein Image und enthält auch eine Texture-Klasse. –

+1

können Sie den 'Image (Drawable Drawable)' - Konstruktor von Image verwenden und das Ergebnis 'getDrawable() 'anderer Tile an diesen übergeben –

1

wenn Sie wollen, ist zu Erziele Swap in 3-match-Spiel. Du solltest move Action für beide Spieler gleichzeitig verwenden.

+0

U in der swapTile Funktion sieht es bereits getan wird –

Verwandte Themen