eine besondere Fliese SKTileMapNode
Ich habe ein Tile Map Node
Entfernen, dass meine gesamte Spielszene umfasst (GameScene.sks
). Oben auf dem Bildschirm ist ein Feind. Und es gibt winzige Häuser, die unten liegen. Nur diese Häuser kommen vom Kachelkartenknoten. Der Feind soll auf eines dieser Häuser schießen. contactBitMask
ist sowohl auf abgefeuerte Schüsse als auch auf Hauskacheln eingestellt. Und ich möchte das Haus, das von dem Schuss getroffen wird, mit contactBitMask
entfernen. Wie auch immer, ich habe die folgenden Zeilen Code.
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
}
}
}
Wenn ein Schuss ein Haus trifft, die didBegin
Physik Methoden tut mir die Kachel sagen, der getroffen wird. (Siehe Druck (Spalte, Zeile)). Was ich habe Schwierigkeiten ist, wie man die Fliese, die getroffen wird, entfernt. node.removeFromParent() ist nicht wirksam. Und ich kann keine der Fliesen entfernen. Ich habe das Gefühl, dass man eine Kachel nicht entfernen kann. Oder können wir? Ich dachte, die Verwendung von Kacheln ist eine effiziente Möglichkeit, SpriteKit-Spiele zu entwickeln. Aber es scheint mir anders zu sein. Ich denke, ich könnte diese Häuser einfach der Szene hinzufügen. Vielen Dank.
Per Definition ist das SkTileMapNode-Objekt ein Knoten als Ganzes? Ich denke, du kannst ein bestimmtes Plättchen nicht entfernen. –
Versuchen Sie 'Subclassing'' SKTileDefinition'. Sie können einen benutzerdefinierten Lebenszyklus Ihrer Klasse erstellen. –
Hmm ... Danke für einen Vorschlag. Ich schätze, ich füge sie einfach als SKTexture in die Szene ein. –