2016-04-27 11 views
7

Ho appena iniziato a sviluppare app Android (con java, in Android Studio, se questo è importante), e sto facendo un piccolo progetto, solo per divertimento. Voglio creare la mia app di scacchi, e finora ho fatto parecchie cose. Ho creato un menu per passare ad un'altra attività che è il gioco stesso, ho fatto una personalizzazione con una tavola dipinta di per sé, e penso che anche il mio modello sia quasi completo. L'unica cosa che non capisco è come gestire un trascinamento. Quindi, quando si sposta un pezzo da una posizione in un'altra posizione con un gesto di trascinamento, come si ottiene il punto iniziale e quello finale?Come gestire il trascinamento in un'app di scacchi Android?

Come già detto, ho già implementato una mossa nel mio modello (con un movimento di funzione (posizione iniziale, fine posizione)) e controlla anche se quel movimento è valido per un determinato pezzo, ma l'unica cosa di cui ho ancora bisogno è qualcosa che mi permette di trascinare un pezzo sulla lavagna reale.

Stavo pensando di mettere un metodo onDrag nella mia classe Controller, ma non so come farlo funzionare, e non riesco a trovare buoni esempi su internet. Ho già iniziato con questo, ma non so se potrebbe mai funzionare.

Potrebbe aiutarmi a implementare la resistenza?

Grazie in anticipo!

P.S. Aggiungerò anche il codice per la vista personalizzata e il controller (non ancora completo) nella mia domanda, se questo aiuta. Se hai bisogno di più del mio codice per rispondere a questa domanda, lo metto anche qui, fammelo sapere.

public class ChessView extends View implements Observer { 
    private Game game; 
    private static final Paint WHITE_PAINT = new Paint(), BLACK_PAINT = new Paint(); 

    public ChessView(Context context) { 
     super(context); 
     init(); 
    } 

    public ChessView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public ChessView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    public void init() { 
     WHITE_PAINT.setColor(Color.rgb(200, 159, 77)); 
     BLACK_PAINT.setColor(Color.rgb(61, 34, 18)); 
    } 

    public void setGame(Game game) { 
     if (this.game != null) 
      this.game.deleteObserver(this); 

     this.game = game; 
     this.game.addObserver(this); 
    } 

    public void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     if (game == null) 
      return; 

     drawBoard(canvas); 
     drawPieces(canvas); 
    } 

    public void drawBoard(Canvas canvas) { 
     int tilesize = Math.min(getWidth(), getHeight())/8; 

     for (int i = 0; i < 8; i++) 
      for (int j = 0; j < 8; j++) { 
       Paint paint = ((i + j) % 2 == 0) ? WHITE_PAINT : BLACK_PAINT; 

       canvas.drawRect(i*tilesize, j*tilesize,(i+1)*tilesize, (j+1)*tilesize, paint); 
      } 
    } 

    public void drawPieces(Canvas canvas) { 
     for (int i = 0; i < game.getBoard().boardSize(); i++) 
      for (int j = 0; j < game.getBoard().boardSize(); j++) { 
       Position pos = new Position(i, j); 
       Piece p = game.getBoard().getPiece(pos); 

       if (p != null) 
        drawPiece(canvas, p, pos); 
       else 
        clearPos(canvas, pos); 
      } 
    } 

    public void drawPiece(Canvas canvas, Piece piece, Position position) { 
     switch (game.getBoard().getPiece(position).getId()) { 
      case ("wpawn"): drawPicture(canvas, position, R.drawable.wpawn); break; 
      case ("bpawn"): drawPicture(canvas, position, R.drawable.bpawn); break; 
      case ("wrook"): drawPicture(canvas, position, R.drawable.wrook); break; 
      case ("brook"): drawPicture(canvas, position, R.drawable.brook); break; 
      case ("wknight"): drawPicture(canvas, position, R.drawable.wknight); break; 
      case ("bknight"): drawPicture(canvas, position, R.drawable.bknight); break; 
      case ("wbishop"): drawPicture(canvas, position, R.drawable.wbishop); break; 
      case ("bbishop"): drawPicture(canvas, position, R.drawable.bbishop); break; 
      case ("wqueen"): drawPicture(canvas, position, R.drawable.wqueen); break; 
      case ("bqueen"): drawPicture(canvas, position, R.drawable.bqueen); break; 
      case ("wking"): drawPicture(canvas, position, R.drawable.wking); break; 
      case ("bking"): drawPicture(canvas, position, R.drawable.bking); break; 
      default: break; 
     } 
    } 

    public void drawPicture(Canvas canvas, Position position, int picture) { 
     int tilesize = Math.min(getHeight(), getWidth())/8, x = position.getY(), y = position.getX(); 
     Drawable d = ResourcesCompat.getDrawable(getResources(), picture, null); 
     Bitmap b = ((BitmapDrawable) d).getBitmap(); 

     canvas.drawBitmap(b, null, new Rect(x*tilesize, y*tilesize,(x + 1)*tilesize, (y + 1)*tilesize), null); 
    } 

    public void clearPos(Canvas canvas, Position position) { 
     int tilesize = Math.min(getWidth(), getHeight())/8, x = position.getY(), y = position.getX(); 

     Paint paint = ((position.getX() + position.getY()) % 2 == 0) ? WHITE_PAINT : BLACK_PAINT; 

     canvas.drawRect(x*tilesize, y*tilesize, (x + 1)*tilesize, (y + 1)*tilesize, paint); 
    } 

    @Override 
    public void update(Observable observable, Object data) { 
     this.postInvalidate(); 
    } 
} 

public class Controller extends Observable implements View.OnDragListener { 
    private Game game; 

     public Controller(Game game) { 
      this.game = game; 
     } 

     @Override 
     public boolean onDrag(View v, DragEvent event) { 

      float startx = event.getX(); 
      float starty = event.getY(); 

      if (event.getAction() == DragEvent.ACTION_DRAG_ENDED) { 

      } 

      return false; 
     } 
    } 
+0

Se si sta sviluppando giochi allora provare a utilizzare motori di gioco come AndEngine, ecc libGdx – darwin

risposta

1

Speriamo che qualcosa di simile darebbe l'idea:

@Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
      ...    
      view.startDrag(clipData, dsb, view, 0); 
      ... 
      return true; 
     } else { 
      return false; 
     } 
    } 

@Override 
    public boolean onDrag(View view, DragEvent dragEvent) { 
     int dragAction = dragEvent.getAction(); 
     View dragView = (View) dragEvent.getLocalState(); 
     if (dragAction == DragEvent.ACTION_DRAG_EXITED) { 
      containsDragable = false; 
     } else if (dragAction == DragEvent.ACTION_DRAG_ENTERED) { 
      containsDragable = true; 
     } else if (dragAction == DragEvent.ACTION_DROP && containsDragable){ 
      //your function to move and check valid moves 
      dragView.setVisibility(View.VISIBLE); 
     } 
     return true; 
    } 

Rif: https://www.javacodegeeks.com/2011/12/android-drag-and-drop-tutorial.html

Problemi correlati