2009-08-06 7 views
2

Est-il possible de faire une collision parfaite pixel dans une application basée sur la vue? J'ai cherché des codes d'exemples mais sans aucune chance ... Vous pouvez également utiliser des bitmaps colorés pour représenter une collision pour une certaine couleur?Pixel collision parfaite?

Répondre

2

Vous pouvez. Il semble que c'est plus facile si vous utilisez un CGImage cependant.

Vous pouvez créer un tableau booléen 2D pour lire les valeurs de pixels afin de construire une grille de correspondance (en gros une matrice 2x2), puis la stocker avec votre classe d'objets de jeu.

Vous auriez besoin d'un accès direct aux données de pixels pour la CGImage (the code is here) puis utiliser une boucle, la lecture des données de pixels dans le tableau des valeurs booléennes:

BOOL pixelGrid[xPixels][yPixels]; 
for (int i = 0; i < xPixels; i++) { 
    for (int j = 0; j < yPixels; j++) { 
     pixelGrid[i][j] = pixelIsOpaque(i, j); 
    } 
} 

La méthode pixelIsOpaque() ci-dessus, évidemment n » t existe, remplacez simplement par ce que l'exemple de code vous donne pour extraire la valeur du pixel. Vous stockez si un pixel existe (vérifiez en fait si le pixel est l'opacité> 0)

Une fois que vous avez cette grille (générez-la au début de votre programme une fois et stockez le tableau 2D résultant dans l'objet de jeu) alors vous besoin d'une méthode de détection de collision.

BOOL detectCollision(BOOL *pixelGrid1, BOOL *pixelGrid2) { 
BOOL result = NO; 
    for (int i = 0; i < xPixels; i++) { 
     for (int j = 0; j < yPixels; j++) { 
      if (pixelGrid1[i][j].opacity != 0 && pixelGrid2[i][j].opacity != 0]) { 
       result = YES; break; 
      } 

    } 
} 
return result; 
} 

Je viens d'écrire ce code à la volée, donc je ne peux pas être à 100% compilable mais je l'espère vous donne l'idée. Vous pouvez facilement modifier cela, mais au lieu de comparer l'opacité, comparez simplement par rapport à la valeur de couleur de pixel, see here pour obtenir les données de couleur brutes.

+0

+1 pour une excellente information. Je me suis vraiment intéressé aux collisions parfaites en pixels. Je vais essayer de voir si ça marche ce week-end. Je suis juste préoccupé par la performance, mais c'est un tout autre problème qui peut être abordé plus tard. – Tovi7