2017-01-01 2 views
0

У меня теперь есть: Большинство моих текущих столкновений узла Sprite работают так, как они должны, за исключением того, что boxNode входит в контакт с floorNode. У меня есть 3 спрастных узла: floorNode, playerNode и boxNode. PlayerNode отскакивает в воздухе, когда пользователь нажимает экран, и boxNode (ы) появляются из потолка и падают, пока не вступают в контакт с floorNode.Swift 3 Sprite Node Contact/Collision не работает должным образом

Проблема: столкновение, с которым у меня возникли проблемы, когда boxNode сталкивается с floorNode. Игра заканчивается, когда boxNode вступает в контакт с floorNode, когда все, что должно произойти, это boxNode исчезает при столкновении с floorNode.

playerNode сталкивается с floorNode = игра закончена

boxNode сталкивается с playerNode = игра закончена

boxNode сталкивается с floorNode = (Игра заканчивается, когда происходит это столкновение) не должно приводить к игре до конца.

Это мой текущий код:

import UIKit 
import SpriteKit 
import SceneKit 
import Foundation 
import CoreData 
import GameplayKitstruct 

ColliderType { 

static let blueBallCategory: UInt32 = 0x1 << 0 
static let floorNode: UInt32 = 0x1 << 1 
static let firstBody: UInt32 = 0x1 << 2 
static let secondBody: UInt32 = 0x1 << 3 
static let boxNodeCategory: UInt32 = 0x1 << 4 

} 

class GameScene: SKScene, SKPhysicsContactDelegate { 

floorNode.contactTestBitMask = 0 
floorNode.categoryBitMask = ColliderType.floorNodeCategory 
floorNode.collisionBitMask = ColliderType.playerNodeCategory | ColliderType.boxNodeCategory 
self.physicsBody = floorNode 
self.physicsBody?.friction = 0 

playerNode.physicsBody?.categoryBitMask = ColliderType.playerNodeCategory 
playerNode.physicsBody?.contactTestBitMask = 0 
playerNode.physicsBody?.collisionBitMask = ColliderType.floorNodeCategory 

boxNode.physicsBody?.categoryBitMask = ColliderType.boxNodeCategory 
boxNode.physicsBody?.contactTestBitMask = ColliderType.playerNodeCategory | ColliderType.floorNodeCategory 
boxNode.physicsBody?.collisionBitMask = 0 



func didBegin(_ contact:SKPhysicsContact) { 

       let firstBody = contact.bodyA 
       let secondBody = contact.bodyB 


if firstBody.categoryBitMask == ColliderType.playerNodeCategory || secondBody.categoryBitMask == ColliderType.boxNodeCategory{ 

       self.boxNode.removeFromParent() 

       gameOver = true 
       self.speed = 0 
       timer.invalidate() 


}else if firstBody.categoryBitMask == ColliderType.floorNodeCategory || secondBody.categoryBitMask == ColliderType.floorNodeCategory { 

       gameOver = true 
       self.speed = 0 
       timer.invalidate() 

}else if firstBody.categoryBitMask == ColliderType.boxNodeCategory || secondBody.categoryBitMask == ColliderType.floorNodeCategory{ 


       self.boxNode.removeFromParent() 



}else if contact.bodyA.categoryBitMask == ColliderType.boxNodeCategory{ 

       contact.bodyA.node!.removeFromParent() 

}else if contact.bodyB.categoryBitMask == ColliderType.boxNodeCategory{ 

       contact.bodyB.node!.removeFromParent() 

       gameOver = true 
       self.speed = 0 
       timer.invalidate() 


} 

} 

} 
+0

Ваш фрагмент кода запутан, поскольку отступы перепутаны (возможно, когда вы его скопировали), но также он выглядит частичным. Пожалуйста, разместите свой метод делегирования с полным контактом, I.e. func didBegin (_ контакт: SKPhysicsContact) {... –

+0

Привет @AliBeadle, я обновил свой код и исправил отступы, поэтому, надеюсь, теперь его немного легче читать. Спасибо за ваш ответ. –

ответ

0

Проблема, кажется, что вы не учтенные должным образом за то, что метод didBegin (контакт :) Боде и bodyB может быть в любом порядке. Например, если физическое тело X сталкивается с физическим телом Y, метод didBegun (контакт :) может быть вызван с телом A = X и bodyB = Y или bodyA = Y и bodyB = X. Ваш код должен учитывать это, и в настоящее время он этого не делает.

В частности, в случае, когда bodyA является полом и корпусом B, это поле: это не удастся, за исключением вашего последнего состояния, которое заканчивает игру.

+0

Извините за поздний ответ, я был более занят, чем обычно, на работе. Можно ли создать больше контактных органов? Пример: пусть thirdBody = contact.bodyC. Я все еще быстро обучаюсь, есть ли способ специально назначить bodyA и bodyB для конкретного случая/состояния? –

+0

@ p.dane Я не совсем уверен, что понимаю. Обратите внимание: Swift - это просто язык. Спрайты, физические тела и т. Д. Предоставляются SpriteKit, API, независимым от языка Swift. Каждый спрайт может иметь свое физическое тело. Вы можете иметь столько спрайтов (с физическими телами), сколько захотите. У каждого физического тела есть категория - категория - 32-битная маска, поэтому у вас может быть до 32 различных категорий. –

+0

Прошу прощения за любую путаницу, которую я мог причинить. Вы упомянули, что тело А и тело В могут быть в любом порядке. Но в этом случае bodyA необходимо назначить floorNode и bodyB, назначенным boxNode. Вместо того, чтобы тела были в любом порядке, существует ли способ назначить тело определенному узлу? –

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