SpriteKit - TileDefinition и userData обновляются для всех плиток?

Я думал, что создам карту листов с новыми узлами карты листов, доступными в iOS 10.

У меня есть плитка, которая, если вы встанете на нее, будет крошиться. Поэтому я решил разместить поле userData под названием timer в определении tileGroup.

    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?

Таким образом, вопрос заключается в том, есть ли способ индивидуального доступа к каждой плитки пользовательских данных?

Заранее спасибо.

1 ответ

Решение

Данные пользователя, которые вы добавляете в sks файл применяется ко всем плиткам этого типа, используемым на карте, а не к экземпляру плитки, например, если у вас есть горная плитка с userData mountain:true тогда каждая горная плитка, которую вы поместите на карту, вернет true. Если вы обновите userData до false, то все горные плитки будут ложными.

Поскольку каждая плитка уникально идентифицируется по индексу столбцов и строк, вы можете создать структуру данных, такую ​​как массив кортежей, для хранения информации таймера;

var timerInfo:[(column: Int, row: Int, timer: Double)] = []
Другие вопросы по тегам