2017-10-15 20 views
0

私は何時間も壁に頭を打ちました。私はCIFilterを使ってアプリケーション内のテクスチャを修正し、その新しいテクスチャを新しいSKTileDefinitionの一部として使用してマップ上のタイルを再描画しようとしています。 関数bellowは、プレーヤーが所有するタイルを見つけ、SKTileDefinitionをcoloredDefinitionに変更することによってそれらを再描画しようとします。プログラマチックにSKTileDefinitionを作成する

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を適用する関数です:colorizeTile

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を変更することはできません理由を考え出すで任意のヘルプを大好きです。新しい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" 
関連する問題