2013-11-07 2 views
1

Я пытаюсь реализовать функциональность обнаружения столкновения между двумя спрайтами, но только в определенном месте на этих спрайтах. Например, если у меня есть крючок и рыба, и цель игры состоит в том, чтобы поймать рыбу на крючке, тогда только столкновение между точкой крюка и рта или передней частью (например, 10%) рыба должна иметь значение, но не любое другое столкновение. Есть ли простой, встроенный способ проверить это? Если нет, какие-либо указания о том, как это сделать?Как обнаружить столкновения между SKSpriteNodes в определенных местах на узлах спрайтов?

У меня есть следующий стандартный код, который получает точку столкновения на фрейме, к которому я добавляю CGPoint p = contact.contactPoint;

Куда я иду оттуда?

- (void)didBeginContact:(SKPhysicsContact *)contact 
{ 
    SKPhysicsBody *firstBody, *secondBody; 

    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) 
    { 
     firstBody = contact.bodyA; 
     secondBody = contact.bodyB; 
    } 
    else 
    { 
     firstBody = contact.bodyB; 
     secondBody = contact.bodyA; 
    } 

    if ((firstBody.categoryBitMask & hookCategory) != 0 && 
     (secondBody.categoryBitMask & fishCategory) != 0) 
    { 
     CGPoint p = contact.contactPoint; 

     [self caught:(SKSpriteNode *) firstBody.node didCatchFish: (Fish *) secondBody.node]; 
    } 
} 

ответ

3

contactPoint представляет собой точку в координатах сцены. Вы хотите, чтобы преобразовать его в узел (Fish) Координаты:

Fish *fishNode = (Fish *) secondBody.node; 
CGPoint p = [fishNode convertPoint:contact.contactPoint fromNode:self.scene]; 

После этого вы можете проверить положение точки, если она принадлежит ко рту рыбы или что-то:

if (p.x < 10.0) { 
    [self caught:(SKSpriteNode *) firstBody.node didCatchFish: fishNode]; 
} 

Я не проверял код, но я надеюсь, что у вас есть идея.

+0

Спасибо, Андрей, это очень полезно. У вас возникнут какие-либо указания для меня, где искать рекомендации по общему обнаружению столкновений? По какой-то причине я замечаю, что приложение не обнаружит столкновения, пока один спрайт не окажется в центре второго спрайта, в отличие от самой первой координаты x, в которую они пересекаются; Я выгляжу высоко и низко, но, похоже, не может найти объяснения, почему это происходит. – marina

+0

Я знаю только официальную документацию Apple: https://developer.apple.com/LIBRARY/IOS/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Physics/Physics.html#//apple_ref/doc/uid/TP40013043-CH6-SW14 –

1

Вы используете физический движок? Вы можете добавить дополнительный узел (видимый или нет) рыбы. Установите соответствующие маски:

mouth.physicsBody.categoryBitMask = MouthMask; 
mouth.physicsBody.contactTestBitMask = HookMask; 

ИН метода SKPhysicsWorld делегата didBeginContact: вы можете проверить для соответствующих условий для «крючок во рту».

- (void)didBeginContact:(SKPhysicsContact *)contact { 
    NSLog(@"%s\n %@\n %@", __PRETTY_FUNCTION__, [contact bodyA], [contact bodyB]); 
} 
Смежные вопросы