2016-04-27 14 views
7

Tôi mới bắt đầu với việc phát triển các ứng dụng android (với java, trong studio android, nếu có vấn đề), và tôi đang thực hiện một dự án nhỏ, chỉ để cho vui. Tôi muốn tạo ra ứng dụng cờ vua của riêng mình, và cho đến nay tôi đã làm khá nhiều thứ. Tôi thiết lập một menu để chuyển sang một hoạt động khác là bản thân trò chơi, tôi đã thực hiện một customview với một bảng tự vẽ, và tôi nghĩ rằng mô hình của tôi cũng gần như hoàn tất. Điều duy nhất tôi không hiểu là làm thế nào để xử lý một kéo. Vì vậy, khi bạn di chuyển một mảnh từ vị trí này sang vị trí khác bằng cử chỉ kéo, làm thế nào để bạn có được điểm bắt đầu và điểm cuối của nó?Làm thế nào để xử lý kéo trong một ứng dụng cờ vua android?

Như đã nói, tôi đã thực hiện di chuyển trong mô hình của mình (với chức năng di chuyển (Bắt đầu vị trí, Vị trí kết thúc)) và nó cũng kiểm tra xem di chuyển đó có hợp lệ cho một đoạn nhất định hay không là cái gì đó cho phép tôi kéo một mảnh trên bảng thực tế.

Tôi đã suy nghĩ về việc đưa một phương thức onDrag vào lớp Controller của mình, nhưng tôi không biết cách làm việc đó ra sao, và không thể tìm thấy các ví dụ hay trên internet. Tôi đã bắt đầu với điều đó, nhưng không biết nếu nó có thể làm việc.

Bạn có thể vui lòng giúp tôi triển khai thao tác kéo không?

Cảm ơn trước!

P.S. Tôi cũng sẽ thêm mã cho chế độ xem tùy chỉnh và bộ điều khiển (chưa hoàn thành) trong câu hỏi của tôi, nếu điều đó có ích. Nếu bạn cần thêm mã của tôi để trả lời câu hỏi này, tôi cũng sẽ đặt nó ở đây, chỉ cần cho tôi biết.

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

Nếu bạn đang phát triển trò chơi sau đó thử sử dụng công cụ trò chơi như AndEngine, libGdx vv – darwin

Trả lời

1

Hy vọng rằng một cái gì đó như thế này sẽ cung cấp cho bạn những ý tưởng:

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

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

Các vấn đề liên quan