2017-10-15 6 views
0

저는 몇 시간 동안 벽에 머리를 때려 왔습니다. CIFilter를 사용하여 응용 프로그램 내부의 텍스처를 수정하고 새 텍스처를 새 SKTileDefinition의 일부로 사용하여 맵에서 타일을 다시 칠하려고합니다. 벨로우 기능은 플레이어가 소유 한 타일을 찾아 SKTileDefinition을 coloredDefinition으로 변경하여 타일을 다시 채 웁니다. colorizeTile프로그래밍 방식으로 SKTileDefinition 만들기

func colorizeTile(tile: SKTileDefinition, into color: UIColor) -> SKTileDefinition{ 
     let texture = tile.textures[0] 

     let colorationFilter = CIFilter(name: "CIColorMonochrome") 
     colorationFilter!.setValue(CIImage(cgImage: texture.cgImage()), forKey: kCIInputImageKey) 
     colorationFilter!.setValue(CIColor(cgColor: color.cgColor), forKey: "inputColor") 
     colorationFilter!.setValue(0.25, forKey: "inputIntensity") 
     let coloredTexture = texture.applying(colorationFilter!) 

     let newDefinition = SKTileDefinition(texture: texture) 
     newDefinition.textures[0] = coloredTexture 
     newDefinition.name = "meow" 

     return newDefinition 
    } 

나는 내가 할 노력하고 있어요처럼 나는 tileDefinition을 변경할 수없는 이유를 알아내는 어떤 도움을 사랑하는 것 : 여기

func updateMapTileColoration(for players: Array<Player>){ 
    for player in players { 
     for row in 0..<mainBoardMap!.numberOfRows { 
      for col in 0..<mainBoardMap!.numberOfColumns { 
       let rowReal = mainBoardMap!.numberOfRows - 1 - row 
       if player.crownLocations!.contains(CGPoint(x: row, y: col)) { 
        if let tile = mainBoardMap!.tileDefinition(atColumn: col, row: rowReal) { 
         let coloredDefinition = colorizeTile(tile: tile, into: player.color!) 
         print(coloredDefinition.name) 
         mainBoardMap!.tileSet.tileGroups[4].rules[0].tileDefinitions.append(coloredDefinition) 
         mainBoardMap!.setTileGroup(crownGroup!, andTileDefinition: crownGroup!.rules[0].tileDefinitions[1], forColumn: col, row: rowReal) 
        } 
       } 
      } 
     } 
    } 

그리고

는 actulaly CIFilter을 적용하는 기능입니다. 새로운 TileDefinition을 정의하여 tileGroup에 추가 한 다음 타일 그룹을 특정 타일 정의로 설정할 수 있다는 것이 직관적으로 정확합니다. 그러나 이것은 빈 타일로 이어지고 있습니다 ...

모든 포인터?

답변

0

나는 여러 가지를 시도한 후에 마침내 잘못된 점을 알아 냈습니다. 필자는 실제로 새로운 텍스처를 그리지 않았으므로 타일 정의가 올바르게 작성되지 않았습니다. 내가 배운 것처럼, CIImage은 그려진 텍스처가 아니라 그냥 레시피이며 텍스처를 그리는 데 필요한 컨텍스트가 필요합니다. 이 변경 후 SKTileDefinition이 올바르게 생성됩니다. 문제는 그것이 내가 그렇게 생각했기 때문에 나는 그 질문에 대한 답을 찾는 초침이었다. SKTileDefinition을 만드는 내 방법이 정확했습니다.

if drawContext == nil{ 
     drawContext = CIContext() 
    } 

    let texture = tile.textures[0] 

    let colorationFilter = CIFilter(name: "CIColorMonochrome") 
    colorationFilter!.setValue(CIImage(cgImage: texture.cgImage()), forKey: kCIInputImageKey) 
    colorationFilter!.setValue(CIColor(cgColor: color.cgColor), forKey: "inputColor") 
    colorationFilter!.setValue(0.75, forKey: "inputIntensity") 

    let result = colorationFilter!.outputImage! 
    let output = drawContext!.createCGImage(result, from: result.extent) 
    let coloredTexture = SKTexture(cgImage: output!) 

    let newDefinition = SKTileDefinition(texture: texture) 
    newDefinition.textures[0] = coloredTexture 
    newDefinition.name = "meow" 
관련 문제