前不久在v2上看到一个好玩的玩意儿,由于这个项目是使用go写的,
同时涉及到了一些lib库。我这里就用docker来安装了(主要还是C盘实在快装不下了2333~)
首先启动一个纯golang的docker容器,同时映射1989端口:
(把/data映射到物理机的/docker/gbdotlive_data是为了更方便的copy文件进去)
1
| docker run --name godemo -it -v /docker/gbdotlive_data:/data -p 1989:1989 golang bash
|
首先下载git项目,我懒得装git就直接下压缩包了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| root@bedf0426add5:/go# wget https://github.com/HFO4/gameboy.live/archive/master.zip root@bedf0426add5:/go# mv master.zip /data root@bedf0426add5:/# cd /data root@bedf0426add5:/data#
# 当我们尝试解压的时候报错了,提示unzip这个命令没找到 root@bedf0426add5:/data# unzip master.zip -d gameboy bash: unzip: command not found
# 用apt-get安装unzip # 由于apt服务器在国外,所以下载会很慢。可以参考下面的文章切换apt源,这里就不展示了。 root@bedf0426add5:/data# apt-get update Get:1 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB] Get:2 http://deb.debian.org/debian buster InRelease [121 kB] Get:3 http://deb.debian.org/debian buster-updates InRelease [51.9 kB] Get:4 http://security.debian.org/debian-security buster/updates/main amd64 Packages [248 kB] Get:5 http://deb.debian.org/debian buster/main amd64 Packages [7906 kB] Get:6 http://deb.debian.org/debian buster-updates/main amd64 Packages [7856 B] Fetched 7731 kB in 13min 45s (9371 B/s) Reading package lists... Done root@bedf0426add5:/data# root@bedf0426add5:/data# apt-get install unzip Reading package lists... Done Building dependency tree Reading state information... Done Suggested packages: zip The following NEW packages will be installed: unzip 0 upgraded, 1 newly installed, 0 to remove and 4 not upgraded. Need to get 172 kB of archives. After this operation, 580 kB of additional disk space will be used. Get:1 http://deb.debian.org/debian buster/main amd64 unzip amd64 6.0-23+deb10u1 [172 kB] Fetched 172 kB in 6s (29.9 kB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package unzip. (Reading database ... 15410 files and directories currently installed.) Preparing to unpack .../unzip_6.0-23+deb10u1_amd64.deb ... Unpacking unzip (6.0-23+deb10u1) ... Setting up unzip (6.0-23+deb10u1) ... Processing triggers for mime-support (3.62) ... root@bedf0426add5:/data# unzip master.zip -d gameboy root@bedf0426add5:/data# ls gameboy master.zip root@bedf0426add5:/data# cd gameboy root@bedf0426add5:/data/gameboy#
|
切换apt-get源的方法: 传送门
ok,到这文件是下完了,预装一些需要的lib库。
1 2 3 4 5 6 7 8
| # 安装过程的输出就不粘贴出来了,没啥意思。照着这个列表装就行了 # 有些lib库安装很慢,我这一套装完差不多花了一个多小时。 root@bedf0426add5:/data/gameboy# apt-get install libasound2-dev root@bedf0426add5:/data/gameboy# apt-get install libgl1-mesa-dev root@bedf0426add5:/data/gameboy# apt-get install libxcursor-dev root@bedf0426add5:/data/gameboy# apt-get install libghc-x11-dev root@bedf0426add5:/data/gameboy# apt-get install libxrandr-dev root@bedf0426add5:/data/gameboy# apt-get install libxi-dev
|
一切安装完之后就可以正式编译了
1 2 3 4 5 6 7
| root@bedf0426add5:/data/gameboy# ls gameboy.live-master # 进入目录 root@bedf0426add5:/data/gameboy# cd gameboy.live-master root@bedf0426add5:/data/gameboy/gameboy.live-master# # 编译 root@bedf0426add5:/data/gameboy/gameboy.live-master# go build -o gbdotlive main.go
|
有时候会出现这样的结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| root@bedf0426add5:/data/gameboy/gameboy.live-master# go build -o gbdotlive main.go go: fyne.io/fyne@v1.0.1: Get "https://proxy.golang.org/fyne.io/fyne/@v/v1.0.1.mod": dial tcp 172.217.27.145:443: i/o timeout
# 不要慌,切换下镜像地址就行 root@bedf0426add5:/data/gameboy/gameboy.live-master# go env -w GOPROXY=https://goproxy.cn,direct # 重新编译 root@bedf0426add5:/data/gameboy/gameboy.live-master# go build -o gbdotlive main.go go: downloading fyne.io/fyne v1.0.1 go: downloading github.com/satori/go.uuid v1.2.0 go: downloading github.com/faiface/pixel v0.8.0 go: downloading github.com/faiface/beep v1.0.1 go: downloading github.com/logrusorgru/aurora v0.0.0-20190428105938-cea283e61946 go: downloading github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 go: downloading github.com/faiface/mainthread v0.0.0-20171120011319-8b78f0a41ae3 go: downloading github.com/go-gl/mathgl v0.0.0-20190416160123-c4601bc793c7 go: downloading github.com/pkg/errors v0.8.1 go: downloading github.com/faiface/glhf v0.0.0-20181018222622-82a6317ac380 go: downloading golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f go: downloading github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 go: downloading github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff go: downloading github.com/srwiley/oksvg v0.0.0-20190105194046-ccbc7673cdf3 go: downloading github.com/srwiley/rasterx v0.0.0-20181219215540-696f7edb7a7e go: downloading golang.org/x/net v0.0.0-20181220203305-927f97764cc3 go: downloading golang.org/x/text v0.3.0 go: downloading github.com/hajimehoshi/oto v0.3.1 root@bedf0426add5:/data/gameboy/gameboy.live-master#
# 拷贝gbdotlive到/data目录下 root@bedf0426add5:/data/gameboy/gameboy.live-master# cp gbdotlive /data/gbdotlive root@bedf0426add5:/data/gameboy/gameboy.live-master# cd /data root@bedf0426add5:/data#
|
编译成功之后通过映射的/docker/gbdotlive_data目录导入gb游戏。
运行./gbdotlive -S -r "Pokemon.gb"
命令,之后访问IP:1989/image就能看到效果啦。
1 2 3 4 5 6 7 8 9 10 11 12 13
| root@bedf0426add5:/data# ./gbdotlive -S -r "Pokemon.gb" 2020/11/16 22:30:55 [Core] Loading rom file... 2020/11/16 22:30:55 [Core] 1048576 Bytes rom loaded 2020/11/16 22:30:55 [Core] Loading ram file... 2020/11/16 22:30:55 [Cartridge] Game title: POKEMON BLUE 2020/11/16 22:30:55 [Cartridge] CGB mode: false 2020/11/16 22:30:55 [Cartridge] Cartridge type: MBC3+RAM+BATTERY 2020/11/16 22:30:55 [Cartridge] ROM bank number: 64 (0KBytes) 2020/11/16 22:30:55 [Cartridge] RAM bank number: 0 (0KBytes) 2020/11/16 22:30:55 [Core] Start to initialize memory... 2020/11/16 22:30:55 [Memory] Load first 32KByte of rom data into memory 2020/11/16 22:30:55 [Core] Initialize CPU flags and registers 2020/11/16 22:30:55 [Display] Initialize static image display
|
图1
其他的命令使用方法可以参考作者的项目主页:HFO4/gameboy.live
另外分享一个自己写的VUE版h5操作界面
![]()
gameboy.zip
把其中192.168.0.2
修改成自己的IP地址即可。
1 2 3 4 5 6 7 8 9 10 11 12 13
| let app = new Vue({ el: "#app", data: { host: "http://192.168.0.2:1989", screenUrl: "http://192.168.0.2:1989/image" }, created () { let IntervalFunc = () => { this.screenUrl = 'http://192.168.0.2:1989/image?' + (new Date).getTime() } setInterval(IntervalFunc, 200) } })
|
拓展:多人协作 - 在直播中玩游戏
之前看到了这个新闻 Twitch Plays Pokemon,讲一群网民在实况频道的聊天室输入游戏指令来控制实况中的游戏。
想了下好像也能做,然后写了一个demo
![]()
但是因为直播延迟有点久(大约有5-8秒)又没有粉丝,所以挂了两天也没出新手村(笑~
其他问题
有时候go build会出现报错,可以通过apt-file来查看未安装的依赖库
1 2 3 4 5 6 7 8 9 10
| root@bedf0426add5:/data# sudo apt-get install libx11-dev root@bedf0426add5:/data# sudo apt-get install apt-file root@bedf0426add5:/data# sudo apt-file update
# 搜索报错的内容 root@bedf0426add5:/data# apt-file search XXXX.h libxt-dev: usr/include/X11/Intrinsic.h
# 则安装libxt-dev库即可解决报错 sudo apt-get install libxt-dev
|
参考资料
ubuntu切换国内镜像源,加速apt-get下载速度
Golang设置国内代理
HFO4/gameboy.live: A basic gameboy emulator with terminal Cloud Gaming support
【解决】fatal error: X11/XXXX.h: No such file or directory