2016-09-23 4 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

실망입니다. tileset 타이머의 기본 데이터를 보유하고 참조 용으로 사용할 별도의 2 차원 배열을 설정합니다. 타일이 삭제 될 때 여러 레이어를 설정하는 아이디어 일 수도 있습니다. 제안 된대로 무너지는 효과를 보여줍니다. 감사합니다 :) J – JohnnieMac

+0

@ JohnnieMac 도움이된다면 대답을 수락 할 수 있습니다! –

+0

floorTimers = Array (반복 : 배열 (repeatElement (0.0, 개수 : roomMap.numberOfRows)), 개수 : roomMap.numberOfColumns) 0 열의 ... roomMap.numberOfColumns - 1 { 0의 행 ... roomMap .numberOfRows - 1 { let timer = objectTile? .userData? .value (forKey : "timer")를 다음과 같이하면 objectTile = roomMap.tileDefinition (atColumn : column, row : row) 하자. Double { } floorTimers [열] = 타이머 } } ("[행] [열] = \ (열), \ (행) – JohnnieMac