Add ability to move bricks
This commit is contained in:
+73
-29
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user