Обнаружение столкновений в комплекте спрайтов

Я пытаюсь создать простую игру с комплектом спрайтов. Основная идея состоит в том, что есть один игрок, который может прыгать, чтобы избежать блоков. Но у меня есть проблема, я не знаю, как это сделать, когда игрок попадает в блок, игрок исчезает и начинается анимация крови. Прежде всего, я не понимаю, что делает этот код, который я нашел на веб-сайте яблок.

static const uint32_t blockCategory = 0x1 <<0; static const uint32_t playerCategory = 0x1 <<1; 

Затем я вызываю функцию didBeginContact и помещаю в нее NSLOG («call call»). Но я никогда не получаю вывод в своем отладчике.

Вот мой _player и _block код: – (SKSpriteNode *) символ {

 _player = [SKSpriteNode spriteNodeWithImageNamed:@"soldier_run1"]; _player.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:_player.size.width /2 -5]; _player.physicsBody.dynamic = YES; _player.physicsBody.usesPreciseCollisionDetection = YES; _player.physicsBody.friction = 0; _player.physicsBody.categoryBitMask = playerCategory; _player.physicsBody.collisionBitMask = blokCategory; _player.name = @"player"; SKAction *animAction = [SKAction animateWithTextures:playerTextures timePerFrame:0.1 resize:YES restore:YES]; 

Мой код _player:

 [_player runAction:[SKAction repeatActionForever:animAction]]; return _player; } -(SKSpriteNode *)block { _blok = [[SKSpriteNode alloc] initWithColor:[SKColor blackColor] size:CGSizeMake(15, 40)]; //physics _blok.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_blok.size]; _blok.physicsBody.dynamic = NO; _blok.name = @"block"; _blok.physicsBody.categoryBitMask = blokCategory; _blok.physicsBody.collisionBitMask = playerCategory; SKAction *moveBlock = [SKAction sequence:@[ [SKAction moveToX:-20 duration:2] ]]; [_blok runAction:moveBlock ]; return _blok; } 

Также я не понимаю, что делают categoryBitMask и collisionBitMask. После того, как у меня есть эта работа, я хотел бы заставить персонажа исчезнуть с экрана и анимации крови, чтобы начать, но я не знаю, как это сделать. Я думаю, вам нужно сделать что-то вроде: if (_player && _block didcollide) {} Но я не знаю, как это сделать точно.

2 Solutions collect form web for “Обнаружение столкновений в комплекте спрайтов”

CategoryBitMask устанавливает категорию, которой принадлежит спрайт, тогда как collisionBitMask устанавливает категорию, с которой спрайт может сталкиваться, а не пропускать их.

Для обнаружения столкновений вам необходимо установить контактTestBitMask. Здесь вы задаете категории спрайтов, с которыми вы хотите, чтобы контактные делегаты вызывались при контакте.

То, что вы уже сделали, правильно. Вот несколько дополнений, которые вам нужно сделать:

 _player.physicsBody.contactTestBitMask = blockCategory; _blok.physicsBody.contactTestBitMask = playerCategory; 

Затем выполните контакт делегата следующим образом:

 -(void)didBeginContact:(SKPhysicsContact *)contact` { NSLog(@"contact detected"); SKPhysicsBody *firstBody; SKPhysicsBody *secondBody; if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) { firstBody = contact.bodyA; secondBody = contact.bodyB; } else { firstBody = contact.bodyB; secondBody = contact.bodyA; } //Your first body is the block, secondbody is the player. //Implement relevant code here. } 

Чтобы получить хорошее объяснение при внедрении обнаружения столкновений, посмотрите на этот учебник.

Обработка столкновений немного беспорядочна. 🙂 Существует несколько подходов, но одно место, которое вы должны начать, – это довольно простой пример от Apple. Чтение дает хорошее введение, и тогда вы можете начать копаться с кодом.

Другой подход (который Apple упоминает в своем руководстве) заключается в использовании Double Dispatching (см. Wikipedia для длинного описания). Я бы не начал, пытаясь понять этот подход. Это несколько продвинутый подход, учитывая, что он зависит от динамических селекторов и подобных методов, позволяющих совершать магию. Однако даже с этим оговоркой вы можете найти простой пример, который кто-то собрал, как это сделать, а также множество вспомогательных описаний.

  • Вопросы SpriteKit Swift Node Count
  • Текст SKLabelNode исчезает с использованием iOS 7.1
  • Альтернатива `CACurrentMediaTime ()` для планирования событий в SpriteKit
  • Major Bug, Sprite Atlas, созданный в XCAssets Folder, не поддерживает пакетную визуализацию
  • Путаница относительно координат, кадров и дочерних узлов в SpriteKit на iOS?
  • Почему SKShapeNode ярче на верхней границе
  • Получить видимое местоположение узла SpriteKit после ротации родителя
  • Контролировать скорость в моей игре?
  • Позиция SKSPriteNode изменяется на 0,0 без причины
  • Как добавить эффекты частиц в приложение iOS, которое не является игрой с помощью iOS 7 SpriteKit Particle?
  • SpriteKit: передача данных между сценами
  • Как рассчитать сходство двух линий рисования изображений в быстром
  • Interesting Posts

    Инструмент для сравнения файлов проекта Xcode

    При покупке приложений с помощью SwifyStoreKit невозможно получить информацию о продукте

    как получить правильный NSDate из NSString без использования dateFormatter

    Как я могу использовать UIPickerView в моих настройках. Например, как это делает приложение «nike + ipod»?

    Как исправить панель поиска табличного представления, перекрывающуюся со строкой состояния

    Наследование родового класса в Swift

    CocoaLumberjack – как получить доступ к файлу журнала на устройстве?

    Существуют ли какие-либо MVVM-подобные рамки для объектно-ориентированной системы iOS?

    XCode Autosave Broken?

    UIRequiredDevice Возможности для исключения 16-го поколения iPod touch 5-го поколения без задней камеры?

    Профиль профиля Provisioning расширения WatchKit?

    UICollectionView добавление изображения в ячейку

    Выберите не поддерживать iOS-устройство

    медленная загрузка при нажатии на ячейку таблицы

    Различные URI для каждого экземпляра UIViewController

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.