2015-04-07 2 views
1

Я пытаюсь получить «Блок», чтобы столкнуться с «землей» вместо блока, проходящего через землю и исчезающего!Xcode Swift Game (Проблема с коллизиями)

Вот мой код для блока

 hero = CSHero() 
    hero.position = CGPointMake(70, movingGround.position.y + movingGround.frame.size.height/2 + hero.frame.size.height/2) 
    hero.physicsBody = SKPhysicsBody(rectangleOfSize: hero.size) 
    hero.physicsBody?.dynamic = true 
    hero.physicsBody?.contactTestBitMask = heroCategory | groundCategory 
    hero.physicsBody?.collisionBitMask = heroCategory | groundCategory 
    addChild(hero) 

Вот мой код для Ground

 let ground1 = SKSpriteNode(color: UIColor.blackColor(), size: CGSizeMake(view.frame.size.width, 15)) 
    ground1.position = view.center 
    ground1.physicsBody = SKPhysicsBody(rectangleOfSize: ground1.size) 
    ground1.physicsBody!.dynamic = false 
    ground1.physicsBody!.contactTestBitMask = groundCategory | heroCategory 
    ground1.physicsBody!.collisionBitMask = groundCategory | heroCategory 
    addChild(ground1) 

Каждый раз, когда я запускаю это блок просто исчезает, если у меня есть динамическое значение ИСТИНА.

Любая помощь?

ответ

1

Вы забыли очень важную часть логики столкновения PhysicsBody: categoryBitMask. Свойство categoryBitMask - это то, что сообщает системе, какой тип объекта он есть. Вы, по сути, сообщаете системе, к чему вы хотите, чтобы каждый объект сталкивался, но вы забываете рассказать системе, какие типы объектов они на самом деле.

Для уточнения, contactTestBitMask необходим только в том случае, если вы действительно хотите, чтобы вас уведомили, когда сталкиваются две вещи, но не хотят, чтобы их физические тела воздействовали друг на друга. (Подумайте, когда Марио ударит по монете. Он не отскакивает от него, но вам нужно получить уведомление об упомянутом столкновении, когда вы обновляете количество монет). collisionBitMask сообщает системе, с каким телом на самом деле физически сталкиваются. Но это свойство должно быть сопряжено с categoryBitMask, чтобы на самом деле работать.

Прямо сейчас у вас есть все, что вам нужно. Dynamic не требуется. Что вам нужно сделать, это добавить эти две строки кода:

ground1.physicsBody?.categoryBitMask = groundCategory 
hero.physicsBody?.categoryBitMask = heroCategory 

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

+0

Спасибо! Это сработало :) У меня есть одна проблема, хотя он остается на «земле» сейчас, но он находится все влево от экрана! Я едва вижу его, как показывает 1/8 его тела. Я попытался изменить его положение, но он просто телепортируется влево от экрана, когда я это делаю! Любые предложения? :) –

+0

Это происходит, когда Dynamic установлен в true, но мне нужно, чтобы Dynamic был установлен в true, чтобы блок мог столкнуться с другими статическими блоками. –

+0

Awesome! Если это сработало, примите ответ :) И если вы хотите, чтобы он столкнулся с другими статическими блоками, то просто обновите collisionBitMask до битовой маски статических блоков! –

Смежные вопросы