2017-04-21 2 views
1

enter image description hereSKTileMapNode

에서 특정 타일을 제거 내 전체 게임 장면 (GameScene.sks)를 커버하는 Tile Map Node 있습니다. 화면 상단에 적이 있습니다. 바닥에 작은 집이 있습니다. 이 집들만 타일 맵 노드에서옵니다. 적군은 그 집들 중 한 곳에서 총을 쏘기로되어 있습니다. contactBitMask은 발사 된 샷과 집 타일로 설정됩니다. 그리고 총에 맞은 집을 contactBitMask으로 제거하고 싶습니다. 어쨌든 다음 줄 코드가 있습니다.

class GameScene: SKScene, SKPhysicsContactDelegate { 

    var destructibleCount = Int() // destructibleCount 
    func setupDestructiblePhysics() { 
     guard let obstaclesTileMap = obstaclesTileMap else { return } 
     for row in 0..<obstaclesTileMap.numberOfRows { 
      for column in 0..<obstaclesTileMap.numberOfColumns { 
       guard let tile = tile(in: obstaclesTileMap, at: (column, row)) // a function returning SKTileDefinition 
        else { continue } 
       guard tile.userData?.object(forKey: "destructible") != nil // 'destructible' is set through TileSet 
        else { continue } 
       let node = SKNode() 
       node.physicsBody = SKPhysicsBody(rectangleOf: tile.size) 
       node.physicsBody?.isDynamic = false 
       node.physicsBody?.categoryBitMask = PhysicsCategory.Building 
       node.position = obstaclesTileMap.centerOfTile(atColumn: column, row: row) 
       node.name = "building" 
       obstaclesTileMap.addChild(node) 
       destructibleCount += 1 
      } 
     } 
    } 

    func didBegin(_ contact: SKPhysicsContact) { 
     let enemyBeamContact = contact.bodyA.categoryBitMask == PhysicsCategory.EnemyShot ? contact.bodyB : contact.bodyA 
     switch enemyBeamContact.categoryBitMask { 
     case PhysicsCategory.Building: 
      if let nodeA = contact.bodyA.node { 
       let column = obstaclesTileMap!.tileColumnIndex(fromPosition: nodeA.position) 
       let row = obstaclesTileMap!.tileRowIndex(fromPosition: nodeA.position) 
       print(column, row) 
       enumerateChildNodes(withName: "building", using: { node, _ in 
        if node.position == nodeA.position { 
         node.removeFromParent() 
        } 
       }) 

       if let tile = tile(in: obstaclesTileMap!, at: (column, row)) { 
        // not being used 
       } 
      } 
      if let nodeB = contact.bodyB.node { 
       // bullet // 
       if nodeB.name == "beam" { 
        nodeB.removeFromParent() 
       } 
      } 
     default: 
      break 
     } 
    } 
} 

슛 집 안타

didBegin 물리학 방법은 나에게 타격되고있는 타일을 이야기한다. (print (column, row)를 보라). 내가 어려움을 겪고있는 타일을 치는 방법입니다. node.removeFromParent()가 효과적이지 않습니다. 타일을 제거 할 수는 없습니다. 타일 ​​하나를 제거 할 수 없다는 느낌이 들었습니다. 아니면 우리가 할 수 있을까요? 필자는 타일 사용이 SpriteKit 게임을 개발하는 효율적인 방법이라고 생각했습니다. 그러나 그것은 나에게 다르게 보인다. 나는 그 집들을 프로그램 적으로 장면에 추가 할 수 있다고 생각한다. 감사.

+0

정의에 따르면, SkTileMapNode 객체는 전체적으로 노드입니까? 나는 당신이 특정 타일을 제거 할 수 없다고 생각합니다. –

+0

''SKTileDefinition'을'서브 클래 싱하기 '를 시도하십시오. 클래스의 사용자 정의 라이프 사이클을 만들 수 있습니다. –

+0

음 ... 제안 해 주셔서 감사합니다. 그냥 SKTexture로 장면에 추가 할 것입니다. –

답변

1

SKTilemapNode은 자체적으로 전체이므로 연락처 테스트는 개별 타일이 아닌 타일 맵과 접촉 할 때만 알려줍니다.

타일 맵을 사용하여 레벨을 디자인하는 것이지만 didMove(to:) 기능에서는 타일지도를 걸어서 찾을 수있는 각 집마다 개별적으로 SKSpriteNode을 만듭니다. 걷기

작업이 완료되면 : 당신은 (당신이 사용 텍스처, 위치 등)을 통해 원하는 정보를 얻을 수 SKTilemapNode 's의 기능을 사용할 수 있습니다 타일 ​​맵과 모든 집이 생성되고 장면에서 타일 맵을 제거하고 평소처럼 집과 연락을 취하십시오.

희망이 있습니다.