2017-12-26 38 views
6

아래는 기본적으로 벽이 많은 내 "Floor.swift"클래스입니다. 내가 화면의 상단에서 오는 개체를 가지고 일단 층과 SKSpriteNodes 충돌, 나는 SKSpriteNode을 제거하고 싶습니다. 아래는 내 플로어 클래스입니다. "FUNC의 didBegin (_ 연락처 : SKPhysicsContact)"에서SKPhysicsBody 충돌이 작동하지 않습니다.

import Foundation 
import SpriteKit 

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

     let leftWall = SKSpriteNode(color: UIColor.clear, 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.clear, 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.clear, 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) 

     self.physicsBody = SKPhysicsBody(bodies: [leftWall.physicsBody!, rightWall.physicsBody!, bottomWall.physicsBody!]) 

     self.physicsBody?.categoryBitMask = floorCategory 
     self.physicsBody?.contactTestBitMask = nailDropCategory | pointCategory | lifeCategory 
     self.physicsBody?.collisionBitMask = balloonCategory 
    } 

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

GameScene 클래스 내가 쓴 : 당신이 볼 수 있듯이

func didBegin(_ contact: SKPhysicsContact) {   
     if (contact.bodyA.categoryBitMask == nailDropCategory | pointCategory | lifeCategory) && (contact.bodyB.categoryBitMask == floorCategory) { 
      // contact.bodyB.node!.removeFromParent() 
      print("COLLISION") 
     } 
} 

, 내 바닥 클래스에서 나는 self.physicsBody = SKPhysicsBody "로 객체를 설정 (본문 :) "내 모든 SKSpriteNode. 하지만 웬일인지 나는 무엇이 그렇게 탐지되는지 알지 못한다. 내 "Floor"클래스를 내 objectCategory, pointCategory, lifeCategory의 각 클래스에서 "contactTestBitMask"로 만들었습니다. 이 문제는 제가 잠시 동안 갇혀 있었던 아이디어였습니다.

업데이트 : 그래서 지금 아래에이 코드를 사용하고 있는데이 작동하고

! 유일한 문제는 내 "balloonCategory"도 제거하는 기본 사례이며이를 수행하고 싶지 않습니다. 그 카테고리 만 무시하고 풍선의 벽처럼 행동하게하려면 어떻게해야합니까?

func didBegin(_ contact: SKPhysicsContact) { 
     let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 

     switch contactMask { 
     case balloonCategory | nailDropCategory: 
      print("nailDrop and balloon have contacted.") 
      contact.bodyB.node!.removeFromParent() 
      self.run(SKAction.playSoundFileNamed("lostlifesound.mp3", waitForCompletion:false)) 
      lifeLost -= 1 
     case balloonCategory | pointCategory: 
      print("point and balloon have contacted.") 
      contact.bodyB.node!.removeFromParent() 
      totalPoints += 2 
      self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false)) 
     case balloonCategory | lifeCategory: 
      print("life and balloon have contacted.") 
      contact.bodyB.node!.removeFromParent() 
      lifeLost += 1 
      self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false)) 
     default:    
      contact.bodyB.node!.removeFromParent() 
      print("Removed \(String(describing: contact.bodyB.node!.name))") 
     } 
    } 
+0

nailDropCategory? pointCategory? lifeCategory? 아무도 당신이 비트 마스크를 정의하는 방법을 알지 못합니다. –

+0

글쎄, 나는 다른 모든 클래스에 정의했고 다른 모든 충돌은 작동하기 때문에 나는 단지 잃어버린다. – Dewan

+1

physics가 이미 프로젝트에서 작동하고 있다면 이것이 작동해야하는 것처럼 보인다. Github의 샘플 프로젝트 및 공유에서이 문제를 재현 할 수 있습니까? 솔루션이 디버깅에서 온 것처럼 보입니다. – peacetype

답변

5

소리가 난다 그들. 아래 switch 문에서 기본 케이스에 대한 변경 사항을 참조하십시오. 이렇게하면 노드가 풍선 인 경우 제거되지 않습니다. 물리 충돌은 계속 작동합니다.

func didBegin(_ contact: SKPhysicsContact) { 
    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 

    switch contactMask { 
    case balloonCategory | nailDropCategory: 
     print("nailDrop and balloon have contacted.") 
     contact.bodyB.node!.removeFromParent() 
     self.run(SKAction.playSoundFileNamed("lostlifesound.mp3", waitForCompletion:false)) 
     lifeLost -= 1 
    case balloonCategory | pointCategory: 
     print("point and balloon have contacted.") 
     contact.bodyB.node!.removeFromParent() 
     totalPoints += 2 
     self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false)) 
    case balloonCategory | lifeCategory: 
     print("life and balloon have contacted.") 
     contact.bodyB.node!.removeFromParent() 
     lifeLost += 1 
     self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false)) 
    default: 
     if contact.bodyB.node!.name == "balloon" { 
      print("Balloon collided but we will not remove it.") 
      return 
     } else { 
      contact.bodyB.node!.removeFromParent() 
      print("Removed \(String(describing: contact.bodyB.node!.name))") 
    } 
} 
+0

야, 정말 너의 도움에 진심으로 감사한다. 당신은 축복의 나물이며 멋진 새해를 보내길 바랍니다! 다시 한 번 고마워요. – Dewan

+1

당신과 같고, 게임에 대한 행운을 누리십시오! – peacetype

+1

감사! 마지막 질문. iOS에서 가장 좋아하는 광고 네트워크는 무엇입니까? – Dewan

1

당신은 그 노드 B가 바닥이고 nodeA에서 정말 nailDropCategory | pointCategory | lifeCategory입니다 보장 할 수 없습니다?

I 해요 naildDrop, pointlife 당신은 어떤 사람이 floor에 닿을 때에 대한 통지 할 3 객체가 있다고 가정 때문에,이처럼 didBegin(contact:) 구조화 시도 :

func didBegin(_ contact: SKPhysicsContact) { 
    print("didBeginContact entered for \(String(describing: contact.bodyA.node!.name)) and \(String(describing: contact.bodyB.node!.name))") 

    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 

    switch contactMask { 
    case nailDropCategory | FloorCategory: 
     print("nailDrop and floor have contacted.") 
    case pointCategory | FloorCategory: 
     print("point and floor have contacted.") 
    case lifeCategory | FloorCategory: 
     print("life and floor have contacted.") 
    default: 
     print("Undetected collision occurred") 
    } 
} 

가 실제로 만든 적이 Floor 클래스의 객체입니까? 이제

class Balloon: SKSpriteNode { 
    init() { 
     super.init(texture: nil, color: .blue, size: CGSize(width: 50, height: 50)) 
     self.name = "balloon" 
    } 
} 

당신이 스위치에 체크, 삭제를 결정하기 전에 개체의 신원을 확인할 수 있습니다 할 때 : 당신과 같이, 모든 개체 유형에 이름을 할당하는 혜택을 누릴 것 같은

+0

"didBeginContact가 nil 및 nil로 입력되었습니다"라고 표시하고 스위치에 "default :"를 반환합니다. 또한, "self.physicsBody = SKPhysicsBody (본문 : [leftWall.physicsBody!, rightWall.physicsBody !, bottomWall.physicsBody!])"행은 기존 PhysicsBody와 겹치고 몇 가지 문제를 일으 킵니다. 이것이 너무 일찍 진행 되었기 때문에 어떤 일이 일어나고 있는지 확실하지 않습니다. 그래서 완전히 잃어버린 것 같습니다. – Dewan

+0

그래서 우리는 무언가가 접촉했다는 것을 알았습니다 - 여러분의 장면에있는 모든 노드가 이름을 가지고 있는지 확인하십시오. 그러면 충돌 한 것을 알게 될 것입니다. 나는 물리학 자체라고 말할 때 어떤 의미인지 모르겠습니다. 코드에 따르면, Floor 객체에는 기존 물리 물리 체가 없으므로 본문 물리 본문과 겹칩니다. –

+0

SKPhysicsBody 배열의 모든 코드가 "bottomWall.physicsBody = SKPhysicsBody (rectangleOf : bottomWall.size)"라는 코드 줄과 함께 leftWall 및 rightWall에도 적용됩니다. 저는 문자 그대로 이중 물리학 체를 만들고 있어요. 그래서이 시점에서 무엇이 진행되고 있는지 확실하지 않습니다. 이것은 스트레스가 많습니다 – Dewan