2014-12-21 4 views
1

물리 본문을 SKSpriteNode의 하위 클래스로로드하는 방법이 있습니까? 장면 외부에 SKSpriteNode의 하위 클래스를 만들었습니다.SKSpriteNode 서브 클래스의 물리 본문로드

class specializedNode: SKSpriteNode { 
    var variable = 0 
} 

장면 내에서 objectA 및 물리 카테고리 구조를 만드는 함수를 만들었습니다.

struct PhysicsCategory { 
    static let None : UInt32 = 0 
    static let All : UInt32 = UInt32.max 
    static let A : UInt32 = 0b1  
    static let B : UInt32 = 0b10  
} 

func spawnObjectA() { 
    objectA = specializedNode() 

    objectA.physicsBody = SKPhysicsBody(rectangleOfSize: objectA.size) 
     objectA.physicsBody?.dynamic = true 
     objectA.physicsBody?.categoryBitMask = PhysicsCategory.A 
     objectA.physicsBody?.contactTestBitMask = PhysicsCategory.B 
     objectA.physicsBody?.collisionBitMask = PhysicsCategory.None 
     objectA.physicsBody?.usesPreciseCollisionDetection = true 
    addChild(objectA) 
} 

그런 다음 objectA가 objectB와 충돌 할 때 didBeginContact를 호출했습니다.

func objectADidCollide(objectA:specializedNode, objectB:SKSpriteNode) { 
    objectB.removeFromParent() 
    ++objectA.variable 
} 

func didBeginContact(contact: SKPhysicsContact) { 
    var firstBody: SKPhysicsBody 
    var secondBody: SKPhysicsBody 
    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 
    } else { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 

    if ((firstBody.categoryBitMask & PhysicsCategory.A != 0) && (secondBody.categoryBitMask & PhysicsCategory.B != 0)) { 
      objectADidCollide(firstBody.node as specializedNode, objectB: secondBody.node as SKSpriteNode) 
    } 
} 

그러나 코드를 실행하고 두 개체가 충돌하면 코드가 중단 점에 도달하고 디버그 탐색기가 팝업됩니다.

라인 10 (0x58e0fc : 트랩)으로 변 녹색 및 표시 :

"스레드 : 1 EXC_BREAKPOINT (코드 = EXC_ARM_BREAKPOINT, 서브 코드 = 0xdefe)"

libswiftCore.dylib`swift_dynamicCastClassUnconditional: 
0x58e0ec: cbz r0, 0x58e0fc    ; swift_dynamicCastClassUnconditional + 16 
0x58e0ee: ldr r2, [r0] 
0x58e0f0: cmp r2, r1 
0x58e0f2: it  eq 
0x58e0f4: bxeq lr 
0x58e0f6: ldr r2, [r2, #0x4] 
0x58e0f8: cmp r2, #0x0 
0x58e0fa: bne 0x58e0f0     ; swift_dynamicCastClassUnconditional + 4 
0x58e0fc: trap 
0x58e0fe: nop 

나는대로 objectA를로드하지 않으 SKSpriteNode, 하위 클래스에서 만든 objectA의 특성을 변경하려고합니다. 어떤 제안?

+0

디버그 탐색기? 앱이 중단 점에 도달하거나 충돌하는 것을 의미합니까? 그렇다면 충돌 메시지를 게시하고 충돌이 발생한 줄을 게시하십시오. 있는 그대로, spawnObjectA 메서드는 결코 노드를 자식으로 추가하지 않으므로 게임에 나타나지 않습니다. – LearnCocos2D

+0

코드를 전송할 때 실수로 생성 라인을 삭제하고 관련없는 코드를 삭제해야합니다. 충돌 메시지가 있습니다. – ETRunner

+0

프로젝트에 중단 점이 있습니까? xcode의 중단 점 탐색기 창 확인 – LearnCocos2D

답변

1

나는 거의 동일한 문제를 겪고있었습니다. Ray Wenderlich 튜토리얼의 코드로 시작하여 거기에서 하위 클래스 화를 시작했습니다. 자습서가 didBeginContact에서 발사체와 몬스터를 서로 바꾼다는 것이 확실합니다. 그들은 같은 수업을 듣고 둘 다 제거하기 때문에 중요하지 않습니다.

당신의 프로그램 (및 광산)에서 당신은 객체를 그렇지 않은 것에 타입 변환하려고한다는 것을 의미합니다.

난 그냥 objectADidCollide 호출에서 firstBody와 secondBody를 바꿔서 문제를 해결했습니다.

코드를 보면, 그게 정확히 당신 문제라고 생각하지 않지만, 잘못된 객체를 typecasting한다면 놀라지 않을 것입니다.