前言

动画就是显示一组图片来创造一个移动的错觉 在 SDL 中就是把 texture 中的不同部分, 一帧一帧的循环显示就可以了

代码

package main

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

type Texture struct {
    t *sdl.Texture
}

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

    return true
}

func (this *Texture) Render(src *sdl.Rect, dst *sdl.Rect) {
    Grender.Copy(this.t, src, dst)
}

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

func (this *Texture) SetAlpha(a uint8) {
    this.t.SetAlphaMod(a)
}

func (this *Texture) SetBlendMode(blend sdl.BlendMode) {
    this.t.SetBlendMode(blend)
}

func (this *Texture) Free() {
    this.t.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() {
    sprits := [2]*sdl.Rect{}
    sprits[0] = &sdl.Rect{643, 3, 26, 26}
    sprits[1] = &sdl.Rect{643, 35, 26, 26}
    frame := 0

    running := true
    for running {
        for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
            switch event.(type) {
            case *sdl.QuitEvent:
                println("Quit")
                running = false
                break
            }
        }
        Grender.Clear()
        dst := &sdl.Rect{X: 0, Y: 0, W: 40, H: 40}

        Gtexture.Render(sprits[frame], dst)
        if frame == 0 {
            frame = 1
        } else {
            frame = 0
        }

        Grender.Present()
        sdl.Delay(16)
    }
    free()
}

func free() {
    Gtexture.Free()
    Grender.Destroy()
    Gwindow.Destroy()
    sdl.Quit()
}
  1. 这里主要是 main 函数的修改, 首先定义一个 sprits 数组, 分别表示两张图的坐标位置
  2. 然后定义一个 frame 计数, 表示某一时刻索引 sprites 中的哪一张图
  3. 然后随着主循环不断的修改 frame 值, 画面上就会循环播放 sprites, 我们看到的就是一个动图的样子了
  4. 最后需要你自己思考的是, 怎么样去控制动画的速度, 不要看起来过快或者过慢

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