2016-12-27 24 views
3

私が取り組んでいるiOSゲーム用のタイルマップを作成しています。このマップは、島のトップダウンビューです。ほとんどのタイルは水ですが、いくつかは土地です。水のタイルは水を作り出すために再利用されますが、土地タイルは一度しか使われません。私はSKTileDefinition、SKTileGroup、SKTileGroupRule、SKTileSet、およびSKTileMapのためのドキュメントに目を通してきた、これは私が思い付いたものです:今プログラムでSpriteKit SKTileMapを作成する適切な方法は何ですか?

func createTileMap() { 
    let waterTile = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-1")) 
    let waterTileGroup = SKTileGroup(tileDefinition: waterTile) 

    let landTile64 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-64")) 
    let landTile63 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-63")) 
    let landTile56 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-56")) 
    let landTile55 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-55")) 
    let landTile54 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-54")) 
    let landTile53 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-53")) 
    let landTile48 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-48")) 
    let landTile47 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-47")) 
    let landTile46 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-46")) 
    let landTile45 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-45")) 
    let landTile44 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-44")) 
    let landTile43 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-43")) 
    let landTile40 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-40")) 
    let landTile39 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-39")) 
    let landTile37 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-37")) 
    let landTile36 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-36")) 
    let landTile35 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-35")) 
    let landTile34 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-34")) 
    let landTile31 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-31")) 
    let landTile30 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-30")) 
    let landTile27 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-27")) 
    let landTile26 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-26")) 
    let landTile25 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-25")) 
    let landTile23 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-23")) 
    let landTile22 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-22")) 
    let landTile21 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-21")) 
    let landTile20 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-20")) 
    let landTile18 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-18")) 
    let landTile17 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-17")) 
    let landTile13 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-13")) 
    let landTile12 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-12")) 
    let landTile11 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-11")) 
    let landTile3 = SKTileDefinition(texture: SKTexture(imageNamed: "map-tile-3")) 

    let landTileGroupRule = SKTileGroupRule(adjacency: .adjacencyAll, tileDefinitions: [landTile64, landTile63, landTile56, landTile55, landTile54, landTile53, landTile48, landTile47, landTile46, landTile45, landTile44, landTile43, landTile40, landTile39, landTile37, landTile36, landTile35, landTile34, landTile31, landTile30, landTile27, landTile26, landTile25, landTile23, landTile22, landTile21, landTile20, landTile18, landTile17, landTile13, landTile12, landTile11, landTile3]) 

    let landTileGroup = SKTileGroup(rules: [landTileGroupRule]) 

    let tileSet = SKTileSet(tileGroups: [waterTileGroup, landTileGroup], tileSetType: .grid) 

    tileMap = SKTileMapNode(tileSet: tileSet, columns: 8, rows: 8, tileSize: waterTile.size) 
    tileMap.fill(with: waterTileGroup) 

    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile64, forColumn: 7, row: 0) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile63, forColumn: 6, row: 0) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile56, forColumn: 7, row: 1) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile55, forColumn: 6, row: 1) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile54, forColumn: 5, row: 1) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile53, forColumn: 4, row: 1) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile48, forColumn: 7, row: 2) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile47, forColumn: 6, row: 2) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile46, forColumn: 5, row: 2) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile45, forColumn: 4, row: 2) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile44, forColumn: 3, row: 2) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile43, forColumn: 2, row: 2) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile40, forColumn: 7, row: 3) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile39, forColumn: 6, row: 3) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile37, forColumn: 4, row: 3) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile36, forColumn: 3, row: 3) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile35, forColumn: 2, row: 3) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile34, forColumn: 1, row: 3) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile31, forColumn: 6, row: 4) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile30, forColumn: 5, row: 4) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile27, forColumn: 2, row: 4) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile26, forColumn: 1, row: 4) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile25, forColumn: 0, row: 4) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile23, forColumn: 6, row: 5) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile22, forColumn: 5, row: 5) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile21, forColumn: 4, row: 5) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile20, forColumn: 3, row: 5) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile18, forColumn: 1, row: 5) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile17, forColumn: 0, row: 5) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile13, forColumn: 4, row: 6) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile12, forColumn: 3, row: 6) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile11, forColumn: 2, row: 6) 
    tileMap.setTileGroup(landTileGroup, andTileDefinition: landTile3, forColumn: 2, row: 7) 

    self.addChild(tileMap) 
} 

、これはかなりの規模のコードですが、私はどこ私ができることを確認していませんここから行く。私は各土地のタイルを読み込み、明示的に配置されていないタイルはウォータータイルであると明示します。私はこれにXcodeのGUIツールを使用しないようにして、完全にプログラムでマップを作成したいと思います。このコードは機能し、パフォーマンスが向上しました(最初はタイルを使用せずに地図画像全体をスクロールしていました)、これは非常に醜いものであり、「これを行うためのより簡潔な方法が必要です!私はここで何が欠けていますか?

+1

いくつかの 'for'ループはどうですか? :) – jtbandes

+0

@jtbandes、これは最初に気になる解決策ですが、各タイルの変数と各タイルの特定の行と列が必要なので、ループを作成する方法についてはわかりません。 – SpacemanDeMars

+1

なぜ各タイルに変数が必要ですか?それらを配列や辞書に保存できませんか? – jtbandes

答えて

5

特定の場所に配置するタイルを指定する列と行を持つテキストファイルでマップレイアウトを定義する方法があります。その後、同じシーンを使用しながら、各ゲームレベルに異なるマップを指定することが可能になります。この例では、SKTileSetが1つしかないと仮定し、背景を埋める洪水は必要ありません。

// Level1.txt 
01 01 01 01 01 01 63 64 
01 01 01 01 53 54 55 56 
01 01 43 44 45 46 47 48 
01 34 35 36 37 01 39 40 
25 26 27 01 01 30 31 01 
17 18 01 20 21 22 23 01 
01 01 11 12 13 01 01 01 
01 01 03 01 01 01 01 01 

各列と行に反復処理を行い、指定されたタイルを取得してsetTileGroupを呼び出します。

let path = Bundle.main.path(forResource: "Level1.txt", ofType: nil) 
do { 
    let fileContents = try String(contentsOfFile:path!, encoding: String.Encoding.utf8) 
    let lines = fileContents.components(separatedBy: "\n") 

    for row in 0..<lines.count { 
     let items = lines[row].components(separatedBy: " ") 

     for column in 0..<items.count { 
      let tile = tileMap.tileSet.tileGroups.first(where: {$0.name == "map-tile-" + items[column]}) 
      tileMap.setTileGroup(tile, forColumn: column, row: row) 
     } 
    } 
} catch { 
    print("Error loading map") 
} 

この例では、2番目のコードブロックが削除されています。 Xcode GUIツールを使用して少し妥協したい場合は、SKTileGroupsksというファイルとして作成することで、最初のコードブロックを削除することができます。

多くの機能を提供しているので、SKTileMapNodeを使用している場合、GUIツールの使用をお勧めします。

+2

これは良いことだと思います。可能であれば、すべてのXcode GUIツールの使用を避けようとしています。 – SpacemanDeMars

関連する問題