golang游戏开发与视频编程学习插件库raylib-goraylib的使用

Golang游戏开发与视频编程学习插件库raylib-go/raylib的使用

logo

raylib-go是raylib的Golang绑定,raylib是一个简单易用的库,用于享受视频游戏编程的乐趣。

要求

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 (without cgo, i.e. CGO_ENABLED=0)

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

Android

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上。同时查看raylibcheatsheet。如果你有问题或需要帮助,Raylib Discord Server的#raylib-go频道中有一个活跃的社区可以提供帮助。

示例

package main

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

func main() {
    // 初始化800x450的窗口
    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许可证。查看LICENSE


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

1 回复

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


使用raylib-go进行Golang游戏开发与视频编程

raylib是一个简单易用的跨平台游戏开发库,而raylib-go是其Golang绑定版本。它非常适合初学者学习游戏开发,也足够强大用于创建专业项目。下面我将介绍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() {
        // 开始绘制
        rl.BeginDrawing()
        
        // 清空背景
        rl.ClearBackground(rl.RayWhite)
        
        // 绘制文字
        rl.DrawText("Hello, raylib-go!", 190, 200, 20, rl.DarkGray)
        
        // 结束绘制
        rl.EndDrawing()
    }
}

核心功能示例

1. 绘制图形

// 在游戏循环中添加这些绘制调用
rl.DrawCircle(100, 100, 50, rl.Red)                 // 圆形
rl.DrawRectangle(200, 100, 100, 50, rl.Blue)        // 矩形
rl.DrawTriangle(
    rl.NewVector2(400, 100),
    rl.NewVector2(350, 150),
    rl.NewVector2(450, 150),
    rl.Green)                                       // 三角形

2. 处理输入

// 在游戏循环中检测输入
if rl.IsKeyDown(rl.KeySpace) {
    rl.DrawText("SPACE按下中", 300, 300, 20, rl.Black)
}

mousePos := rl.GetMousePosition()
rl.DrawText(fmt.Sprintf("鼠标位置: %.0f, %.0f", mousePos.X, mousePos.Y), 10, 10, 20, rl.Black)

3. 2D精灵和纹理

// 在main函数开始处加载纹理
texture := rl.LoadTexture("assets/character.png")
defer rl.UnloadTexture(texture) // 记得卸载

// 在游戏循环中绘制纹理
rl.DrawTexture(texture, 300, 200, rl.White)

4. 简单的2D游戏示例

package main

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

func main() {
    rl.InitWindow(800, 450, "简单2D游戏")
    defer rl.CloseWindow()
    
    player := struct {
        x, y float32
        size float32
        speed float32
    }{
        x: 400, y: 225, size: 20, speed: 5,
    }
    
    score := 0
    
    rl.SetTargetFPS(60)
    
    for !rl.WindowShouldClose() {
        // 输入处理
        if rl.IsKeyDown(rl.KeyRight) { player.x += player.speed }
        if rl.IsKeyDown(rl.KeyLeft) { player.x -= player.speed }
        if rl.IsKeyDown(rl.KeyUp) { player.y -= player.speed }
        if rl.IsKeyDown(rl.KeyDown) { player.y += player.speed }
        
        // 简单的碰撞检测
        if player.x < 0 { player.x = 0 }
        if player.x > 800 { player.x = 800 }
        if player.y < 0 { player.y = 0 }
        if player.y > 450 { player.y = 450 }
        
        // 每帧增加分数
        score++
        
        // 绘制
        rl.BeginDrawing()
        rl.ClearBackground(rl.RayWhite)
        
        // 绘制玩家
        rl.DrawCircle(int32(player.x), int32(player.y), player.size, rl.Red)
        
        // 绘制分数
        rl.DrawText(rl.TextFormat("分数: %d", score), 10, 10, 20, rl.Black)
        
        rl.EndDrawing()
    }
}

5. 3D基础

raylib也支持3D渲染:

// 初始化3D相机
camera := rl.Camera3D{}
camera.Position = rl.NewVector3(10.0, 10.0, 10.0)
camera.Target = rl.NewVector3(0.0, 0.0, 0.0)
camera.Up = rl.NewVector3(0.0, 1.0, 0.0)
camera.Fovy = 45.0
camera.Projection = rl.CameraPerspective

// 在游戏循环中
rl.BeginMode3D(camera)
rl.DrawCube(rl.NewVector3(0.0, 0.0, 0.0), 2.0, 2.0, 2.0, rl.Red)
rl.DrawGrid(10, 1.0)
rl.EndMode3D()

视频处理

raylib也可以用于简单的视频处理:

// 加载视频
video := rl.LoadVideoStream("assets/video.mp4")
defer rl.UnloadVideoStream(video)

rl.PlayVideoStream(video)

// 在游戏循环中
if rl.IsVideoStreamPlaying(video) {
    texture := rl.GetVideoTexture(video)
    rl.DrawTexture(texture, 0, 0, rl.White)
}

音频处理

// 加载音效
sound := rl.LoadSound("assets/sound.wav")
defer rl.UnloadSound(sound)

// 播放音效
if rl.IsKeyPressed(rl.KeyP) {
    rl.PlaySound(sound)
}

资源管理最佳实践

  1. 在程序开始时加载所有资源
  2. 使用defer确保资源被正确释放
  3. 对于大型游戏,考虑资源按需加载和卸载

总结

raylib-go为Golang提供了完整的游戏开发功能,包括:

  • 2D/3D图形渲染
  • 输入处理
  • 音频播放
  • 简单的视频处理
  • 物理模拟(通过外部扩展)

它的API设计简洁直观,非常适合学习游戏开发基础,也可以用于创建实际项目。通过组合这些基本功能,你可以构建各种类型的游戏和多媒体应用程序。

回到顶部