pixel perfect collision

0

Cześć, jakiś czas temu ktoś polecił mi ten sposób wykrywania kolizji między dwoma zdjęciami. Problem jest w tym że to nie jest takie proste, a wszystkie fora poświęcone tej metodzie są po angielsku. Więc jeśli ktoś już kiedyś miał z czymś takim do czynienia i mógłby w miarę sensownie wytłumaczyć to byłbym wdzięczny.

0

Wady: wolne działanie, mało optymalne
Zalety: łatwe do wykonania

  1. Sprawdź wszystkie pozycje pikseli otaczających zdjęcie.
  2. Sprawdź pozycje wszystkich pikseli drugiego zdjęcia. (lub) Sprawdź pozycje wszystkich pikseli otaczających drugie zdjęcie. Też powinno działać. Mam rację?
  3. Porównaj czy któreś pozycje są takie same - jeśli tak stykają się w przeciwnym się nie stykają.
0

@Trebuh Teoretycznie jest to zrozumiałe gorzej z wykonaniem. Popracuje trochę nad tym. Jak już mówiłem każde forum jest w innym języku

0

@Trebuh Próbuje rozgryźć przykładowy algorytm, mógłbyś rzucić okiem? Mogę go tu wrzucić

public class CollisionUtil {
public static boolean isCollisionDetected(Sprite sprite1, Sprite sprite2){
    Rect bounds1 = sprite1.getBounds();
    Rect bounds2 = sprite2.getBounds();

    if( Rect.intersects(bounds1, bounds2) ){
        Rect collisionBounds = getCollisionBounds(bounds1, bounds2);
        for (int i = collisionBounds.left; i < collisionBounds.right; i++) {
            for (int j = collisionBounds.top; j < collisionBounds.bottom; j++) {
                int sprite1Pixel = getBitmapPixel(sprite1, i, j);
                int sprite2Pixel = getBitmapPixel(sprite2, i, j); 
                if( isFilled(sprite1Pixel) && isFilled(sprite2Pixel)) {
                    return true;
                }
            }
        }
    }
    return false;
}

private static int getBitmapPixel(Sprite sprite, int i, int j) {
    return sprite.getBitmap().getPixel(i-(int)sprite.getX(), j-(int)sprite.getY());
}

private static Rect getCollisionBounds(Rect rect1, Rect rect2) {
    int left = (int) Math.max(rect1.left, rect2.left);
    int top = (int) Math.max(rect1.top, rect2.top);
    int right = (int) Math.min(rect1.right, rect2.right);
    int bottom = (int) Math.min(rect1.bottom, rect2.bottom);
    return new Rect(left, top, right, bottom);
}

private static boolean isFilled(int pixel) {
    return pixel != Color.TRANSPARENT;
}
} 

1 użytkowników online, w tym zalogowanych: 0, gości: 1