2015-03-13 12 views
5

Sto cercando di creare un gioco di puzzle e mi piacerebbe sapere dei modi alternativi di creare pezzi di puzzle senza usare la maschera. Attualmente ho pezzi di puzzle prendendo un'immagine intera, suddividendo l'immagine in quattro parti (diciamo che il puzzle è 2x2) e quindi memorizzando e applicando una maschera a ogni pezzo. Sembra che il seguitoCome creare pezzi di un puzzle senza usare la maschera?

// create standard puzzle pieces 
    arryPieceEndPos = new int[mCols][mRows]; 
    arryPieceImg = new Bitmap[mCols * mRows]; 
    arryIsPieceLocked = new boolean[mCols * mRows]; 

    int pos = 0; 
    for (int c = 0; c < mCols; c++) { 
     for (int r = 0; r < mRows; r++) { 
      arryPieceImg[pos] = Bitmap.createBitmap(mBitmap, 
      c * mPieceWidth, r * mPieceHeight, 
      mPieceWidth, mPieceHeight); 

      arryIsPieceLocked[pos] = false; 
      arryPieceEndPos[c][r] = pos; 
      pos++; 
     } 
    } 

Ho quindi utilizzare un metodo di supporto per applicare una maschera per ogni pezzo

private Bitmap maskMethod(Bitmap bmpOriginal, Bitmap bmpMask) { 

    // adjust mask bitmap if size is not the size of the puzzle piece 
    if (bmpMask.getHeight() != mPieceHeight || 
     bmpMask.getWidth() != mPieceWidth) { 
     Log.e("TEST", "Resize Error :: H (mask): " + bmpMask.getHeight() + " // W (mask): " + 
      bmpMask.getWidth()); 
     Log.d("TEST", "Resize Error :: H (norm): " + mPieceHeight + " // W (norm): " + 
      mPieceWidth); 

    } 

    Canvas canvas = new Canvas(); 
    Bitmap combine = Bitmap.createBitmap(bmpOriginal.getWidth(), bmpOriginal.getHeight(), Bitmap.Config.ARGB_8888); 
    canvas.setBitmap(combine); 
    Paint paint = new Paint(); 
    paint.setFilterBitmap(false); 

    canvas.drawBitmap(bmpOriginal, 0, 0, paint); 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 
    canvas.drawBitmap(bmpMask, 0, 0, paint); 
    paint.setXfermode(null); 

    return combine; 
} 

ho visto questo post>http://java.dzone.com/news/connect-pictures-android per il collegamento di pezzi insieme, tuttavia, questo non va oltre generare pezzi programmaticamente senza maschere. Qualcuno può fornire esempi di codice su come questo può essere realizzato? L'unico indizio che ho è che dovrei usare Path, tuttavia, non sono ancora sicuro di come. Grazie in anticipo!

risposta

4

Un pezzo di puzzle è una vista piuttosto complessa da creare, ma posso aiutarti a capire come utilizzare il percorso. Ecco il link al sito web dello sviluppatore: http://developer.android.com/reference/android/graphics/Path.html

Cerca in questo link. Ho fatto una piccola cosa per iniziare. L'unica cosa che devi capire è come tagliare un piccolo cerchio fuori dal percorso, che non saprei. Penso che devi guardare nel ritaglio per fare in modo che il tuo percorso segua un cerchio (potresti anche fare il clipping per creare il cerchio al di fuori del pezzo, non ho ancora fatto il clipping prima).

private Bitmap getPuzzleBitmap(Bitmap bitmap) 
{ 
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(output); 

    final int color = 0xff424242; 
    final Paint paint = new Paint(); 
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 

    calculatePuzzlePath(bitmap.getWidth(), bitmap.getHeight()); 

    paint.setAntiAlias(true); 
    canvas.drawARGB(0, 0, 0, 0); 
    paint.setColor(color); 
    canvas.drawPath(puzzlePath, paint); 

    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
    canvas.drawBitmap(bitmap, rect, rect, paint); 

    return output; 
} 

private void calculatePuzzlePath(int width, int height) 
{ 
    float radius = (height/2) - 5; 
    float smallRadius = radius/3; 
    radius -= smallRadius * 2; 
    float centerX = width/2; 
    float centerY = height/2; 
    puzzlePath = new Path(); 
    // Bottom right 
    puzzlePath.moveTo(centerX + radius, centerY + radius); 
    // Top right 
    puzzlePath.lineTo(centerX + radius, centerY - radius); 
    // Center top 
    puzzlePath.lineTo(centerX, centerY - radius); 
    // Add outside circle to center top 
    puzzlePath.addCircle(centerX, centerY - radius - ((radius/3)/2), radius/3, Path.Direction.CCW); 

    // Top left 
    puzzlePath.lineTo(centerX - radius, centerY - radius); 
    // Bottom left 
    puzzlePath.lineTo(centerX - radius, centerY + radius); 
    //Bottom right 
    puzzlePath.lineTo(centerX + radius, centerY + radius); 
} 

Spero che questo sia sufficiente per iniziare con questo.

Buona fortuna!

+0

Grazie per la risposta. Wow, ottenere un'intera forma del puzzle e farlo sembrare buono è estremamente complesso. Il problema che ho ora è creare i pezzi da un'immagine intera, non solo una sezione dell'immagine perché ho bisogno di essere in grado di spostare questi pezzi e così via. In generale, per Android, sta usando la maschera la scelta migliore? – portfoliobuilder

+0

È possibile utilizzare questo http://stackoverflow.com/a/8180576/2767703 per ottenere una parte della bitmap. Non sono sicuro di cosa sia meglio, ma usare le cuciture maschera è molto più facile però. Se hai un sacco di problemi nell'usare il percorso e così via, potrebbe non valerne la pena, se funziona bene con la maschera –

Problemi correlati