Go SDL2 游戏开发入门9-颜色调制
前言
我们可以使用颜色调制, 来动态地改变 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() }
- 这一节开始, 我们会把一些常用的结构进行封装, 这样可以更好的组织代码
- 这里我首先对 texture 进行了封装, 我原本是把它放到一个新的文件中去的, 但是为了更好的讲解, 我在这里还是放在一个文件中, 读者可以自行组织
- 首先 Texture 结构体内部仅仅封装一个 sdl.Texture 指针结构, 以及四个方法, 这四个方法的作用也很容易理解
- 然后把一些全局变量诸如 Gwindow 窗口, Grender 渲染器, Gtexture 结构都放在 init 函数中初始化好
- main 函数中首先定义一个 Rect 类型的 sprit, 作用就是我们想渲染的图片在 texture 中的方位
- 然后定义了 rgb 的初始值
- 主循环中根据读取的按键值来修改 rgb 值
- Gtexture.SetColorMod 函数修改 texture 的颜色
- 最后刷新