前言

我们可以使用颜色调制, 来动态地改变 texture 上渲染的图片的颜色

代码

package main

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

type Texture struct {
    *sdl.Texture
}

func (t *Texture) LoadFromFile(path string) bool {
    img, err := img.Load(path)
    if err != nil {
        panic(err)
    }
    t.Texture, err = Grender.CreateTextureFromSurface(img)
    if err != nil {
        panic(err)
    }
    img.Free()

    return true
}

func (t *Texture) Render(x, y int32, src *sdl.Rect) {
    dst := &sdl.Rect{X: x, Y: y, W: src.W, H: src.H}
    Grender.Copy(t.Texture, src, dst)
}

func (t *Texture) setColor(r, g, b uint8) {
    t.SetColorMod(r, g, b)
}

func (t *Texture) Free() {
    t.Texture.Destroy()
}

const (
    W = 670
    H = 620
)

var (
    Gwindow  *sdl.Window
    Grender  *sdl.Renderer
    Gtexture *Texture
)

func init() {
    sdl.Init(sdl.INIT_EVERYTHING)
    Gwindow, err := sdl.CreateWindow("test", sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED, W, H, sdl.WINDOW_SHOWN)
    if err != nil {
        panic(err)
    }
    Grender, err = sdl.CreateRenderer(Gwindow, -1, sdl.RENDERER_ACCELERATED)
    if err != nil {
        panic(err)
    }
    Grender.SetDrawColor(128, 128, 128, 255)
    Gtexture = &Texture{}
    Gtexture.LoadFromFile("../asserts/image/texture.png")
}

func main() {
    sprit := &sdl.Rect{707, 3, 26, 26}

    r := uint8(255)
    g := uint8(255)
    b := uint8(255)
    running := true
    for running {
        for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
            switch t := event.(type) {
            case *sdl.QuitEvent:
                println("Quit")
                running = false
                break
            case *sdl.KeyboardEvent:
                switch t.Keysym.Sym {
                case sdl.K_q:
                    r += 32
                case sdl.K_w:
                    g += 32
                case sdl.K_e:
                    b += 32
                case sdl.K_a:
                    r -= 32
                case sdl.K_s:
                    g -= 32
                case sdl.K_d:
                    b -= 32
                }
            }
        }
        Grender.Clear()
        Gtexture.SetColorMod(r, g, b)
        Gtexture.Render(0, 0, sprit)

        Grender.Present()
        sdl.Delay(16)
    }
    free()
}
func free() {
    Gtexture.Destroy()
    Grender.Destroy()
    Gwindow.Destroy()
    sdl.Quit()
}
  1. 这一节开始, 我们会把一些常用的结构进行封装, 这样可以更好的组织代码
  2. 这里我首先对 texture 进行了封装, 我原本是把它放到一个新的文件中去的, 但是为了更好的讲解, 我在这里还是放在一个文件中, 读者可以自行组织
  3. 首先 Texture 结构体内部仅仅封装一个 sdl.Texture 指针结构, 以及四个方法, 这四个方法的作用也很容易理解
  4. 然后把一些全局变量诸如 Gwindow 窗口, Grender 渲染器, Gtexture 结构都放在 init 函数中初始化好
  5. main 函数中首先定义一个 Rect 类型的 sprit, 作用就是我们想渲染的图片在 texture 中的方位
  6. 然后定义了 rgb 的初始值
  7. 主循环中根据读取的按键值来修改 rgb 值
  8. Gtexture.SetColorMod 函数修改 texture 的颜色
  9. 最后刷新

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