打包资源

运用file2byteslice包咱们能够将图片和config.json文件打包进二进制程序中,之后编译生成一个二进制程序。然后复制这一个文件即可,不用再复制图片和其他配置文件了。

golang有许多第三方包能够将打包资源,原理其实很简略——读取资源文件的内容,然后生成一个go文件,在这个文件中创建一个变量保存这个文件的二进制内容。

咱们将运用ebiten作者编写的file2byteslice包。首先运用go install指令装置它:

$ go install github.com/hajimehoshi/file2byteslice

file2byteslice的指令格式如下:

$ file2byteslice -input INPUT_FILE -output OUTPUT_FILE -package PACKAGE_NAME -var VARIABLE_NAME

故咱们能够这样来打包文件:

$ file2byteslice -input ../images/ship.png -output resources/ship.go -package resources -var ShipPng
$ file2byteslice -input ../images/alien.png -output resources/alien.go -package resources -var AlienPng
$ file2byteslice -input config.json -output resources/config.go -package resources -var ConfigJson

生成文件如下:

一起用Go写一个小游戏(下)
一起用Go写一个小游戏(下)
一起用Go写一个小游戏(下)

相应的加载这些文件的代码需求相应的修改:

// alien.go
func NewAlien(cfg *Config) *Alien {
  img, _, err := ebitenutil.NewImageFromReader(bytes.NewReader(resources.AlienPng))
  if err != nil {
    log.Fatal(err)
  }
  // ...
}
// ship.go
func NewShip(screenWidth, screenHeight int) *Ship {
  img, _, err := ebitenutil.NewImageFromReader(bytes.NewReader(resources.ShipPng))
  if err != nil {
    log.Fatal(err)
  }
  // ...
}
// config.go
func loadConfig() *Config {
  var cfg Config
  if err := json.NewDecoder(bytes.NewReader(resources.ConfigJson)).Decode(&cfg); err != nil {
    log.Fatalf("json.Decode failed: %v\n", err)
  }
  return &cfg
}

然后,咱们就能够编译成一个游戏二进制程序随意复制到其他电脑上运转了:

$ go build -o alien_invasion

go generate

前面先装置file2byteslice程序,然后一个指令一个指令地履行打包,操作起来很是繁琐。假如有文件修改,这个进程又需求来一次。

实际上,咱们能够运用go generate让上面的进程更智能一点。在main.go文件中添加如下几行注释:

//go:generate go install github.com/hajimehoshi/file2byteslice
//go:generate mkdir resources
//go:generate file2byteslice -input ../images/ship.png -output resources/ship.go -package resources -var ShipPng
//go:generate file2byteslice -input ../images/alien.png -output resources/alien.go -package resources -var AlienPng
//go:generate file2byteslice -input config.json -output resources/config.go -package resources -var ConfigJson

留意,//go:generate之间必定不能有空格,必定不能有空格,必定不能有空格,重要的作业说3遍!然后履行下面的指令即可完结装置file2byteslice和打包资源的作业:

$ go generate

让游戏在网页上运转

借助于wasm的强大功能,咱们的游戏能够很好地在web上运转!为了让程序能够在网页上运转,咱们需求将其编译成wasm。Go内置对wasm的支持。编译方法如下:

$ GOOS=js GOARCH=wasm go build -o alien_invasion.wasm

Go供给的胶水代码,将位于$GOROOT/misc/wasm目录下的wasm_exec.html和wasm_exec.js文件复制到咱们的项目目录下。留意wasm_exec.html文件中默认是加载名为test.wasm的文件,咱们需求将加载文件改为alien_invasion.wasm,或者将生成的文件改名为test.wasm。

然后编写一个简略的web服务器:

package main
import (
  "log"
  "net/http"
)
func main() {
  if err := http.ListenAndServe(":8080", http.FileServer(http.Dir("."))); err != nil {
    log.Fatal(err)
  }
}

运转:

$ go run main.go

翻开浏览器输入地址:localhost:8080/wasm_exec.html。

一起用Go写一个小游戏(下)

点击run按钮即可愉快地玩耍啦!

一起用Go写一个小游戏(下)

项目的缺乏

到目前为止,咱们的游戏基本上可玩,但是还有许多的缺乏:

  • 没有声音!
  • 外星人没有横向的运动
  • 分数都没有!

这些有爱好的童鞋能够自己去实现了。

总结

接着上文,本文介绍了如何将资源文件打包进一个二进制程序中,便利相互之间的传达。然后咱们不费吹灰之力就将这个游戏移至到了网页之中。

总的来说ebiten是一款简略、易上手的2D游戏开发引擎。对游戏开发感爱好的童鞋能够运用它来快速开发,引起自己的爱好。用它来开发一些小游戏也是得心应手,并且自带跨渠道功能,十分便利。但是,大型、杂乱游戏的开发还是要借助专业的引擎。

我们假如发现好玩、好用的 Go 语言库,欢迎到 Go 每日一库 GitHub 上提交 issue

参考

  1. Go 每日一库 GitHub:github.com/darjun/go-d…
  2. ebitengine 官网:ebitengine.org/
  3. Python 编程(从入门到实践):book.douban.com/subject/351…

我的博客:darjun.github.io

欢迎关注我的微信大众号【GoUpUp】,一起学习,一起进步~