环境
- Time 2024-03-07
- Zig 0.12.0-dev.3152+90c1a2c41
- WSL-Ubuntu 22.04.3 LTS
- raylib 5.0
前言
说明
参考资料:
- 《游戏开发:世嘉新人培训教材》
目标
将所有的代码全部放到 main.zig 中太多了,新增一个 map.zig 存放地图相关的逻辑。
main
将 initialize 和 draw 方法移动到 map.zig 中,重命名为 init 方法,新增了 deinit 方法来清理资源。
所有涉及到地图相关的定义需要加 map 进行访问。
pub fn main() void {// 初始化地图var state: [map.stageLength]map.MapItem = undefined;map.init(&state);defer map.deinit();const stdin = std.io.getStdIn().reader();while (true) {// 画出游戏地图ray.BeginDrawing();ray.ClearBackground(ray.WHITE);map.draw(&state);ray.EndDrawing();// 检查游戏胜利条件if (checkClear(&state)) break;std.debug.print("a:left d:right w:up s:down. command?\n", .{});// 获取用户输入const char = inputChar(stdin);// 根据输入更新游戏地图update(&state, char);}// 游戏胜利std.debug.print("Congratulation's! you win.\n", .{});
}
MapItem
const std = @import("std");
const ray = @import("raylib.zig");// 定义地图的类型
pub const MapItem = enum(u8) {SPACE = ' ',WALL = '#',GOAL = '.',BLOCK = 'o',BLOCK_ON_GOAL = 'O',MAN = 'p',MAN_ON_GOAL = 'P',fn fromInt(value: u8) MapItem {return @enumFromInt(value);}fn toInt(self: MapItem) u8 {return @intFromEnum(self);}
};
地图相关变量
// 定义地图
const stageMap =\\########\\# .. p #\\# oo #\\# #\\########
;pub const stageWidth = 8;
pub const stageHeight = 5;
pub const stageLength = stageHeight * stageWidth;
const SCALE = 32; // 放大倍数
const BOARDER = 1; // 边框
init 和 deinit
pub fn init(stage: []MapItem) void {var index: usize = 0;for (stageMap) |value| {if (value == '\n') continue;stage[index] = MapItem.fromInt(value);index += 1;}ray.InitWindow(320, 240, "推箱子");
}pub fn deinit() void {ray.CloseWindow();
}
剩下的 draw 等方法,直接从 main.zig 复制到 map.zig 中即可。
效果
和前一节的效果一致,只修改了代码的结构,未修改逻辑。
总结
将源码拆分成了两个文件,一个 main.zig,另一个是 map.zig。