2016-09-23 13 views
1

私は、新しいタイルマップノードをiOS 10で利用できるタイルマップを作成すると考えました。SpriteKit - すべてのタイルのTileDefinitionとuserDataを更新していますか?

タイルを立てれば、それは崩壊します。ですから、私は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と同じタイマー値を持っていますか?

質問には、個々のタイルuserDataに個別にアクセスする方法がありますか?

ありがとうございました。

答えて

1

sksファイルに追加するuserDataは、タイルのインスタンスごとではなく、マップ上で使用されるそのタイプのすべてのタイルに適用されます。 userData mountain:trueの山のタイルがある場合は、地図上に配置した各山のタイルがtrueを返します。 userDataをfalseに更新すると、すべてのマウンテンタイルはfalseになります。

各タイルは列と行のインデックスによって一意に識別されるため、タイマー情報を格納するタプルの配列のようなデータ構造を作成できます。

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

これは残念です。私はタイルセットタイマーからのデフォルトデータを保持する別の2次元配列をセットアップし、それを参照用に使用します。タイルが削除されたときに、複数のレイヤーを設定することも考えられます。ありがとう:) J – JohnnieMac

+0

@ JohnnieMacあなたが答えを受け入れることができれば、それは役に立ちます! –

+0

floorTimers = Array(繰り返し:Array(repeatElement(0.0、count:roomMap.numberOfRows))、カウント:roomMap.numberOfColumns)0の列の ... roomMap.numberOfColumns - 1 { 0の行... roomMap .nu​​mberOfRows - 1 { let timer = roomMap.tileDefinition(atColumn:column、row:row) let timer = objectTile?.userData?.value(forKey: "timer")には? Double { } floorTimers [列] [タイマー] } }}({[行] [列] = \(列)、\(行) – JohnnieMac

関連する問題