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

news2024/12/25 0:22:47

打包资源

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

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.coloradmin.cn/o/71771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试官:使用 RocketMQ 怎么进行灰度发布?

今天来聊一聊 RocketMQ 的灰度方案。 灰度发布是指在黑与白之间,平滑过渡的一种发布方式。在大流量的系统中,如果一次升级改造范围比较大,或者影响内容不太确定,一般会采用切量的方式进行升级,这样可以减少生产变更带…

面试官:MySQL 中 varchar(n) 中 n 最大取值为多少?

前置知识 要回答这个问题,首先我们得先知道 MySQL 存储一条记录的格式长什么样子。 以 Compact 行格式作为例子,它长这样: 可以看到,一条完整的记录分为「记录的额外信息」和「记录的真实数据」两个部分。 这里重点讲讲记录的…

探究L298N模块烧毁的原因

目录 基础介绍 代码思路 基础介绍 L298N电机驱动版主要由两个核心组件构成: L298N 驱动芯片78M05 稳压器型号: L298N封装: Multiwatt15V 描述:电源电压:4.5V~46V 特性:过流保护(OCP);过热保…

在线教程 | 用「网红项目」DeepSOCIAL 进行社交距离监测

By 超神经 内容一览:YOLO v4 是一个实时的、高精度的目标检测模型,本教程将详细讲解如何基于 YOLO v4 和 SORT 算法,实现在多目标条件下的人群距离检测。 关键词:YOLO v4 SORT 多目标检测 新冠疫情爆发初期,「保持…

VSCODE安装ChatGPT插件

zh1:首先在插件商店搜索ChatGPT中文版 然后点击安装就可以 2:chatGPT插件目前需要登陆账号才能使用,官方介绍下一个版本会有升级(不需要登陆) a:前往 ChatGPT 并登录或注册。 首先要先注册,注册的时候邮箱号可以填国内的也可以用…

利他合作,共赢未来 | 数商云全国渠道代理商招募政策发布

12月2日下午,以“利他合作,共赢未来”为主题的数商云全国渠道代理商招募政策发布会在广州顺利召开,与线上线下来自全国各地区的60家优质厂商共同解读数商云首次公开的招商政策、深入体验数商云全线产品体系,挖掘千亿数字化采购市场…

leecode#有效的电话号码#第十行#上升的温度

题目描述: 给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个单行 bash 脚本输出所有有效的电话号码。 你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxxx 或 xxx-xxx-xxxx。…

20个有用的Excel数据分析函数(教程含案例)

Microsoft Excel 是一种简单而强大的数据分析工具。Excel 是当今行业中广泛使用的软件应用程序,用于生成报告和业务洞察。Excel 包含超过 450 个函数,并且每年都会添加更多函数。在这里,我们介绍了那些主要用于数据分析的功能。 MAX/MIN MAX和MIN函数顾名思义。MAX将找到范…

零基础CSS入门教程(8)——CSS设置字体

本章目录1.任务目标2.css设置字体3.代码演示4.小结1.任务目标 我们前几个小结学习了,css的选择器,和及基本的改变字体颜色。我们这一小结学习一下设置字体的一些功能 2.css设置字体 (1)font-size这个是设置字体大小,浏览器一般默认字体是1…

剪映专业版常用快捷键(Pr 习惯)

剪映专业版提供了两组常用快捷键,一组适应 Final Cut Pro X 用户的习惯,另一组则是为了适应 Adobe Premiere Pro 用户的习惯。本文列出了剪映专业版(v3.6)的常用快捷键,以让 Pr 用户快速上手剪映。时间线相关快捷键分割…

无接触体征监测的技术和应用

近年来,由于传感器和微电子技术的飞速发展,基于智能传感器的无接触体征监测技术成为研究热点。尤其是近年来传感器技术和人工智能算法的不断创新,使人们在对人体生理、生化参数等进行监测时能够达到实时、精确和智能化的目的。 智能传感器主要…

软件设计师教程(三)计算机系统知识-计算机体系结构

软件设计师教程 软件设计师教程(一)计算机系统知识-计算机系统基础知识 软件设计师教程(二)计算机系统知识-计算机体系结构 安全性、可靠性与系统性能评测基础知识软件设计师教程计算机安全概述计算机的安全等级安全威胁影响数据…

Linux进程的创建

fork是一个系统调用,系统调用的流程,流程的最后会在sys_call_table中找到相应的系统调用sys_fork。,sys_fork的定义如下: SYSCALL_DEFINE0(fork) { ......return _do_fork(SIGCHLD, 0, 0, NULL, NULL, 0); }sys_fork会调用_do_fo…

web大作业:基于html+css+javascript+jquery实现智能分控网站

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

c语言数据结构---链表

我喜欢我的懦弱,痛苦和难堪也喜欢。喜欢夏天的光照,风的气息,蝉的鸣叫,喜欢这些,喜欢得不得了。 ——村上春树《寻羊冒险记》 1.对链表的理解 2.链表每个节点的创建 3.输出链表 链表:顾名思义&#xff0c…

Redis-全面详解(学习总结---从入门到深化)

Redis概述_为什么要用NoSQL 单机Mysql的美好年代 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。在那个时候,更多的都是 静态网页,动态交互类型的网站不多。 遇到问题: 随着用户数的增长&#…

centos7搭建DHCP服务器,实现上网

环境如下: 三台主机,一台centos7,当DNS服务器,一台centos7测试,一台window10测试。 版本centos7.6 三者都是在vmnet8环境下 centos7(dns服务器):192.168.139.200 centos&#x…

2小时开发《点球射门游戏》,动画演示思路(下),代码已开源

前沿 首选感谢各位对我这边文章(2小时开发《点球射门游戏》,动画演示思路(上),代码已开源)的点赞、收藏与支持,今天在这里主要是接上一篇文章,讲一讲游戏界面中的一些动画与逻辑的实现&#xf…

SpringBoot + Elasticsearch 实现模糊查询,批量CRUD,排序,分页,高亮!

一、引入依赖 当前Elasticsearch服务端的版本为8.5.1,此处Spring Data Elasticsearch的版本为2.6.1 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version&…

Java中不能在foreach中进行元素的remove和add操作

参考文献&#xff1a;https://juejin.im/post/6844903794795347981 在阿里巴巴Java开发手册中&#xff0c;有这样一条规定&#xff1a; 但是手册中并没有给出具体原因&#xff0c;本文就来深入分析一下该规定背后的思考。 foreach循环 以下实例演示了 普通for循环 和 foreach…