SpriteKit - TileDefinition和userData正在更新所有瓷砖?

时间:2016-09-23 16:51:01

标签: swift sprite-kit ios10 sktilemapnode

我以为我会用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相同的计时器值?

所以问题是,有没有办法单独访问每个tile userData?

先谢谢。

1 个答案:

答案 0 :(得分:1)

您在sks文件中添加的userData将应用于地图上使用的该类型的每个磁贴,而不是每个磁贴的实例,例如如果您有一个带有userData mountain:true的山区图块,那么您放置在地图上的每个山区图块都将返回true。如果将userData更新为false,则所有山峰都将为false。

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

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