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

打包资源

使用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

生成文件如下:

6faa1be8c0668591a639b59eaca892c9.png

1308171461e11ffd7f5c4fa694a539ef.png

1c1b71f59e0bc52f26ca00a7067ddcb2.png

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

// 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 Configif 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 mainimport ("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。

17fdd4a7756e13082101a20637b94f67.png

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

b0de224e102b3031fcd5c47f8a83b113.gif

项目的不足

到目前为止,我们的游戏基本上可玩,但是还有很多的不足:

  • 没有声音!

  • 外星人没有横向的运动!

  • 分数都没有!

这些有兴趣的童鞋可以自己去实现了😀。

总结

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

总的来说ebiten是一款简单、易上手的2D游戏开发引擎。对游戏开发感兴趣的童鞋可以使用它来快速开发,引起自己的兴趣。用它来开发一些小游戏也是得心应手,而且自带跨平台功能,十分方便。但是,大型、复杂游戏的开发还是要借助专业的引擎。

大家如果发现好玩、好用的 Go 语言库,欢迎到 Go 每日一库 GitHub 上提交 issue😄

参考

  1. Go 每日一库 GitHub:https://github.com/darjun/go-daily-lib

  2. ebitengine 官网:https://ebitengine.org/

  3. Python 编程(从入门到实践):https://book.douban.com/subject/35196328/

我的博客:https://darjun.github.io

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/43470.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:Python简单小游戏制作教程——让你学会编写游戏代码

Python简单小游戏制作教程——让你学会编写游戏代码 Python是一种高级编程语言,越来越受欢迎,因为它易于学习和使用,而且灵活性非常高。在这篇文章中,我们将教你如何用Python编写一个简单的小游戏。让我们开始吧! 需…

ChatGPT-4终究会取代人类嘛?

随着人工智能技术的迅速发展,自然语言处理(NLP)已经成为了一个热门领域。其中,ChatGPT-4是一个备受瞩目的自然语言处理工具。在2022年高考语文中,ChatGPT-4表现出色,说明它在自然语言处理领域有很强的实力。…

宋宝华: 僵尸进程的成因以及僵尸可以被“杀死”吗?

僵尸不可能被杀死,因为它已经死了,不存在再死一次的问题。死的对立面是活,死者已死。只有活的进程才可能被杀死。 什么是僵尸 首先要明确一点,僵尸进程的含义是:子进程已经死了,但是父进程还没有wait它的一…

僵尸进程zombie与孤儿进程orphan

代码已上传至https://github.com/gatieme/AderXCoding/tree/master/system/unix/zombie 问题提出 以前在学习《unix环境高级编程》进程时候,提到孤儿进程和僵尸进程,但是一直对这两个概念比较模糊。于是今天做了一些测试程序,并把这些记录下来. 僵尸进程…

僵尸进程以及如何处理僵尸进程

僵尸进程:就是已经结束了的进程,但是没有从进程表中删除。太多了会导致进程表里面条目满了,进而导致系统崩溃,倒是不占用其他系统资源。最后有defunct的标记,就表明是僵尸进程。 今天配置Redis的时候结束停止Redis服务…

僵尸进程的一点玩法

僵尸进程的一点玩法 前言被忽略的RundownProtectionExAcquireRundownProtection 应用总结 前言 这几天在看WRK的时候,偶然间发现的一个东西,逆向之后,发现了个僵尸进程的玩法。目前菜鸡一枚,有说的不准确的地方,请大家…

PAT——1094 谷歌的招聘

2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘。内容超级简单,就是一个以 .com 结尾的网址,而前面的网址是一个 10 位素数,这个素数是自然常数 e 中最早出现的 10 位连续…

PTA—7-5 谷歌的招聘

实际上这题是不难的,甚至说有点简单,连我这样的小菜比都可以顺利的AC。 废话不多说来看题目。 2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘。内容超级简单,就是一个以…

AI对话AI才是正解?KAUST研究团队提出基于角色扮演的大模型交互代理框架CAMEL

电影《盗梦空间》中有这样一句非常经典的台词: “世上最具有可塑性的寄生虫是什么?是人类的想法。人类大脑中一个简单的想法,就可以建立一座庞大的城市。有时一个想法也可以改变世界,并改写一切规则,这就是我为什么要…

chatGpt的快捷使用

首页的界面,非常好看,有我经常使用的入口 第一步:打开edge浏览器 第二步:右上角的扩展程序 第三步:点击 扩展 第四步: 第五步: 第六步: 第七步: 新打开Tab页&#xf…

windows下通过远程桌面访问linux图形界面

一、安装epel库 epel库安装之前无法使用yum install xrdp命令安装xrdp 命令:yum install epel-release之后会自动匹配对应版本的rpm包,并解决依赖关系进行安装。 二、安装xrdp xrdp作为linux的图形化界面 1.命令:yum install xrdp2.开启…

如何在Mac上快速显示桌面以便快速访问

macOS 环境中充满了可用于执行有用任务的快捷方式和手势。其中之一被简单地命名为“显示桌面”。当您打开一大堆应用程序窗口时,这个方便的功能可以为您节省宝贵的时间。一起来看看如何在Mac上快速显示桌面的方法吧。 1.使用触控板手势 触控板手势可能很难描述&…

大牛证券解析恒指大跌800点+全球股市大跌

今日两市差异化或许是像上一年白马抱团强化相同,而本年白马被丢掉,接力的科技与锂电,而这两个板块特别是(成果爆发工作高成长为特性),锂电有宁德时代,比亚迪、容百科技等,芯片&#…

股票大跌期权对冲

股票期权的出世标示着股票能够及时止损, 股票期权能够很好的与股票做对冲,可以把股票亏损的风险降低,减少投资者面对股票行情下跌产生的亏损。 股票期权的上市让股票多了一种对冲方式,投资者买入股票的时候同时买入一手认沽期权&…

美股历史行情数据之日频率数据

美股历史行情日频率数据 全交易所eod数据,阿里云盘分享全历史行情数据,最早数据记录于1970年。数据字段包含OHLC,除权,股息等全部字段阿里云盘订阅数据,数据每天更新。 全交易所eod数据,阿里云盘分享 交易…

洋姜和生姜的区别

1、科属不同 洋姜和生姜的本质区别就是科属不一类,洋姜是菊科的,而生姜属姜科的,虽然都是多年生草本植物,但是科属不同就代表着这两种食材之间是不一样的了。 洋姜生姜属科不同 2、味道不同 可以通过闻的方式和尝的方式来感受…

洋姜的腌制方法 怎样腌制洋姜好吃

怎样腌制洋姜好吃?提到洋姜很多人都很喜欢吃,洋姜吃法很多,但是最广为人知和受欢迎的就是腌洋姜了,味道佳营养丰富。下面本文来讲解一下洋姜的腌制方法: **洋姜的腌制方法**材料:洋姜、水、花椒、丁香、桂皮、食盐 做…

外汇天眼:外汇走势图的三种图表,看外汇图表这三种就够了

在外汇交易中,一个成功的交易缺少不了分析各种图表,经过多方的比对才可以进行外汇交易,所以会看外汇图表是很有必要的,下面给大家介绍一下三种不同的外汇图表。 折线图 一个简单的折线图所描绘的是连接相邻时段收盘价的形态。当把…

国内版 ChatPDF 来了

最近刚看到的https://www.smartread.cc/,跟chatpdf很像,目前国内还能用,而且比chatpdf好的是全中文页面,司马阅(SmartRead),基于新一代人工智能技术,可快速提取、总结PDF文档信息。 通过聊天互动形式&#…

ChatPDF,PDF操作一键完成!

大家注意:因为微信最近又改了推送机制,经常有小伙伴说错过了之前被删的文章,比如前阵子冒着风险写的爬虫,再比如一些限时福利,错过了就是错过了。 所以建议大家加个星标,就能第一时间收到推送。&#x1f44…