追随我的热情 #2:位置向量与学习更多 Zig
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 知识。明天我计划绘制更多方块,并探索碰撞检测,让我的方块能够与它们交互。