Jak w Cocos2D sprawdzać kolizje z dowolnym kształtem narysowanym przez użytkownika?

10

Chcę wykryć kolizję między duchem a jakimś kształtem wygenerowanym przez użytkownika.

Na przykład. Na ekranie znajdują się 3 obiekty. Użytkownik bierze palec i rysuje nienormalny kształt wokół 2 obiektów. Muszę wykryć te 2 obiekty.

kształt użytkownika w kolorze fioletowym, obiekty gry w kolorze zielonym i czerwonym

Jak podejść do tego skutecznie za pomocą Cocos2D?

David McGraw
źródło

Odpowiedzi:

10

Istnieje bardzo łatwe rozwiązanie dla tego konkretnego przykładu.

Zakładam, że twój dowolny kształt jest tylko serią punktów.

Narysuj promień z każdego ze swoich obiektów w dowolnym kierunku. Jeśli liczba przecięć segmentu linii na twoim kształcie jest parzysta (w tym zero), jesteś poza kształtem.

Jeśli liczba skrzyżowań jest nieparzysta, jesteś wewnątrz obiektu.

Kolizja segmentu promień / linia jest dość łatwym algorytmem do znalezienia / wdrożenia.

Tetrad
źródło
3

Jasne, musiałem to rozgryźć w mojej grze Star Catch. Mogą istnieć lepsze sposoby na zrobienie tego, ale tak to zrobiłem. Właściwie znalazłem algorytm online (przepraszam, nie pamiętam źródła). Poszukiwałem punktu w wielokącie.

Utworzyłem NSMutableArray, aby utrzymać mój punkt widzenia. Dodam punkty w moich turniejach.

- (BOOL) testNodeInLoop:(CCNode *)node {

    CGPoint prev;

    // This is more accurate point for the node
    CGPoint absPoint = [node convertToWorldSpace:CGPointZero];

    float x = absPoint.x;
    float y = absPoint.y;

    BOOL isIn = NO;

    CGPoint cp;

    for(int i = 0, j = [points count] - 1; i < [points count]; j = i++) {
        [[points objectAtIndex:i] getValue:&cp];
        [[points objectAtIndex:j] getValue:&prev];

        if( ((cp.y > y) != (prev.y > y)) && (x < (prev.x -cp.x) * (y - cp.y) / (prev.y - cp.y) + cp.x)) {
            isIn = !isIn;
        }
    }
    return isIn;
}

Daj mi znać, jeśli to jest pomocne.

Ton
źródło
2

Książka „Wykrywanie kolizji w czasie rzeczywistym” zawiera rozdział dotyczący wykrywania kolizji linii / segmentu. Przykład za pośrednictwem Google Books: http://ow.ly/2gjQf

AlfredBaudisch
źródło
0

W przypadku kontroli kolizji w pikselach na stronie dla programistów XNA znajduje się ciekawa seria samouczków.
http://creators.xna.com/en-US/tutorial/collision2dperpixeltransformed

Jedną z optymalizacji, której nie użyto w tych samouczkach (co dziwne) jest to, że w większości przypadków należy sprawdzić tylko zarys, oszczędzając cenne cykle .

Zmodyfikowano, aby dodać: kiepska odpowiedź, błędne odczytanie pytania. Samouczki są jednak całkiem przyzwoite, jeśli chcesz przeczytać na temat pojedynczego piksela.

Kaj
źródło