2013-12-06 3 views
0

У меня есть сетка спрайтов 6x6. Я пытаюсь создать следующее поведение, но у меня, похоже, проблемы с выбраннымЦеллом не сбрасываются. Кажется, что он сохранил выбранную ячейку случайно после обмена, но выбор и отмена выбора одной и той же ячейки, похоже, сработают.Перестановка предметов в сетке

  1. Когда пользователь отбирает ячейку, он должен стать выбранной ячейкой.
  2. Когда пользователь снова отбирает ячейку, выбранная ячейка должна быть сброшена до нуля (или ничего)
  3. Когда пользователь отбирает ячейку, а затем отбирает другую другую ячейку, эти ячейки должны быть заменены. (путем замены свойств объектов, после чего выбранная ячейка должна быть сброшена.)

Есть ли очевидная ошибка в том, как я реализую эту функциональность или есть более простой способ сделать это?

Клетки имеют следующие 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(); 
} 
+0

Если у вас есть проблемы с выбранной ячейкой, не сбрасываемой, пожалуйста, также отправьте код для вашего метода сброса. – Melquiades

+0

Я добавил методы на вопрос – stumct

+0

Кроме того, пожалуйста, проясните это предложение: «Кажется, он сохраняет выбранную ячейку случайно после обмена». Что значит держать? Случайно? Обратите внимание, что это действительно случайный или есть шаблон ... – Melquiades

ответ

0

В сенсорном случае за действия, вместо того чтобы использовать перерыв, возвращает истину:

case TouchEvent.ACTION_UP: 
     this.setScale(1.0f); 
     this.setZIndex(1); 
     this.gGrid.sortChildren(); 
     Log.d("TOUCH", "ACTION_UP"); 

      gGrid.cellTouchEvent(this); 

     //don't use break 
     //break; 
     //instead return true, which means you've handled touch 
     return true; 

Сделайте это для всех действий, которые вы справляетесь.

+0

отлично - это, похоже, разрешило мои проблемы с событиями касания! – stumct

Смежные вопросы