前言

SDL2 宣称加入了新的渲染技术, 就是基于硬件加速的 texture 渲染, 我也不知道这个 texture 指的是什么, 不妨猜一猜, 应该是纹理图片吧
我们这里不纠结 SDL 的具体技术啦, 直接上 Go 代码

代码

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)

    pngImage, _ := img.Load("../asserts/image/texture.png")

    texture, _ := renderer.CreateTextureFromSurface(pngImage)
    pngImage.Free()
    defer texture.Destroy()

    src := sdl.Rect{0, 0, 200, 200}
    dst := sdl.Rect{0, 0, W, H}

    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(texture, &src, &dst)
        renderer.Present()
        sdl.Delay(16)
    }
}
  1. 首先我们还是先创建一个窗口 window, 长为 W, 宽为 H
  2. 然后我们在窗口上创建一个渲染器, 函数为 CreateRenderer, 第 1 个参数就是指向某个具体的窗口, 后两个参数先不管
  3. SetDrawColor, 先设置渲染器的初始颜色, 参数是 RGBA 的值
  4. Load 加载图片, 很熟了
  5. CreateTextureFromSurface 根据 surface 创建一个 texture
  6. 创建完之后就可以把 surface 释放掉
  7. 设置两个矩形块 src 和 dst, src 是取 texture 的范围, dst 是将 texture 渲染到窗口上的位置和范围
  8. 主循环中首先 renderer.Clear 先渲染成上一次设置的颜色, 然后 renderer.Copy 把 texture 放置到具体的位置, 再 renderer.Present 刷新即可

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