Add ability to move bricks

This commit is contained in:
2026-03-06 08:07:43 +01:00
parent 5c72165c8a
commit 514d3c6d4e
+73 -29
View File
@@ -38,26 +38,45 @@ const State = struct {
frame_count: i32,
mouse_pos: V2,
camera: Camera,
brick: Brick,
};
fn pointInsideRect(p: V2, rect_start: V2, rect_size: V2) bool {
var result: bool = false;
const rect_end: V2 = rect_start.add(rect_size);
const inside_x = rect_start.x < p.x and p.x < rect_end.x;
const inside_y = rect_start.y < p.y and p.y < rect_end.y;
result = inside_x and inside_y;
return result;
}
fn fillRect(
buffer: platform.OffscreenBuffer,
x: i32,
y: i32,
pos_x: i32,
pos_y: i32,
width: i32,
height: i32,
color: u32,
) void {
var pixels: []u32 = @ptrCast(@alignCast(buffer.data));
const start_x: usize = @intCast(x);
const end_x: usize = @intCast(x + width);
const start_y: usize = @intCast(y);
const end_y: usize = @intCast(y + height);
var start_x: i32 = pos_x;
var start_y: i32 = pos_y;
var end_x: i32 = pos_x + width;
var end_y: i32 = pos_y + height;
for (start_y..end_y) |i| {
for (start_x..end_x) |j| {
const idx: usize = i * @as(usize, @intCast(buffer.width)) + j;
if (start_x < 0) start_x = 0;
if (start_y < 0) start_y = 0;
if (buffer.width < end_x) end_x = buffer.width;
if (buffer.height < end_y) end_y = buffer.height;
for (@intCast(start_y) .. @intCast(end_y)) |y| {
for (@intCast(start_x) .. @intCast(end_x)) |x| {
const idx: usize = y * @as(usize, @intCast(buffer.width)) + x;
pixels[idx] = color;
}
@@ -77,11 +96,19 @@ fn fillSquare(
pub fn updateAndRender(memory: *platform.AppMemory, buffer: platform.OffscreenBuffer, input: platform.AppInput) void {
var state: *State = @ptrCast(@alignCast(memory.permanent_storage));
const mid = V2{ .x = @floatFromInt(@divTrunc(buffer.width, 2)), .y = @floatFromInt(@divTrunc(buffer.height, 2)), };
if (!memory.initialized) {
state.camera.offset.x = @floatFromInt(@divTrunc(buffer.width, 2));
state.camera.offset.y = @floatFromInt(@divTrunc(buffer.height, 2));
state.camera.offset = mid;
state.camera.pos = state.camera.pos.add(state.camera.offset);
state.brick = Brick{
.pos = V2{ .x = 50, .y = 50},
.tiles = [4][4]u32{
.{1, 1, 1, 1},
.{1, 0, 0, 0},
.{0, 0, 0, 0},
.{0, 0, 0, 0},
},
};
memory.initialized = true;
}
@@ -89,27 +116,45 @@ pub fn updateAndRender(memory: *platform.AppMemory, buffer: platform.OffscreenBu
// Update
const mouse_pos = V2{ .x = @floatCast(input.mouse_x), .y = @floatCast(input.mouse_y) };
if (input.mouse_left_down) {
const tile_size = V2{
.x = TILE_SIZE,
.y = TILE_SIZE,
};
var mouse_on_brick = false;
for (state.brick.tiles, 0..) |row, i| {
for (row, 0..) |tile, j| {
if (tile == 1) {
const tile_pos = V2{
.x = @floatFromInt(j * TILE_SIZE),
.y = @floatFromInt(i * TILE_SIZE),
};
const pos = tile_pos.add(state.brick.pos);
const camera_pos = pos.add(state.camera.pos);
if (pointInsideRect(state.mouse_pos, camera_pos, tile_size)) {
if (input.mouse_left_down) {
const diff = mouse_pos.sub(state.mouse_pos);
state.brick.pos = state.brick.pos.add(diff);
mouse_on_brick = true;
}
}
}
}
}
if (input.mouse_left_down and !mouse_on_brick) {
const diff = mouse_pos.sub(state.mouse_pos);
state.camera.pos = state.camera.pos.add(diff);
}
state.mouse_pos = mouse_pos;
const brick = Brick{
.pos = V2{ .x = 50, .y = 50},
.tiles = [4][4]u32{
.{1, 1, 1, 1},
.{1, 0, 0, 0},
.{0, 0, 0, 0},
.{0, 0, 0, 0},
},
};
state.mouse_pos = mouse_pos;
// Render
fillRect(buffer, 0, 0, buffer.width, buffer.height, 0xFFFFFFFF);
const board_pos = V2{ .x = 64, .y = 64 };
const board_pos = mid;
for (0..7) |i| {
for (0..7) |j| {
if (i == 0 and j == 6) continue;
@@ -128,17 +173,16 @@ pub fn updateAndRender(memory: *platform.AppMemory, buffer: platform.OffscreenBu
}
}
for (brick.tiles, 0..) |row, i| {
for (state.brick.tiles, 0..) |row, i| {
for (row, 0..) |tile, j| {
if (tile == 1) {
const pos = V2{
.x = @floatFromInt(j * TILE_SIZE + 8),
.y = @floatFromInt(i * TILE_SIZE + 8),
.x = @floatFromInt(j * TILE_SIZE),
.y = @floatFromInt(i * TILE_SIZE),
};
const camera_pos = brick.pos.add(pos).add(state.camera.pos);
const camera_pos = state.brick.pos.add(pos).add(state.camera.pos);
fillSquare(buffer, @intFromFloat(camera_pos.x), @intFromFloat(camera_pos.y), 30, 0xFFFF0000);
}
}
}