追随我的热情 #2:位置向量与学习更多 Zig

发布: (2026年1月1日 GMT+8 11:20)
3 min read
原文: Dev.to

Source: Dev.to

引言

我在一个工作之夜编写了一个小项目。忙碌的一天调试 Kafka 后,我回到只会绘制一个方块的 Raylib 启动代码。今天的目标是让方块移动,我成功实现了。

我并不陌生游戏开发——我在 2024 年曾尝试过一个 C++ 游戏——但对 Zig 仍然相当新手,所以这次是一次有趣的挑战。

Player 结构体

const Player = struct {
    x: usize,
    y: usize,
    width: usize,
    height: usize,
};

该结构体定义了方块在屏幕上的位置和尺寸。

构造函数

在 Zig 中,构造函数是放在结构体命名空间内的普通函数。约定使用 init 函数:

pub fn init() Player {
    return Player{
        // initializations go here
    };
}

你也可以使用 const Self = @This(); 为结构体类型起别名,但这里我没有使用。

绘制函数

pub fn draw(self: Player) void {
    const origin = rl.Vector2{
        .x = 0,
        .y = 0,
    };

    const rec = rl.Rectangle{
        .x = self.x,
        .y = self.y,
        .height = self.height,
        .width = self.width,
    };

    rl.drawRectanglePro(rec, origin, @as(f32, @floatFromInt(0)), .white);
}

rl 是 Raylib 库的别名。该函数根据玩家的字段构建一个 Rectangle 并将其绘制出来。

更新函数

最初的更新方法定义为:

pub fn update(self: Player) void {
    self.x += 1;
}

这不起作用,因为 self 是不可变的。解决办法是传入指针,以便可以修改结构体:

pub fn update(self: *Player) void {
    self.x += 1;
}

将方块居中

为了让方块大致位于屏幕中间,我尝试了:

return Player{
    .x = rl.getScreenHeight() / 2,
    .y = rl.getScreenWidth() / 2,
    .height = 10,
    .width = 10,
};

由于 rl.getScreenHeight()rl.getScreenWidth() 返回 i32,而 Raylib 的绘图函数期望 f32,我对数值进行了转换:

return Player{
    .x = @as(f32, @floatFromInt(rl.getScreenHeight())) / 2,
    .y = @as(f32, @floatFromInt(rl.getScreenWidth())) / 2,
    .height = 10,
    .width = 10,
};

这种转换满足了编译器,尽管精度仍有提升空间。

主循环与输入处理

if (rl.isKeyDown(.d)) {
    player.update();
    player.draw();
}
rl.beginDrawing();
defer rl.endDrawing();

rl.clearBackground(.dark_gray);
player.draw();

按下 D 键会让方块向右移动。

结论

今天我学到了比游戏开发本身更多的 Zig 知识。明天我计划绘制更多方块,并探索碰撞检测,让我的方块能够与它们交互。

Back to Blog

相关文章

阅读更多 »

学习 debunning

嗨,我目前正在学习编程。我决定把调试作为核心技能,尤其是能够解释代码为何会失败,而不是直接跳…