2017-10-15 101 views
0

我一直在墙上撞击我的头几个小时。我正尝试使用CIFilter修改我的应用程序中的纹理,然后将该新纹理作为新SKTileDefinition的一部分在我的地图上重新着色。 函数波纹管发现玩家“拥有”的图块,并尝试通过将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,然后将该tile组设置为特定的tile定义。但是,这导致瓷砖空白...

任何指针?

回答

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"