我以为我会用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?
先谢谢。
答案 0 :(得分:1)
您在sks
文件中添加的userData将应用于地图上使用的该类型的每个磁贴,而不是每个磁贴的实例,例如如果您有一个带有userData mountain:true
的山区图块,那么您放置在地图上的每个山区图块都将返回true。如果将userData更新为false,则所有山峰都将为false。
由于每个图块由列和行索引唯一标识,因此您可以创建一个数据结构,如元组数组来存储计时器信息;
var timerInfo:[(column: Int, row: Int, timer: Double)] = []