这一节我们主要来学习如何使用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+

本文为原创文章,转载请注明出处,欢迎访问作者网站(和而不同)

发表评论

error: Content is protected !!