golang游戏开发简单易用的视频游戏编程插件库raylib-go的使用

Golang游戏开发:简单易用的视频游戏编程插件库raylib-go的使用

raylib-go简介

logo

raylib-go是raylib的Golang绑定,raylib是一个简单易用的库,用于享受视频游戏编程的乐趣。raylib的C源代码包含在内并与绑定一起编译。请注意,第一次构建可能需要几分钟时间。

也可以在不使用cgo的情况下使用raylib-go(仅限Windows;见下面的要求)。

系统要求

Ubuntu

apt-get install libgl1-mesa-dev libxi-dev libxcursor-dev libxrandr-dev libxinerama-dev libwayland-dev libxkbcommon-dev

Fedora

dnf install mesa-libGL-devel libXi-devel libXcursor-devel libXrandr-devel libXinerama-devel wayland-devel libxkbcommon-devel

macOS

在macOS上,你需要Xcode或Xcode的命令行工具(如果你安装了brew,你已经有了这个)。

Windows

cgo

在Windows上你需要C编译器,如Mingw-w64或TDM-GCC。你也可以在MSYS2 shell中构建二进制文件。

要删除控制台窗口,使用-ldflags "-H=windowsgui"构建。

purego (不使用cgo,即CGO_ENABLED=0)

从发布页面的资源中下载raylib.dll。它包含在raylib-*_win64_msvc*.zip中。将raylib.dll放入项目的根文件夹或复制到C:\Windows\System32进行系统范围的安装。

也可以自己构建DLL。你可以在raylib的wiki上找到更多信息。

Android

Wasm

对于web绑定,参考Raylib-Go-Wasm;它与这个仓库基本兼容。

安装

go get -v -u github.com/gen2brain/raylib-go/raylib

构建标签

  • drm - 为Linux原生DRM模式构建,包括Raspberry Pi 4和其他设备 (PLATFORM_DRM)
  • sdl - 为SDL后端构建 (PLATFORM_DESKTOP_SDL)
  • sdl3 - 为SDL3后端构建 (PLATFORM_DESKTOP_SDL3)
  • rgfw - 为RGFW后端构建 (PLATFORM_DESKTOP_RGFW)
  • noaudio - 禁用音频功能
  • opengl43 - 使用OpenGL 4.3后端
  • opengl21 - 使用OpenGL 2.1后端(桌面默认是3.3)
  • opengl11 - 使用OpenGL 1.1后端(伪OpenGL 1.1风格)
  • es2 - 使用OpenGL ES 2.0后端(可用于链接Google的ANGLE)
  • es3 - 实验性支持OpenGL ES 3.0
  • x11 - 在Wayland上强制X11兼容模式 (PLATFORM_DESKTOP/GLFW)
  • wayland - 强制仅Wayland模式 (PLATFORM_DESKTOP/GLFW)

文档

GoDoc上的文档。同时查看raylib备忘单。如果你有问题或需要帮助,Raylib Discord Server的#raylib-go频道有一个活跃的社区可以提供帮助。

示例代码

package main

import rl "github.com/gen2brain/raylib-go/raylib"

func main() {
    // 初始化窗口:800x450像素,标题为"raylib [core] example - basic window"
    rl.InitWindow(800, 450, "raylib [core] example - basic window")
    defer rl.CloseWindow() // 确保在程序结束时关闭窗口

    // 设置目标FPS为60
    rl.SetTargetFPS(60)

    // 主游戏循环,直到窗口关闭
    for !rl.WindowShouldClose() {
        // 开始绘制
        rl.BeginDrawing()

        // 清除背景为白色
        rl.ClearBackground(rl.RayWhite)
        // 在(190,200)位置绘制灰色文字
        rl.DrawText("Congrats! You created your first window!", 190, 200, 20, rl.LightGray)

        // 结束绘制
        rl.EndDrawing()
    }
}

查看更多按raylib模块组织的示例。

交叉编译(Linux)

要为Windows交叉编译,安装MinGW工具链。

$ CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc GOOS=windows GOARCH=amd64 go build -ldflags "-s -w"
$ file basic_window.exe
basic_window.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows, 11 sections

$ CGO_ENABLED=1 CC=i686-w64-mingw32-gcc GOOS=windows GOARCH=386 go build -ldflags "-s -w"
$ file basic_window.exe
basic_window.exe: PE32 executable (console) Intel 80386 (stripped to external PDB), for MS Windows, 9 sections

要为macOS交叉编译,安装OSXCross工具链。

$ CGO_ENABLED=1 CC=x86_64-apple-darwin21.1-clang GOOS=darwin GOARCH=amd64 go build -ldflags "-linkmode external -s -w '-extldflags=-mmacosx-version-min=10.15'"
$ file basic_window
basic_window: Mach-O 64-bit x86_64 executable, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL>

$ CGO_ENABLED=1 CC=aarch64-apple-darwin21.1-clang GOOS=darwin GOARCH=arm64 go build -ldflags "-linkmode external -s -w '-extldflags=-mmacosx-version-min=12.0.0'"
$ file basic_window
basic_window: Mach-O 64-bit arm64 executable, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL|PIE>

许可证

raylib-go采用未修改的zlib/libpng许可证。


更多关于golang游戏开发简单易用的视频游戏编程插件库raylib-go的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang游戏开发简单易用的视频游戏编程插件库raylib-go的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用raylib-go进行Golang游戏开发

raylib-go是Raylib游戏框架的Golang绑定,它是一个简单易用的视频游戏编程库,特别适合初学者和2D/3D游戏开发。下面我将介绍raylib-go的基本使用方法和示例代码。

安装raylib-go

首先需要安装raylib-go:

go get github.com/gen2brain/raylib-go/raylib

基本框架

一个最简单的raylib-go程序框架如下:

package main

import rl "github.com/gen2brain/raylib-go/raylib"

func main() {
    // 初始化窗口
    rl.InitWindow(800, 450, "raylib-go 示例")
    defer rl.CloseWindow() // 程序结束时关闭窗口

    // 设置目标FPS
    rl.SetTargetFPS(60)

    // 主游戏循环
    for !rl.WindowShouldClose() { // 检测窗口关闭按钮或ESC键
        // 游戏逻辑更新
        
        // 开始绘图
        rl.BeginDrawing()
        
        // 清空背景
        rl.ClearBackground(rl.RayWhite)
        
        // 绘制内容
        rl.DrawText("Hello, raylib-go!", 190, 200, 20, rl.LightGray)
        
        // 结束绘图
        rl.EndDrawing()
    }
}

2D图形绘制示例

下面是一个绘制2D图形的完整示例:

package main

import rl "github.com/gen2brain/raylib-go/raylib"

func main() {
    screenWidth := int32(800)
    screenHeight := int32(450)

    rl.InitWindow(screenWidth, screenHeight, "2D绘图示例")
    defer rl.CloseWindow()

    ballPosition := rl.NewVector2(float32(screenWidth)/2, float32(screenHeight)/2)
    ballSpeed := rl.NewVector2(5, 4)
    ballRadius := 20.0
    ballColor := rl.Blue

    rl.SetTargetFPS(60)

    for !rl.WindowShouldClose() {
        // 更新小球位置
        ballPosition.X += ballSpeed.X
        ballPosition.Y += ballSpeed.Y

        // 检测边界碰撞
        if ballPosition.X >= float32(screenWidth)-float32(ballRadius) || ballPosition.X <= float32(ballRadius) {
            ballSpeed.X *= -1
            ballColor = rl.ColorFromHSV(rl.GetRandomValue(0, 360), 0.7, 0.9)
        }
        if ballPosition.Y >= float32(screenHeight)-float32(ballRadius) || ballPosition.Y <= float32(ballRadius) {
            ballSpeed.Y *= -1
            ballColor = rl.ColorFromHSV(rl.GetRandomValue(0, 360), 0.7, 0.9)
        }

        // 绘制
        rl.BeginDrawing()
        rl.ClearBackground(rl.RayWhite)

        rl.DrawCircleV(ballPosition, float32(ballRadius), ballColor)
        rl.DrawText("弹跳的小球", 10, 10, 20, rl.DarkGray)

        rl.EndDrawing()
    }
}

输入处理示例

raylib-go提供了简单的输入处理:

package main

import (
    "fmt"
    rl "github.com/gen2brain/raylib-go/raylib"
)

func main() {
    rl.InitWindow(800, 450, "输入处理示例")
    defer rl.CloseWindow()

    boxPosition := rl.NewVector2(350, 280)
    boxSize := rl.NewVector2(100, 100)
    movingSpeed := float32(2)

    rl.SetTargetFPS(60)

    for !rl.WindowShouldClose() {
        // 键盘控制
        if rl.IsKeyDown(rl.KeyRight) {
            boxPosition.X += movingSpeed
        }
        if rl.IsKeyDown(rl.KeyLeft) {
            boxPosition.X -= movingSpeed
        }
        if rl.IsKeyDown(rl.KeyDown) {
            boxPosition.Y += movingSpeed
        }
        if rl.IsKeyDown(rl.KeyUp) {
            boxPosition.Y -= movingSpeed
        }

        // 鼠标控制
        if rl.IsMouseButtonDown(rl.MouseLeftButton) {
            boxPosition = rl.GetMousePosition()
        }

        // 绘制
        rl.BeginDrawing()
        rl.ClearBackground(rl.RayWhite)

        rl.DrawRectangleV(boxPosition, boxSize, rl.Red)
        rl.DrawText("用方向键移动方块\n或用鼠标左键拖动", 10, 10, 20, rl.DarkGray)

        // 显示坐标
        coordText := fmt.Sprintf("位置: (%.0f, %.0f)", boxPosition.X, boxPosition.Y)
        rl.DrawText(coordText, int32(boxPosition.X), int32(boxPosition.Y)-30, 20, rl.Black)

        rl.EndDrawing()
    }
}

纹理和精灵示例

package main

import rl "github.com/gen2brain/raylib-go/raylib"

func main() {
    rl.InitWindow(800, 450, "纹理示例")
    defer rl.CloseWindow()

    // 加载纹理
    texture := rl.LoadTexture("assets/texture.png") // 替换为你的图片路径
    defer rl.UnloadTexture(texture)

    position := rl.NewVector2(350, 200)
    rotation := float32(0)
    scale := float32(1)
    tint := rl.White

    rl.SetTargetFPS(60)

    for !rl.WindowShouldClose() {
        // 旋转纹理
        rotation += 0.5
        if rotation > 360 {
            rotation = 0
        }

        // 缩放控制
        if rl.IsKeyPressed(rl.KeyUp) {
            scale += 0.1
        }
        if rl.IsKeyPressed(rl.KeyDown) {
            scale -= 0.1
        }

        // 绘制
        rl.BeginDrawing()
        rl.ClearBackground(rl.RayWhite)

        // 绘制纹理
        rl.DrawTextureEx(texture, position, rotation, scale, tint)

        rl.DrawText("按上/下键缩放纹理", 10, 10, 20, rl.DarkGray)

        rl.EndDrawing()
    }
}

音频播放示例

package main

import rl "github.com/gen2brain/raylib-go/raylib"

func main() {
    rl.InitWindow(800, 450, "音频示例")
    defer rl.CloseWindow()

    // 初始化音频设备
    rl.InitAudioDevice()
    defer rl.CloseAudioDevice()

    // 加载音效和音乐
    sound := rl.LoadSound("assets/sound.wav") // 替换为你的音效文件
    defer rl.UnloadSound(sound)

    music := rl.LoadMusicStream("assets/music.mp3") // 替换为你的音乐文件
    defer rl.UnloadMusicStream(music)

    rl.PlayMusicStream(music)

    rl.SetTargetFPS(60)

    for !rl.WindowShouldClose() {
        // 更新音乐流
        rl.UpdateMusicStream(music)

        // 键盘控制
        if rl.IsKeyPressed(rl.KeySpace) {
            rl.PlaySound(sound)
        }

        if rl.IsKeyPressed(rl.KeyP) {
            if rl.IsMusicStreamPlaying(music) {
                rl.PauseMusicStream(music)
            } else {
                rl.ResumeMusicStream(music)
            }
        }

        // 绘制
        rl.BeginDrawing()
        rl.ClearBackground(rl.RayWhite)

        rl.DrawText("按空格键播放音效", 10, 10, 20, rl.DarkGray)
        rl.DrawText("按P键暂停/继续音乐", 10, 40, 20, rl.DarkGray)

        rl.EndDrawing()
    }
}

总结

raylib-go提供了简单易用的游戏开发接口,包括:

  • 窗口管理
  • 2D/3D图形绘制
  • 输入处理(键盘、鼠标、游戏手柄)
  • 音频播放
  • 物理模拟(需要额外模块)

它的API设计直观,文档完善,非常适合初学者学习游戏开发。相比其他游戏引擎,raylib-go更加轻量级,不强制使用特定的架构模式,让开发者可以自由组织代码。

更多示例和完整文档可以参考raylib-go的GitHub仓库和Raylib官方文档。

回到顶部