Korok 是一个用 Golang 实现的组件化 2D 游戏引擎,引擎的安装和基本使用见:korok.io. 这一系列教程会教会你创建一个简单的 FlappyBird 游戏(需要一定的游戏基础和Go语言知识),最终的效果如下:

flappybird
本篇为这一系列的第一篇。你会学会:
如何创建一个场景
如何添加精灵
如何制作精灵动画
建立一个 Korok 工程
创建工程, Korok 的工程结构非常简单.
tmp tree flappybird flappybird├── assets└── main.go
实现一个场景,并且设为默认场景
// main.gotype StartScene struct {}
func (sn *StartScene) OnEnter(g *game.Game) {
}
func (sn *StartScene) Update(dt float32) { // draw something}
func (sn *StartScene) OnExit() {
}func main() {
options := korok.Options{
Title:"Flappy Bird",
Width:320,
Height:480,
}
korok.Run(&options, &StartScene{})
}在 main.go 中添加上述代码,StartScene 实现了 Scene 接口,它有三个生 命周期方法,main() 方法是游戏的入口,我们在这里调用了 korok.Run() 并传入了窗口参数和默认的场景。
在当前目录下运行
go run main.go你会得到下面的窗口.
empty
这是一个空白的窗口,因为我们还没有添加任何可视化的元素。
添加精灵 - Flappy Bird
加载素材
首先我们需要一些游戏素材,这些素材我们已经准备好了,你可以在 这里 这里复制一份放到 assets 目录下。接下来我们会在代码中使用这些素材。此时的目录结构如下:
. ├── assets│ ├── fonts│ │ ├── Marker\ Felt.ttf│ │ ├── futura-48.fnt│ │ └── futura-48.png│ ├── images│ │ ├── bird.json│ │ └── bird.png│ └── sound│ ├── collision.ogg│ ├── drop.ogg│ ├── point.ogg│ ├── rise.ogg│ └── swooshing.ogg└── main.go
这里新加了三个目录,分别是字体、纹理和声音素材。目前位置我们只会使用到 images 下面的纹理素材,这是一个纹理图集。我们可以使用 assets 提供的方法把纹理加载到引擎中。首先我们要实现一个 Load 方法:
func (sn *StartScene) Load() {
asset.Texture.LoadAtlas("images/bird.png", "images/bird.json")
}Load() 方法实现了 Loader 接口,它适合做一些比较重的资源加载任务。接下来可以在 OnEnter 方法里使用这些已经加载的资源。
注意:
asset.Texture.LoadAtlas方法加载的是一个纹理图集,纹理图集通常是把多张图片打包在一张大的图片中,并通过一个描述文件来描述每个子图片的位置。使用纹理图集可以显著的减少 DrawCall 提高游戏的性能。
添加精灵
在 OnEnter 方法中添加如下代码:
// get textue
at, _ := asset.Texture.Atlas("images/bird.png")
bird1, _ := at.GetByName("bird1.png")
// setup bird
bird := korok.Entity.New()
spr := korok.Sprite.NewCompX(bird, bird1)
spr.SetSize(48, 32)
xf := korok.Transform.NewComp(bird)
xf.SetPosition(f32.Vec2{160, 240})这段代码分为两部分,前面部分加载了之前的纹理图集,并从中找出了 "bird1.png" 这张图片。接下来新建了一个 Entity,并给它添加了 SpriteComp 和 Transform 组件,Transform 组件赋予了这个 Entity 在游戏世界中的位置,SpriteComp 让这个 Entity 可以绘制出来。
注意:如果不熟悉 Entity/Component 的概念, 务必阅读 Scene、Entity and Component 这篇基础概念的说明文档。
现在我们运行:go run main.go ,如果没有其它错误的话,他会是这样:

a single static bird
接下来我们采用类似的方法,添加其它元素,比如游戏背景和地面。
at, _ := asset.Texture.Atlas("images/bird.png")
bg, _ := at.GetByName("background.png")
tt, _ := at.GetByName("game_name.png")
ground, _ := at.GetByName("ground.png") // setup bg
{
entity := korok.Entity.New()
spr := korok.Sprite.NewCompX(entity, bg)
spr.SetSize(320, 480)
xf := korok.Transform.NewComp(entity)
xf.SetPosition( f32.Vec2{160, 240})
sn.bg = entity
} // setup ground {840 281}
{
entity := korok.Entity.New()
spr := korok.Sprite.NewCompX(entity, ground)
spr.SetSize(420, 140)
spr.SetGravity(0, 1)
spr.SetZOrder(1)
xf := korok.Transform.NewComp(entity)
xf.SetPosition(f32.Vec2{0, 100})
sn.ground = entity
}需要注意的是,背景是绘制在最后面一层的,地面是绘制在前面一层的,小鸟是最最前面的一层,所以我们需要给他们设置不同的 z-order, z-order 越大越会绘制到前面,需要再设置 spr.SetZOrder(2) 这样让鸟绘制在最前面。
再次运行, 会得到一个接近完成的版本:

bird with background
让鸟动起来
目前为止我们添加的都是静态的元素,为了让小鸟动起来,需要使用精灵动画系统,这个系统简单,只需要几行代码。精灵动画一般是有几帧连续的静态图片组成的,连续播放这组静态图片会产生动画的效果。在纹理图集中,已经准备好了三张静态图片:

sprite animation images
接下来我们要创建一个动画序列,这个动画序列由上面的三张图片组成:
// flying animation
bird1, _ := at.GetByName("bird1.png")
bird2, _ := at.GetByName("bird2.png")
bird3, _ := at.GetByName("bird3.png")
frames := []gfx.Tex2D{bird1, bird2, bird3}
g.AnimationSystem.SpriteEngine.NewAnimation("flying", frames, true)然后我们需要给当前的 Entity 添加一个 FlipbookComp 组件,这个组件可以让我们的 bird-Entity 不停的播放上面的动画序列以产生动画效果:
// play animation
anim := korok.Flipbook.NewComp(sn.bird)
anim.SetRate(.1)
anim.Play("flying")此处添加了一个 FlipbookComp 组件,并设置播放间隔为 0.1 秒,这意味着每过 100ms 会播放一帧动画。然后调用 Play() 方法,传入要播放的动画的名字,再次运行:

final bird
总结
以上就是本篇的内容,我们从创建一个空的工程开始,到实现背景/前景和一个会飞的小鸟。代码我已经传到 GitHub - ntop001/flappybird. 下一篇我们会实现菜单和小鸟的物理模拟。
作者:ntop
链接:https://www.jianshu.com/p/035084f18cec

随时随地看视频