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;
}
}
Se si sta sviluppando giochi allora provare a utilizzare motori di gioco come AndEngine, ecc libGdx – darwin