에서 특정 타일을 제거 내 전체 게임 장면 (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 게임을 개발하는 효율적인 방법이라고 생각했습니다. 그러나 그것은 나에게 다르게 보인다. 나는 그 집들을 프로그램 적으로 장면에 추가 할 수 있다고 생각한다. 감사.
정의에 따르면, SkTileMapNode 객체는 전체적으로 노드입니까? 나는 당신이 특정 타일을 제거 할 수 없다고 생각합니다. –
''SKTileDefinition'을'서브 클래 싱하기 '를 시도하십시오. 클래스의 사용자 정의 라이프 사이클을 만들 수 있습니다. –
음 ... 제안 해 주셔서 감사합니다. 그냥 SKTexture로 장면에 추가 할 것입니다. –