Программно редактировать SKTileMapNode - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь создать ландшафт для своей игры с помощью двухслойных узлов SKTileMapNode: слоя base (земля, вода и т. Д.) И слоя main (здания, игроки, стены), где основным слоем является поверх базового слоя. Вот мой код GameScene.swift:

import SpriteKit
import GameplayKit

class GameScene: SKScene {

    var map:SKTileMapNode!
    var base:SKTileMapNode!
    var tileSet:SKTileSet!
    var ground:SKTileGroup!
    var wall:SKTileGroup!
    var cam:SKCameraNode?
    var viewController:GameViewController!

    override func didMove(to view: SKView) {
        tileSet = SKTileSet(named: "Tiles")

        ground = tileSet.tileGroups.first{$0.name == "Ground"}
        wall = tileSet.tileGroups.first{$0.name == "Wall"}

        map = SKTileMapNode(tileSet: tileSet, columns: 20, rows: 20, tileSize: CGSize(width:64, height:32))
        base = SKTileMapNode(tileSet: tileSet, columns: 20, rows: 20, tileSize: CGSize(width:64, height:32))
        base.fill(with:ground)
        self.addChild(base)
        base.addChild(map)

        cam = SKCameraNode()
        self.camera = cam
        self.addChild(cam!)
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        for i in 0...9 {
            for j in 0...9 {
                set(i,j,wall)
            }
        }
    }

    func set(_ x:Int,_ y:Int,_ t:SKTileGroup){
        map.setTileGroup(t, forColumn: x, row: y)
    }

    override func update(_ currentTime: TimeInterval) {
    }
}

Код внутри блока touchesEnded предназначен только для тестирования, заполнив область 10x10 настенными плитками. Однако когда этот код запускается, ничего не происходит. Используя операторы печати, я обнаружил, что tileGroup каждой плитки изменяется только в рамках метода set, и map остается неизменным вне этого метода.

Я что-то упустил с глобальными / локальными переменными. или это другая проблема? Я относительно новичок в программировании на swift и iOS, поэтому я прошу прощения, если это простой вопрос, но я не смог найти никакого ответа онлайн. Я ценю любую помощь, которую я могу получить. Спасибо!

...