Go语言GUI编程包-Ebiten文章目录Go语言GUI编程包-Ebiten1.前言2. Ebiten库介绍3 .在-Ebiten窗口中显示文本4 .在-Ebiten窗口中显示图像4
1 .前言
最近,遇到了用鼠标选择图像区域,对选择的区域进行图像处理的主题。 图像处理很容易说,调用opencv的库函数即可。 重要的是用鼠标选择图像区域,这关系到GUI编程,所以让我们来了解一下Go语言的GUI编程的使用方法。
o语言没有官方GUI软件包,但有很多第三方GUI软件包,如walk。 但是,此软件包只能在Windows上使用,不能跨平台。 我在Linux系统上放弃了选择这个包。
因为在网上又听说了一个叫fyne的包,所以我调查了用fyne监听鼠标事件的方法。 于是,在Github上提出了issue。 使用fyne监听鼠标事件似乎很麻烦,我放弃了使用fyne,但提问者提到了一个名为Ebiten的库。
我看了Ebiten库中的方法,基本上显示图像,拦截事件,感觉很好,打算用它。
因此,这里也介绍一些Ebiten库的简单使用方法。 例如,在窗口中输出字符,在窗口中显示图像,监听鼠标事件。
2. Ebiten库介绍Ebiten官网: https://ebiten.org/
Ebiten官方API文档: https://pkg.go.dev/github.com/hajime hoshi/ebit en
Ebiten是一个使用Go语言的编程库,用于二维游戏开发,可以跨平台。
3. Ebiten在窗口中显示文字不是胡说八道,而是直接去简单的Demo。 功能是弹出窗口,输出Hello,World。
包管理import (‘ fmt ‘ ‘ log ‘ ‘ github.com/hajime hoshi/ebit en ‘ ‘ github.com/hajime hoshi/ebitenutil */type 也就是说,调用Update函数一次的更新周期为1/60秒。 也就是说,每秒更新*/func(g*game ) Update (错误{返回Nil }/* draw ) 60次来渲染界面。 此外,称为自动调用函数的函数的自动调用频率也是屏幕显示在GUI窗口中的对象,就像计算机显示器的刷新频率一样,这里是*/func(g*game ) DDD ‘ (}/*Layout ) )函数的返回值表示显示窗口中逻辑屏幕的大小。 在官网上,参数outsideWidth和outsideHeight是桌面上显示的窗口大小,这里是固定大小640*480*/func(g*game ) layout(outsidewidth和screenHeight int ) return 640,480 } func main ((/集窗口大小为640 * 480 ebit en.setwindowsizing//游戏if err :=ebit en.) err!=nil{log.fatal(err ) }效果如下图所示。
上面的代码注释部分描述了每个函数的作用,但使用Ebiten时,格式相同。 它们都需要创建Game结构、Update (函数,Draw )和Layout (布局)函数,并在主函数中启动游戏。
4 .在Ebiten窗口中显示图像的Ebiten包提供了用于显示图像的函数,如下所示:
简要介绍func(I*image ) drawimage(img*image,options * drawimage选项) error参数。
img *Image:展示的影像option *DrawImageOption:展示选项,例如影像位置,4.1不要直接设定展示影像,例如我会显示以下影像:
当然,直接进入示例,将上面示例中的输出Hello,World中的Draw )函数替换为:
导入func(g*game ) draw(screen*ebiten.image ) )/1 .图像文件f,err:=OS.open(gopher.png ‘ ) if err!=nil{log.fatal(err ) }img,err :=png.Decode(f ) f ) if err!=将=nil{log.fatal(err ) }//image文件转换为ebiten.Image文件,
用于展示eImg := ebiten.NewImageFromImage(img)// 在屏幕上展示出图片screen.DrawImage(eImg, nil)}
显示效果如下图:
4.1 指定位置展示图片
比如我一个图片要放在屏幕的某个位置,怎样指定坐标呢?
还是使用DrawImage()函数
func (i *Image) DrawImage(img *Image, options *DrawImageOptions) error
但是此时需要指定第二个参数,比如我要把图片显示在窗口的(100,100)坐标处:
func (g *Game) Draw(screen *ebiten.Image) {// 1. 读取图片文件f, err := os.Open(“gopher.png”)if err != nil {log.Fatal(err)}img, err := png.Decode(f)if err != nil {log.Fatal(err)}// 把Image文件转成ebiten.Image文件,用于展示eImg := ebiten.NewImageFromImage(img)op := &ebiten.DrawImageOptions{}op.GeoM.Translate(float64(100), float64(100))// 在屏幕上展示出图片screen.DrawImage(eImg, op)}
显示效果:
5. Ebiten监听鼠标事件
监听鼠标事件,这里使用一个简单的例子,刚开始是显示图片的,按下左键,图片消失,松开左键,图片显示。
再次只需更改一下Draw()函数即可:
var flag boolfunc (g *Game) Draw(screen *ebiten.Image) {// flag一开始默认是false,会显示图片if !flag {screen.DrawImage(eImg, nil)} else {screen.Clear()}// 监听鼠标事件,如果左键按下,false变成true,图片就会删除if inpututil.IsMouseButtonJustPressed(ebiten.MouseButtonLeft) {flag = !flag}// 监听鼠标左键松开事件if inpututil.IsMouseButtonJustReleased(ebiten.MouseButtonLeft) {flag = !flag}}
演示效果如下gif动图所示:
6. 其他
ebiten还有很多功能,我没有提到,主要也就是几个函数的调用,可以自己去查询官方API文档:https://pkg.go.dev/github.com/hajimehoshi/ebiten 。
但是ebiten库还有个问题,就是我在演示输出Hello, World时候,是用的ebitenutil.DebugPrint(screen, “Hello, World!”),根据函数名称可以知道,这是用来debug输出的,并不是专门用于显示文字的函数。
但是如何显示文字呢?比如更改显示文字的颜色、大小等?
但这个需求还真不好实现,这个问题有人在github上也提出了issue: https://github.com/hajimehoshi/ebiten/issues/280 :
作者表示,ebiten库的设计原则是,万物皆Image,因此想要输出特定的文字,需要制作一张带有文字的Image,然后放到窗口中显示出来。。。