2017-12-22 3 views
2

아래의 "Floor.swift"클래스는 기본적으로 벽이 많습니다. 내가 화면의 상단에서 오는 개체를 가지고 일단 층과 SKSpriteNodes 충돌, 나는 SKSpriteNode을 제거하고 싶습니다. 아래는 내 플로어 클래스입니다.SKPhysicsContact 카테고리를 검색하지 못함 마스크 마스크 충돌

if (contact.bodyA.categoryBitMask == floorCategory) && (contact.bodyB.contactTestBitMask == objectCategory | pointCategory | lifeCategory) { 
       contact.bodyB.node!.removeFromParent() 
       print("COLLISION") 
} 

을하지만 어떤 이유로 나는 그렇게 이제까지 무엇 어떤 감지를받지 못했습니다 :

import Foundation 
import SpriteKit 

    class Floor: SKNode { 
     override init() { 
      super.init() 

      let leftWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 5, height: 50)) 
      leftWall.position = CGPoint(x: 0, y: 50) 
      leftWall.physicsBody = SKPhysicsBody(rectangleOf: leftWall.size) 
      leftWall.physicsBody!.isDynamic = false 
      self.addChild(leftWall) 

      let rightWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 5, height: 50)) 
      rightWall.position = CGPoint(x: 375, y: 50) 
      rightWall.physicsBody = SKPhysicsBody(rectangleOf: rightWall.size) 
      rightWall.physicsBody!.isDynamic = false 
      self.addChild(rightWall) 

      let bottomWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 500, height: 10)) 
      bottomWall.position = CGPoint(x: 150, y: -5) 
      bottomWall.physicsBody = SKPhysicsBody(rectangleOf: bottomWall.size) 
      bottomWall.physicsBody!.isDynamic = false 
      self.addChild(bottomWall) 

      // Set the bit mask properties 
      self.physicsBody?.categoryBitMask = floorCategory 
      self.physicsBody?.contactTestBitMask = objectCategory | pointCategory | lifeCategory 
      self.physicsBody?.collisionBitMask = dodgeCategory 
     } 

     required init?(coder aDecoder: NSCoder) { 
      fatalError("init(coder:) has not been implemted") 
     } 
    } 

그런 다음 아래 내 GameScene 클래스에서 " func didBegin(_ contact: SKPhysicsContact)"나는 썼다. 내 "Floor"클래스를 내 objectCategory, pointCategory, lifeCategory의 각 클래스에서 "contactTestBitMask"로 만들었습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까!? 다른 충돌은 감지되지만이 충돌은 감지되지 않습니다.

답변

3

귀하의 leftWall, rightWallbottomWall는 기본을 contactTestcollision 비트 마스크를, 그래서 모든 충돌 아무것도와 연락처를 생성합니다. 그들은 모두 isDynamic 속성이 false으로 설정되어 있기 때문에 아무거나 충돌하거나 연락 할 수 없습니다. 다른 것들이 isDynamictrue으로 설정되어 있으면 다른 것들이 충돌하여 연락 할 수 있습니다.

그러나 이것은 아마도 원하는 것입니다 (바닥과 벽은 일반적으로 동적이지 않습니다). 실제 문제는 Floor 클래스의 객체가 물리 구조체를 갖지 않는다는 것입니다. 다른 곳에서 초기화하지 않는 한 말입니다. 이러한 라인이 있습니다

self.physicsBody?.categoryBitMask = ... self.physicsBody?.contactTestBitMask = ... self.physicsBody?.collisionBitMask = ...

을하지만 실제로 self.physicsBody을 만들지 않았습니다. 선택 체인 (self,phyicsBody?)을 사용하고 Swift가 '?'에 도달하고 "오 - 선택 사항이며 존재하지 않는다"는 것을 제외하고는 코드가 다운됩니다. 난 그냥 여기 중지하고 "최소한

, 3 벽 객체의 물리 기관 사용하여 Floor 개체에 대한 물리 몸을 만드는 노력 할게요 :

Self.physicsBody = SKPhysicsBody(Bodies: [leftWall.physicsBody, rightWall.PhysicsBoidy, bottomWall.physicsBody])

(SKPhysicsBody이 initialiser있다을 새로운 물리 구조체를 만들기 위해 일련의 물리 구조체를 필요로합니다).

+0

"ourUnionOfBodies = SKPhysicsBody (본문 : [leftWall.physicsBody!, rightWall.physicsBody!, bottomWall.physicsBody!])"하고 다음 줄 "ourUnionOfBodies.isDynamic = false"에 썼습니다. 여전히 작동하지 않습니까? 나는 그들이 단지 충돌을 감지하지 못한다. 바로 – Dewan

+0

@Dewan 안녕 Dewan - ther 늦은 대답에 대한 미안하지만 나는 여행하고 있었다. 그래서 당신은'ourUnionOfBodies' 물리학 몸체를 만들었고, 당신은 그 물리학 자 본문을 비 동적으로 설정했습니다, 그러나 여러분은 이것을 Floor 객체의 물리학 자 본문으로 설정 했습니까? 'self.physicsBody? ... '작업을하기 전에'self.physicsBody = '를 수행 할 필요가 있습니다. 'self.physicsBody = SkyphysicsBody (bodies ...')가 아니라 물리학 체를 유지하기 위해 별도의 속성을 만든 이유는 무엇입니까? –

+0

나는 그것을 시도했지만 실제로 차이를 만들지 않았습니다. 충돌 감지를 볼 수 없습니다. 그들은 내 층을 통해 계속 떨어졌다. – Dewan

관련 문제