2017-04-21 4 views
1

enter image description hereeine 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.

+0

Per Definition ist das SkTileMapNode-Objekt ein Knoten als Ganzes? Ich denke, du kannst ein bestimmtes Plättchen nicht entfernen. –

+0

Versuchen Sie 'Subclassing'' SKTileDefinition'. Sie können einen benutzerdefinierten Lebenszyklus Ihrer Klasse erstellen. –

+0

Hmm ... Danke für einen Vorschlag. Ich schätze, ich füge sie einfach als SKTexture in die Szene ein. –

Antwort

1

Ein SKTilemapNode ist ein ganzer in sich, so dass Kontakt Test wird Ihnen nur sagen, wenn Sie Kontakt mit der Kachelkarte, nicht die einzelnen Fliesen.

Was Sie tun können, ist, verwenden Sie eine Tilemap, um die Ebenen zu entwerfen, aber in der didMove(to:) Funktion, gehen Sie die Kachelkarte und erstellen Sie individuelle SKSpriteNode für jedes Haus, das Sie finden. Sie können SKTilemapNode ‚s-Funktionen verwenden, um die Informationen, die Sie brauchen (die Sie Textur, Position, etc.):

Sobald Sie fertig sind zu Fuß die Kachelkarte und alle deine Häuser werden erstellt, entferne die Kachelkarte aus der Szene und stelle Kontakt zu den Häusern her, wie du es normalerweise tun würdest.

Hoffe es hilft!