Go SDL2 游戏开发入门11-动画初步
前言
动画就是显示一组图片来创造一个移动的错觉 在 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() }
- 这里主要是 main 函数的修改, 首先定义一个 sprits 数组, 分别表示两张图的坐标位置
- 然后定义一个 frame 计数, 表示某一时刻索引 sprites 中的哪一张图
- 然后随着主循环不断的修改 frame 值, 画面上就会循环播放 sprites, 我们看到的就是一个动图的样子了
- 最后需要你自己思考的是, 怎么样去控制动画的速度, 不要看起来过快或者过慢