【问题标题】:Programmatically create SKTileMapNode in Swift在 Swift 中以编程方式创建 SKTileMapNode
【发布时间】:2016-09-16 14:14:11
【问题描述】:

请问有人知道如何使用 Swift 以编程方式创建 SKTileMapNode 吗? (注意:我不想使用编辑器执行此操作,我只想以编程方式实现)

我尝试了以下方法,但没有渲染我的瓦片地图

let bgTexture = SKTexture(imageNamed: "background")
let bgDefinition = SKTileDefinition(texture: bgTexture, size: bgTexture.size())
let bgGroup = SKTileGroup(tileDefinition: bgDefinition)
let tileSet = SKTileSet(tileGroups: [bgGroup])
let bgNode = SKTileMapNode(tileSet: tileSet, columns: 5, rows: 5, tileSize: bgTexture.size())
bgNode.position = CGPoint(x: self.frame.size.width / 2, y: self.frame.size.height / 2)
bgNode.setScale(1)
self.addChild(bgNode)

非常感谢任何帮助

【问题讨论】:

  • 你从来没有真正制作过你的地图,它怎么知道你正在使用什么瓦片,节点知道瓦片,你为地图创建空间,你现在需要实际制作地图,我对此了解不多,无法为您解答。
  • @Knight0fDragon 你知道 SKTileMapNode 是否可以缩放吗?
  • @Confused,我不明白为什么不,scale 是 SKNode 的成员(好吧 xScale yScale 是)
  • 是的...我只是不相信任何东西或 SceneKit 或 SpriteKit 会像宣传的那样工作...让我怀疑和困惑;)
  • @Confused 您可以将缩放应用于SKCameraNode,例如为不同的设备和方向调整大小。

标签: sprite-kit swift3 ios10 sktilemapnode


【解决方案1】:

要使用单个背景图块布局整个地图,您需要遍历每一列和每一行。您需要先检索背景图块。

let tile = bgNode.tileSet.tileGroups.first(
    where: {$0.name == "background"})

for column in 0..4 {
    for row in 0..4 {
        bgNode.setTileGroup(tile, forColumn: column, row: row)
    }
}

还有一个方便的功能可以实现洪水填充;

bgNode.fill(with: tile)

还有一个SKTilemapNode 的初始化器,它接受SKTileGroup

let bgNode = SKTileMapNode(tileSet: tileSet, columns: 5, rows: 5, tileSize: bgTexture.size(), fillWithTileGroup: tile)

我强烈建议利用 Xcode 中内置的功能来创建 TileSet 和 TileMap。您仍然可以以编程方式填充地图。

【讨论】:

    【解决方案2】:

    如果它对任何人都有帮助,下面是全部内容:

    class MyGameScene: SKScene {
        override func didMove(to view: SKView) {
            guard let tileSet = SKTileSet(named: "testset") else {
                // hint: don't use the filename for named, use the tileset inside
                fatalError()
            }
    
            let tileSize = tileSet.defaultTileSize // from image size
            let tileMap = SKTileMapNode(tileSet: tileSet, columns: 5, rows: 5, tileSize: tileSize)
            let tileGroup = tileSet.tileGroups.first
            tileMap.fill(with: tileGroup) // fill or set by column/row
            //tileMap.setTileGroup(tileGroup, forColumn: 5, row: 5)
            self.addChild(tileMap)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多