前言

SDL2 的教程上说这一节叫 color keying, 实在不懂这是什么意思
百度了一下说是抠图, 我实在是对应不上这两个词
通俗的解释一下吧, 就是比如你有一张图, 你想把背景色去掉, 那这个时候你就可以使用 color keying

代码

package main

import (
    "github.com/veandco/go-sdl2/img"
    "github.com/veandco/go-sdl2/sdl"
)

const (
    W = 670
    H = 620
)

func main() {
    sdl.Init(sdl.INIT_EVERYTHING)
    defer sdl.Quit()

    window, _ := sdl.CreateWindow("test", sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED,
        W, H, sdl.WINDOW_SHOWN)
    defer window.Destroy()

    renderer, _ := sdl.CreateRenderer(window, -1, sdl.RENDERER_ACCELERATED)
    defer renderer.Destroy()
    renderer.SetDrawColor(128, 128, 128, 255)

    backImage, _ := img.Load("../asserts/image/background.png")
    backTexture, _ := renderer.CreateTextureFromSurface(backImage)
    backImage.Free()
    defer backTexture.Destroy()

    fooImage, _ := img.Load("../asserts/image/foo.png")
    //最重要的一行
    fooImage.SetColorKey(true, sdl.MapRGB(fooImage.Format, 0, 255, 255))
    fooTexture, _ := renderer.CreateTextureFromSurface(fooImage)
    fooImage.Free()
    defer fooTexture.Destroy()
    running := true
    for running {
        for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
            switch event.(type) {
            case *sdl.QuitEvent:
                println("Quit")
                running = false
                break
            }
        }
        renderer.Clear()

        renderer.Copy(backTexture, nil, nil)

        dst := sdl.Rect{300, 300, 100, 100}
        renderer.Copy(fooTexture, nil, &dst)

        renderer.Present()
        sdl.Delay(16)
    }
}
  1. 这段代码很好理解呀, 就是渲染两张图片
  2. 最终要的一段代码就是 fooImage.SetColorKey 这个函数, 他的目的就是把 foo.png 这张图的背景色去掉
  3. 第 1 个参数要设置成 true, 第 2 个参数是一个 RGB 值, 这个值就是你想抠掉的颜色的 RGB 值
  4. 就这样咯

源码 https://gitee.com/fcsvr/tank.git