SpriteKit Прыжки при столкновении

У меня есть 2 объекта, Человек и Блок. Если Человек на Блоке, он может прыгать, если он в воздухе, то нет. Как я могу это закодировать, потому что CGRectIntersectsRect не работает в SpriteKit для меня.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent )event { / Вызывается, когда начинается касание */

Human.physicsBody.velocity = CGVectorMake(0, 0);

[Human.physicsBody applyImpulse:CGVectorMake(0, 40)];

}

Я получил блок и человека уже в категориях для обнаружения столкновений:

else if ((firstBody.categoryBitMask & HumanCategory) != 0 &&
         (secondBody.categoryBitMask & BlockCategory) != 0)
{

}

Должен ли я использовать это как-то для кода? Спасибо за помощь.


person Community    schedule 13.04.2014    source источник


Ответы (3)


Чтобы предотвратить прыжки, не касаясь земли, используйте bodyAtPoint: чтобы определить, есть ли какое-либо физическое тело непосредственно под вашим узлом.

Если возможно, что под вашим персонажем будет несколько физических тел, которые могут не иметь значения, вы можете использовать enumerateBodiesAtPoint:usingBlock:, чтобы разрешить прыжки только в том случае, если узел, связанный с физическими телами, является Блокировать.

Обновление:

Эти методы доступны в классе SKPhysicsWorld, вы можете получить доступ к экземпляру через свойство physicsWorld в вашей сцене.

//Please note that this point is in the scenes coordinate system
CGPoint thePointDirectlyBelowMyNode = ...;
[scene.physicWorld bodyAtPoint:thePointDirectlyBelowMyNode];
person nacross    schedule 13.04.2014
comment
bodyInRect: или bodyAlongRayStart:end: также может быть хорошим кандидатом, если вам нужен больший контроль. - person nacross; 13.04.2014
comment
Извини, приятель, у меня нет времени делать работу за тебя. Возможно, вам повезет, и ответит кто-нибудь другой. - person nacross; 13.04.2014
comment
Есть ли какая-то особая часть использования этого подхода, которую вы не понимаете? Может быть, я все еще могу указать вам в правильном направлении. - person nacross; 13.04.2014
comment
Если я использую bodyAtPoint: он говорит, что нет видимого @interface для SKSpriteNode, объявляет селектор bodyAtPoint. - person ; 13.04.2014

В моей игре я использую intersectsNode, чтобы определить, пересекаются ли два узла:

if ( [node1 intersectsNode:node2] )

Надеюсь это поможет

person Mihai Popa    schedule 13.04.2014
comment
Я использовал это сейчас, и теперь Человек вообще не прыгает, так что проблема та же, что и раньше. - person ; 13.04.2014

На самом деле метод - (SKNode *)nodeAtPoint:(CGPoint)p;
Так что используйте [self nodeAtPoint: pointBelowHuman];

person heisenberg    schedule 13.04.2014
comment
Хотя этот метод может работать в некоторых сценариях, вероятно, лучше использовать физические тела. Границы узла могут выходить за его коллизируемое физическое тело, а это означает, что вы все еще можете прыгать, даже если он не находится на твердой поверхности. - person nacross; 14.04.2014
comment
@nacross Правильно. Не думал об этом. Спасибо - person heisenberg; 14.04.2014