2015-03-13 14 views
5

Próbuję stworzyć grę układanki i chciałbym poznać alternatywne sposoby tworzenia puzzli bez użycia maski. Obecnie mam kawałki układanki, robiąc pełny obraz, rozbijając ten obraz na cztery części (powiedzmy puzzle to 2x2), a następnie przechowując i nakładając maskę na każdy element. To wygląda jak poniżejJak tworzyć kawałki układanki bez użycia maski?

// 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++; 
     } 
    } 

I wtedy użyć metody pomocnika stosować maski do każdego kawałka

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

widziałem ten post>http://java.dzone.com/news/connect-pictures-android do łączenia części razem jednak to nie wykracza ponad generowanie utworów programowo bez masek. Czy ktoś może podać przykłady kodu, jak można to osiągnąć? Mam tylko jedną wskazówkę, że powinienem używać Path, jednak nadal nie jestem pewien jak. Z góry dziękuję!

Odpowiedz

4

Kawałek układanki to dość złożony widok do stworzenia, ale mogę pomóc ci zrozumieć, jak używać ścieżki. Oto link do witryny programisty: http://developer.android.com/reference/android/graphics/Path.html

Zobacz ten link. Zrobiłem dla ciebie małą rzecz, aby zacząć. Jedną rzeczą, którą musisz wymyślić, jest wycięcie małego kręgu ze ścieżki, którego nie wiedziałbym. Myślę, że musisz spojrzeć na obcinanie, aby Twoja ścieżka podążała za okręgiem (możesz również zrobić obcinanie, aby utworzyć krąg poza elementem, po prostu wcześniej nie zrobiłem obcinania).

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

Mam nadzieję, że wystarczy, aby zacząć z tym.

Powodzenia!

+0

Dziękuję za odpowiedź. Wow, uzyskanie całego kształtu puzzli i dobrego wyglądu jest niezwykle skomplikowane. Problem, który mam teraz, polega na tworzeniu elementów z całego obrazu, a nie tylko z części obrazu, ponieważ muszę mieć możliwość poruszania tymi elementami i takimi. Ogólnie rzecz biorąc, dla Androida używanie maski jest lepszym wyborem? – portfoliobuilder

+0

Możesz użyć tego http://stackoverflow.com/a/8180576/2767703, aby uzyskać część mapy bitowej. Nie jestem pewien, co jest lepsze, ale używanie szwów na maskach jest dużo łatwiejsze. Jeśli masz dużo problemów z używaniem ścieżki i takich, to może nie być warta kłopotów, jeśli działa dobrze z maską –

Powiązane problemy