2016-04-27 3 views
7

Ich habe gerade angefangen android apps mit der Entwicklung (mit Java, in Android-Studio, wenn es ankommt), und ich bin ein kleines Projekt zu tun, nur so zum Spaß. Ich möchte meine eigene Schach-App erstellen und bisher habe ich einiges getan. Ich habe ein Menü eingerichtet, um zu einer anderen Aktivität zu wechseln, nämlich dem Spiel selbst. Ich habe eine benutzerdefinierte Ansicht mit einem selbstgemalten Spielbrett erstellt und ich denke, dass mein Modell auch fast fertig ist. Das einzige, was ich nicht verstehe, ist, wie man mit einem Widerstand umgehen soll. Wenn Sie also ein Stück mit einer schleppenden Geste von einer Position zur anderen bewegen, wie erhalten Sie die Anfangs- und Endpunkte?Wie man Drag in einer Android-Schach-App umgehen?

Wie gesagt, ich habe bereits eine Bewegung in meinem Modell implementiert (mit einer Funktion move (Position start, Position end)), und es überprüft auch, ob diese Bewegung für ein bestimmtes Stück gültig ist, aber das einzige, was ich noch brauche ist etwas, mit dem ich ein Stück auf das eigentliche Brett ziehen kann.

Ich dachte über eine onDrag Methode in meiner Controller-Klasse setzen, aber ich weiß nicht, wie das zu erarbeiten, und nicht gute Beispiele im Internet finden kann. Ich habe damit schon angefangen, weiß aber nicht, ob es jemals funktionieren könnte.

Könnten Sie mir bitte den Widerstand der Umsetzung helfen?

Vielen Dank im Voraus!

P.S. Ich werde auch den Code für die benutzerdefinierte Ansicht und die (noch nicht vollständig) Controller in meiner Frage hinzufügen, ob das hilft. Wenn Sie mehr von meinem Code benötigen, um diese Frage zu beantworten, werde ich es auch hier veröffentlichen, lassen Sie es mich wissen.

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

Wenn Sie Game-Engines wie AndEngine entwickeln versuchen Spiele dann verwenden, Libgdx etc – darwin

Antwort

1

Hoffentlich so etwas wie dies würden Sie die Idee geben:

@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

Verwandte Themen