2010-04-09 8 views
1

J'ai une image rectangulaire longue qui est pivotée à différents angles. Cependant, le cadre de l'image rectangulaire ne tourne pas avec l'image et à la place, la rotation fait que le cadre devient plus grand pour s'adapter à l'image pivotée. Donc, quand j'ai utilisé CGRectIntersectsRect, la détection de collision est totalement désactivée car l'autre image entrant en collision avec l'image rectangulaire va entrer en collision avant même d'avoir atteint la zone visible de l'image rect. Si vous ne savez pas vraiment ce que je parle, un regard sur le dessin ascii:Utilisation de CGRectIntersectsRect pour la détection de collision

cadre d'image rectangulaire normale, O -> pixels, |, - -> Cadre

|----------| 
|OOOOOOOOOO| 
|----------| 

après rotation

|----------| 
|O   | 
| O  | 
| O  | 
| O  | 
| O  | 
|  O | 
|  O | 
|  O | 
|  O | 
|----------| 

J'ai lu quelques-uns des articles de collision, mais chacun d'entre eux parlent de collision avec un rectangle droit normal et ce que je veux vraiment est une collision avec une image inclinée, de préférence la détection de collision de pixels. TIA pour toute suggestion faite.

+0

Ceci serait appelé collision OBB (bounded boxing box) - http://www.google.co.uk/search?q=obb+collision –

Répondre

1

Si vous êtes sur le mac, vous pouvez utiliser -[NSImage hitTestRect:withImageDestinationRect:context:hints:flipped:] pour décider si un rectangle particulier croise des pixels non transparents dans votre image. Voir le commentaire d'en-tête pour l'utilisation.

+0

Je l'ai trouvé dans la documentation mais je n'arrive pas à l'utiliser . ma phrase automatique complète s'arrête à hitTest et il n'y a pas hitTestRect. googled aussi, mais ne renvoie aucune information utile à ce sujet – Treon

+0

Regardez dans les en-têtes. NSImage.h. – Ken

0

Vous ne pouvez pas utiliser la propriété frame de UIView faire des collisions sur les objets mis en rotation, comme frame n'est plus valide dès que vous commencez à transformer la vue. Vous devez trouver une solution personnalisée. Qu'est-ce que cela va exactement dépend de beaucoup de choses, en particulier la performance.

Vous pouvez créer une enveloppe de collision géométrique pour l'image, un polygone que vous pouvez faire pivoter avec l'image. Vous pouvez également utiliser la détection de collision parfaite pour les pixels combinée à des vérifications simples des limites pour éviter la vérification coûteuse des pixels lorsque cela est possible. Et, si vous voulez vraiment avoir envie, vous pouvez recourir à un simulateur de physique complet tel que Box2D.

Si vous voulez de meilleurs conseils, donnez-nous plus de détails. À quelle fréquence devez-vous vérifier les collisions? Une fois que? 40 fois par seconde?

+0

Je n'ai vraiment plus de détails que je peux vous donner maintenant. mon but principal ici est de détecter la collision entre un CGrect et une image rectangulaire pivotée. Puisque CGRectIntersectRect ne fonctionnerait pas dans ce cas, je vais devoir regarder vos suggestions – Treon

Questions connexes