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)] = []
我想我会使用 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)] = []