• 一起用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次。该方法主要用来更新游戏的逻辑状态,

  • 相关阅读:
    聊聊logback的FixedWindowRollingPolicy
    ?. 语法报错
    如何通俗地解释云计算、私有云、公有云、混合云、专有云、分布式云?
    AI制药,噱头还是未来?
    ElasticSearch第三讲:ES详解 - Elastic Stack生态和场景方案
    IIS 网站初始化与 Keep alive
    什么是微服务?
    【反射】Method类
    C专家编程 第1章 C:穿越时空的迷雾 1.7 编译限制
    C语言之文件的使用(上)
  • 原文地址:https://blog.csdn.net/darjun/article/details/128213350