程序地图生成 - SpriteKit 和 GameplayKit
Procedural Map Generation - SpriteKit and GameplayKit
我有以下代码使用新 GameplayKit
的 GKNoise
生成噪声。我不确定如何将它与 SKTileMapNode
一起使用。有人试过这个吗?目前,噪声应用于每个图块,但未应用于整体 TileMap
。有没有办法将生成的噪声用于整个地图?
let noise: GKNoise = GKNoise(noiseSource: GKPerlinNoiseSource())
let noiseMap: GKNoiseMap = GKNoiseMap(noise: noise)
let texture: SKTexture = SKTexture(noiseMap: noiseMap)
let tileDef = SKTileDefinition(texture: texture)
let tileGroup = SKTileGroup(tileDefinition: tileDef)
let tileSet = SKTileSet(tileGroups: [tileGroup])
// Create a tile map
let tileSize = CGSize(width: 32.0, height: 32.0)
let tileMap = SKTileMapNode(tileSet: tileSet, columns: 16, rows: 16, tileSize: tileSize)
// Fill the entire map with a tile group
tileMap.fill(with: tileGroup)
self.addChild(tileMap)
GKNoise returns [-1.0,1.0] 范围内的噪声。
您需要以某种有意义的方式将其映射到您的游戏中。一个简单的例子就是说 [-1.0,0.0] 之间的一切都是水,而 (0.0,1.0] 之间的一切都是陆地。
一旦你决定了这个映射是什么,只需在 GKNoiseMap 上使用 getValue() 对你想要填充的每个图块进行一次采样,然后使用你的规则来决定使用哪个图块。
最近的一篇文章提出了一种方法,说明了将 GKPerlinNoiseSource
映射到 SKTileMapNode
的方法。我认为这可能比已接受的答案更有用(尽管已接受的答案比本文早几年)。
请注意这篇文章在 Swift 5.2.
我有以下代码使用新 GameplayKit
的 GKNoise
生成噪声。我不确定如何将它与 SKTileMapNode
一起使用。有人试过这个吗?目前,噪声应用于每个图块,但未应用于整体 TileMap
。有没有办法将生成的噪声用于整个地图?
let noise: GKNoise = GKNoise(noiseSource: GKPerlinNoiseSource())
let noiseMap: GKNoiseMap = GKNoiseMap(noise: noise)
let texture: SKTexture = SKTexture(noiseMap: noiseMap)
let tileDef = SKTileDefinition(texture: texture)
let tileGroup = SKTileGroup(tileDefinition: tileDef)
let tileSet = SKTileSet(tileGroups: [tileGroup])
// Create a tile map
let tileSize = CGSize(width: 32.0, height: 32.0)
let tileMap = SKTileMapNode(tileSet: tileSet, columns: 16, rows: 16, tileSize: tileSize)
// Fill the entire map with a tile group
tileMap.fill(with: tileGroup)
self.addChild(tileMap)
GKNoise returns [-1.0,1.0] 范围内的噪声。
您需要以某种有意义的方式将其映射到您的游戏中。一个简单的例子就是说 [-1.0,0.0] 之间的一切都是水,而 (0.0,1.0] 之间的一切都是陆地。
一旦你决定了这个映射是什么,只需在 GKNoiseMap 上使用 getValue() 对你想要填充的每个图块进行一次采样,然后使用你的规则来决定使用哪个图块。
最近的一篇文章提出了一种方法,说明了将 GKPerlinNoiseSource
映射到 SKTileMapNode
的方法。我认为这可能比已接受的答案更有用(尽管已接受的答案比本文早几年)。
请注意这篇文章在 Swift 5.2.