用Go写一个中国象棋(二)| Ebiten运行窗口
这一节我们主要来学习如何使用Ebiten打开一个窗口。
main.go
在ChineseChess目录下面新建main.go文件,定义程序入口:
package main
func main() {
}
这个main函数就是Go程序的入口。
然后新建一个目录chess,存放所有代码。
Game类
在chess目录下面新建game.go文件,打开game.go。
定义一个Game结构体,这是Ebiten提供的结构体,:
package chess
//Game 象棋窗口
type Game struct {
}
//NewGame 创建象棋程序
func NewGame() bool {
game := &Game{
}
if game == nil {
return false
}
ebiten.SetWindowSize(520, 576)
ebiten.SetWindowTitle("中国象棋")
if err := ebiten.RunGame(game); err != nil {
log.Fatal(err)
return false
}
return true
}
SetWindowSize是设置窗口大小。
SetWindowTitle是设置窗口标题。
RunGame就是运行监听Game,程序会不断调用Update接口,监听各种事件的发生。
然后需要定义并实现Update和Layout接口:
//Update 更新状态,1秒60帧
func (g *Game) Update(screen *ebiten.Image) error {
return nil
}
//Layout 布局采用外部尺寸(例如,窗口尺寸)并返回(逻辑)屏幕尺寸,如果不使用外部尺寸,只需返回固定尺寸即可。
func (g *Game) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) {
return 520, 576
}
Update函数是用来更新游戏状态,例如键盘鼠标的输入、分数的显示等,这个函数默认每秒会调用60次。
Layout函数是用来设置布局的尺寸(例如,窗口尺寸),如果不使用外部尺寸,只需返回固定尺寸即可。我们这里返回固定尺寸就可以了。
加载图片资源
游戏会用到很多图片资源,在Ebiten中,可以直接通过函数NewImageFromFile来加载,也可以把图片资源转化成[]byte数组来加载,这个留到下一节再讲,这一节主要是为了展示如何用Ebiten运行一个窗口。
有了资源数据,就可以在Update函数中把棋盘加载进来,代码如下:
func (g *Game) Update(screen *ebiten.Image) error {
img, _, err := ebitenutil.NewImageFromFile("./res/ChessBoard.png", ebiten.FilterDefault)
if err != nil {
log.Print(err)
return err
}
op := &ebiten.DrawImageOptions{}
screen.DrawImage(img, op)
return nil
}
运行窗口
接下来在main函数中,调用NewGame接口,保存之后,VSCode会自动把对应的包引用加进来:
package main
import "ChineseChess/chess"
func main() {
chess.NewGame()
}
按下F5运行,就可以看到中国象棋的窗口啦!
在下一节中,我们将学习Ebtien的另一种加载资源的方式,也是官方推荐的方式。
2+