У меня есть сетка спрайтов 6x6. Я пытаюсь создать следующее поведение, но у меня, похоже, проблемы с выбраннымЦеллом не сбрасываются. Кажется, что он сохранил выбранную ячейку случайно после обмена, но выбор и отмена выбора одной и той же ячейки, похоже, сработают.Перестановка предметов в сетке
- Когда пользователь отбирает ячейку, он должен стать выбранной ячейкой.
- Когда пользователь снова отбирает ячейку, выбранная ячейка должна быть сброшена до нуля (или ничего)
- Когда пользователь отбирает ячейку, а затем отбирает другую другую ячейку, эти ячейки должны быть заменены. (путем замены свойств объектов, после чего выбранная ячейка должна быть сброшена.)
Есть ли очевидная ошибка в том, как я реализую эту функциональность или есть более простой способ сделать это?
Клетки имеют следующие OnTouchEventMethod:
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
switch(pSceneTouchEvent.getAction()) {
case TouchEvent.ACTION_DOWN:
this.setScale(1.2f);
this.setZIndex(999);
this.gGrid.sortChildren();
Log.d("TOUCH", "ACTION_DOWN");
break;
case TouchEvent.ACTION_UP:
this.setScale(1.0f);
this.setZIndex(1);
this.gGrid.sortChildren();
Log.d("TOUCH", "ACTION_UP");
gGrid.cellTouchEvent(this);
break;
case TouchEvent.ACTION_MOVE:
break;
}
return false;
}
Этот код будет вызывать метод cellTouchEvent() в объекте сетки
/**
* called when a touch event is registered on a Grid Cell
*/
public void cellTouchEvent(GameGridCell cell) {
if(cell.isGGCellVisible()) {
if(this.selectedCell==null) {
this.setSelectedCell(cell);//sets the selected cell as one is not set
Log.d("TEST", "SET SELECTED CELL");
} else {
if(this.selectedCell == cell) {
Log.d("TEST", "UNSET SELECTED CELLS");
this.setSelectedCellToNull(); //Set selected cell to null as it was pressed twice
} else if (this.selectedCell != cell) {
this.swapCells(this.selectedCell, cell); //Swap the two cells
this.setSelectedCellToNull(); //Ensure selected cell is set to null after swap
}
}
} else if(!cell.isGGCellVisible()) {
cell.showCellContents(); //Show the contents of the cell as it is not visible
}
}
Наконец это код, чтобы сделать фактическую замену клеток
/**
* Swaps the two cells passed in as parameters
*/
public void swapCells(GameGridCell cellA, GameGridCell cellB) {
//First swap the locations in the gridItemsArray
this.gridItemsArray.setValueAt(cellA.getGGCellID(), cellB);
this.gridItemsArray.setValueAt(cellB.getGGCellID(), cellA);
//Save cell A variables
float x = cellA.getX();
float y = cellA.getY();
int id = cellA.getGGCellID();
int type = cellA.getGGCellType();
boolean visible = cellA.isVisible();
//Set cell A to cells B variables
cellA.setX(cellB.getX());
cellA.setY(cellB.getY());
cellA.setGGCellID(cellB.getGGCellID());
cellA.setGGCellType(cellB.getGGCellType());
cellA.setVisible(cellB.isVisible());
//set cell B to saved variables
cellB.setX(x);
cellB.setY(y);
cellB.setGGCellID(id);
cellB.setGGCellType(type);
cellB.setVisible(visible);
//Update the cell ID text
cellA.updateCellIDText();
cellB.updateCellIDText();
this.sortChildren(); //Finally sort the children
}
В качестве комментариев здесь приведены методы настройки выбранного клетка
/**
* @return the selectedCell
*/
public GameGridCell getSelectedCell() {
return selectedCell;
}
/**
* @param selectedCell the selectedCell to set
*/
public void setSelectedCell(GameGridCell selectedCell) {
if(selectedCell==null) {
this.selectedCell=null;
} else {
this.selectedCell = selectedCell;
}
this.gameLevel.updateCellIDText();
}
/**
* @param selectedCell the selectedCell to set
*/
public void setSelectedCellToNull() {
this.selectedCell=null;
this.gameLevel.updateCellIDText();
}
Если у вас есть проблемы с выбранной ячейкой, не сбрасываемой, пожалуйста, также отправьте код для вашего метода сброса. – Melquiades
Я добавил методы на вопрос – stumct
Кроме того, пожалуйста, проясните это предложение: «Кажется, он сохраняет выбранную ячейку случайно после обмена». Что значит держать? Случайно? Обратите внимание, что это действительно случайный или есть шаблон ... – Melquiades