SpriteKit - 正在为所有图块更新 TileDefinition 和 userData?

SpriteKit - TileDefinition and userData being update for all tiles?

我想我会使用 iOS 10 中可用的新 Tile Map Nodes 创建一个 tile map。

我有一块瓷砖,如果你站在上面,它就会碎裂。所以我虽然会在 tileGroup 定义中放置一个名为 timer 的 userData 字段。

    func crumbleTile(pos :CGPoint, dt : TimeInterval){
    let column = roomMap.tileColumnIndex(fromPosition: pos)
    let row = roomMap.tileRowIndex(fromPosition: pos)

    let objectTile = roomMap.tileDefinition(atColumn: column  , row: row)

    if var timer = objectTile?.userData?.value(forKey: "timer") as? Double {
        print("tile pos \(column),\(row)")
        print("timer-from tile:\(timer)")
                    timer = timer - dt
        objectTile?.userData?.setValue(timer, forKey: "timer")
        print("timer-update tile:\(timer)")
        if timer < 0.0 {
            //move to next frame
            if var crumbleFrame = objectTile?.userData?.value(forKey: "crumble") as? Int {

                crumbleFrame = crumbleFrame - 1
                print("crumble:\(crumbleFrame)")
                objectTile?.userData?.setValue(crumbleFrame, forKey: "crumble")

                if crumbleFrame < 1 {
                    //delete tile
                    print("delete tile")
                    removeTile(pos: pos)
                } else {
                    //move to next frame
                    print("next frame")

                    if crumbleFrame == 2 {
                        print("change frame 2")


                    }
                    if crumbleFrame == 1 {
                        print("change frame 1")


                    }
                    if crumbleFrame == 0 {
                        print("change frame 0")


                    }
                }


            }

        }


    }

}
func removeTile(pos : CGPoint) {
    let column = roomMap.tileColumnIndex(fromPosition: pos)
    let row = roomMap.tileRowIndex(fromPosition: pos)
             roomMap.setTileGroup(nil, forColumn: column, row: row)
}

似乎我不是在调整单个计时器,而是在调整每个块的每个计时器,而不是每个块都有自己的计时器设置。

在日志文件中可以看到

tile pos 51,11
timer-from tile:-0.104295339999993
timer-update tile:-0.125737270999991
crumble:-1
delete tile
2:crumble floor right
tile pos 52,11
timer-from tile:-0.125737270999991
timer-update tile:-0.164520885999991
crumble:-2
delete tile

位置 52,11 的图块与 52,11 的计时器值相同?

所以问题是,有没有办法单独访问每个磁贴用户数据?

提前致谢。

您在 sks 文件中添加的 userData 应用于地图上使用的该类型的每个图块,而不是图块的每个实例,例如如果您有一个包含 userData mountain:true 的山地板块,那么您放置在地图上的每个山地板块都将 return 为真。如果您将 userData 更新为 false,则所有山地砖块都将是 false。

由于每个图块都由列索引和行索引唯一标识,因此您可以创建一个数据结构(如元组数组)来存储计时器信息;

var timerInfo:[(column: Int, row: Int, timer: Double)] = []