• 一起用Go做一个小游戏(上)


    引子

    最近偶然看到一个Go语言库,口号喊出“一个超级简单(dead simple)的2D游戏引擎”,好奇点开了它的官网。

    9ce69bdfa073525abcb4394230a68c4f.png

    官网上已经有很多可以在线体验的小游戏了(利用WASM技术)。例如曾经风靡一时的2048:

    c1e92c377bd25e7488d8b17b07ea0963.png

    当然只要安装了Go,我们也键入下面的命令本地运行这个游戏:

    go run -tags=example github.com/hajimehoshi/ebiten/v2/examples/2048@latest

    还有童年《俄罗斯方块》:

    2828436fa436cfbdce821fb3e82c6cc3.png

    有14年左右让无数人疯狂的《Flappy Bird》(或许称为Flappy Gopher更贴切一点😀):

    faa661a233f0ec5c85f83a373d79c716.png

    这些瞬间让我产生了极大的兴趣。简单浏览一下文档,整体感觉下来,虽然与成熟的游戏引擎(如Cocos2dx,DirectX,Unity3d等)相比,ebiten功能还不算丰富。但是麻雀虽小,五脏俱全。ebiten的API设计比较简单,使用也很方便,即使对于新手也可以在1-2个小时内掌握,并开发出一款简单的游戏。更妙的是,Go语言让ebitengine实现了跨平台!

    接下来的3篇文章,我会介绍ebitengine这个库。对于游戏引擎来说,只介绍它的API用法似乎有点纸上谈兵。恰好我想起之前看到一个《外星人入侵》的小游戏,刚好可以拿来练手。那请大家坐稳扶好,我们出发咯。

    安装

    ebitengine 要求Go版本 >= 1.15。使用go module下载这个包:

    go get -u github.com/hajimehoshi/ebiten/v2

    显示窗口

    游戏开发第一步是将游戏窗口显示出来,并且能在窗口上显示一些文字。先看代码:

    1. package main
    2. import (
    3.   "log"
    4.   "github.com/hajimehoshi/ebiten/v2"
    5.   "github.com/hajimehoshi/ebiten/v2/ebitenutil"
    6. )
    7. type Game struct{}
    8. func (g *Game) Update() error {
    9.   return nil
    10. }
    11. func (g *Game) Draw(screen *ebiten.Image) {
    12.   ebitenutil.DebugPrint(screen, "Hello, World")
    13. }
    14. func (g *Game) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) {
    15.   return 320240
    16. }
    17. func main() {
    18.   ebiten.SetWindowSize(640480)
    19.   ebiten.SetWindowTitle("外星人入侵")
    20.   if err := ebiten.RunGame(&Game{}); err != nil {
    21.     log.Fatal(err)
    22.   }
    23. }

    使用命令go run运行该程序:

    $ go run main.go

    我们会看到一个窗口,标题为外星人入侵,并且左上角显示了文字Hello,World

    74f36c678844f7076725984bd43efa5f.png

    现在我们来分析使用ebiten开发的游戏程序的结构。

    首先,ebiten引擎运行时要求传入一个游戏对象,该对象的必须实现ebiten.Game这个接口:

    1. // Game defines necessary functions for a game.
    2. type Game interface {
    3.   Update() error
    4.   Draw(screen *Image)
    5.   Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int)
    6. }

    ebiten.Game接口定义了ebiten游戏需要的3个方法:Update,DrawLayout

    • Update:每个tick都会被调用。tick是引擎更新的一个时间单位,默认为1/60s。tick的倒数我们一般称为帧,即游戏的更新频率。默认ebiten游戏是60帧,即每秒更新60次。该方法主要用来更新游戏的逻辑状态,

  • 相关阅读:
    关于Reactor模型,我们需要知道哪些内容
    使用 JCommander 解析命令行参数
    Docker基础操作容器
    记录Windows安装Tomcat后无法打印项目日志原因,非catalina日志
    分布式一致性算法 -- Paxos
    module内包含第三方aar包,完整打包上传maven的方法
    c++——爆肝7000字的高精度算法大合集&&实战应用
    Vue3学习笔记
    ffmpeg.autogen使用问题
    花青素染料 Cy3NS 酸,Cy3NS acid,CAS:1032678-01-5物化性质解析
  • 原文地址:https://blog.csdn.net/darjun/article/details/128213350