Dans Cocos2D, comment puis-je vérifier les collisions avec une forme arbitraire dessinée par l'utilisateur?

10

Je veux détecter une collision entre un sprite et une forme générée par l'utilisateur.

Par exemple. Il y a 3 objets sur l'écran. L'utilisateur prend son doigt et dessine une forme anormale autour de 2 des objets. J'ai besoin de détecter ces 2 objets.

forme utilisateur en violet, objets de jeu en vert et rouge

Comment puis-je aborder cela efficacement en utilisant Cocos2D?

David McGraw
la source

Réponses:

10

Il existe une solution très simple pour cet exemple particulier.

Je suppose que votre forme arbitraire n'est qu'une série de points.

Dessinez un rayon à partir de chacun de vos objets dans n'importe quelle direction. Si le nombre de fois qu'il coupe un segment de ligne sur votre forme est pair (y compris zéro), vous êtes en dehors de la forme.

Si le nombre de fois que vous vous croisez est impair, vous êtes à l'intérieur de l'objet.

La collision de segment de rayon / ligne est un algorithme assez facile à trouver / implémenter.

Tetrad
la source
3

Bien sûr, je devais comprendre cela pour mon jeu Star Catch. Il y a peut-être de meilleures façons de le faire, mais c'est comme ça que je l'ai fait. J'ai trouvé l'algorithme en ligne (désolé, je ne me souviens pas de la source). J'ai fait une recherche pour détecter un point à l'intérieur d'un polygone.

J'ai créé un NSMutableArray pour maintenir mon point. J'ajoute les points dans mes évents tactiles.

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

Faites-moi savoir si cela est utile.

Ton
la source
2

Le livre "Détection de collision en temps réel" contient une section sur la détection de collision ligne / segment. Exemple via Google Livres: http://ow.ly/2gjQf

AlfredBaudisch
la source
0

Pour les vérifications de collision par pixel, il existe une belle série de didacticiels sur le site des développeurs XNA.
http://creators.xna.com/en-US/tutorial/collision2dperpixeltransformed

Une optimisation que vous pouvez utiliser qui n'a pas été utilisée dans ces didacticiels (curieusement) est que dans la plupart des cas, seul le contour doit être vérifié, ce qui permet d'économiser de précieux cycles .

Modifié pour ajouter: réponse pourrie, mauvaise lecture de la question. Les tutoriels sont encore assez décents si vous voulez lire sur le coldet par pixel.

Kaj
la source