Physics
parent
5961061583
commit
54d6aab97e
|
@ -3,7 +3,7 @@
|
||||||
"infinite":false,
|
"infinite":false,
|
||||||
"layers":[
|
"layers":[
|
||||||
{
|
{
|
||||||
"data":[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 1, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 178, 180, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 1, 19, 52, 1, 50, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 1, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 54, 55, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 33, 54, 1, 1, 1, 1, 1, 1, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 51, 1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
"data":[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 1, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 1, 19, 52, 1, 50, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 1, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 54, 55, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 33, 54, 1, 1, 1, 1, 1, 1, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 51, 1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||||||
"height":20,
|
"height":20,
|
||||||
"id":1,
|
"id":1,
|
||||||
"name":"solid",
|
"name":"solid",
|
||||||
|
@ -15,7 +15,7 @@
|
||||||
"y":0
|
"y":0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
"data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 180, 0, 0, 0, 0, 0, 0, 178, 180, 0, 0, 0, 0, 0, 0, 178, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
"height":20,
|
"height":20,
|
||||||
"id":2,
|
"id":2,
|
||||||
"name":"conduit",
|
"name":"conduit",
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<data encoding="csv">
|
<data encoding="csv">
|
||||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||||
1,1,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,1,1,
|
1,1,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,1,1,
|
||||||
1,39,1,1,1,1,1,1,1,178,180,1,1,1,1,1,1,1,37,1,
|
1,39,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,37,1,
|
||||||
1,39,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,37,1,
|
1,39,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,37,1,
|
||||||
1,1,19,52,1,50,19,19,19,19,19,19,19,19,19,19,19,19,1,1,
|
1,1,19,52,1,50,19,19,19,19,19,19,19,19,19,19,19,19,1,1,
|
||||||
1,39,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,37,1,
|
1,39,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,37,1,
|
||||||
|
@ -32,7 +32,7 @@
|
||||||
<data encoding="csv">
|
<data encoding="csv">
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
131,131,180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,130,0,
|
131,131,180,0,0,0,0,0,0,178,180,0,0,0,0,0,0,178,130,0,
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,0,
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,0,
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,0,
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,0,
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,0,
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,0,
|
||||||
|
|
BIN
assets/tiles.png
BIN
assets/tiles.png
Binary file not shown.
Before Width: | Height: | Size: 675 B After Width: | Height: | Size: 666 B |
File diff suppressed because one or more lines are too long
155
src/main.zig
155
src/main.zig
|
@ -3,8 +3,16 @@ const w4 = @import("wasm4.zig");
|
||||||
const ecs = @import("ecs.zig");
|
const ecs = @import("ecs.zig");
|
||||||
const assets = @import("assets");
|
const assets = @import("assets");
|
||||||
|
|
||||||
|
const Vec2 = std.meta.Vector(2, i32);
|
||||||
const Vec2f = std.meta.Vector(2, f32);
|
const Vec2f = std.meta.Vector(2, f32);
|
||||||
const AABB = struct { offset: Vec2f, size: Vec2f };
|
const AABB = struct {
|
||||||
|
pos: Vec2f,
|
||||||
|
size: Vec2f,
|
||||||
|
|
||||||
|
pub fn addv(this: @This(), vec2f: Vec2f) @This() {
|
||||||
|
return @This(){ .pos = this.pos + vec2f, .size = this.size };
|
||||||
|
}
|
||||||
|
};
|
||||||
const Anim = struct {
|
const Anim = struct {
|
||||||
time: usize = 0,
|
time: usize = 0,
|
||||||
currentOp: usize = 0,
|
currentOp: usize = 0,
|
||||||
|
@ -49,6 +57,8 @@ const Anim = struct {
|
||||||
|
|
||||||
// Components
|
// Components
|
||||||
const Pos = Vec2f;
|
const Pos = Vec2f;
|
||||||
|
/// Stores last position, for velocity
|
||||||
|
const LastPos = Vec2f;
|
||||||
const Control = struct {
|
const Control = struct {
|
||||||
controller: enum { player },
|
controller: enum { player },
|
||||||
state: enum { stand, walk, jump, fall },
|
state: enum { stand, walk, jump, fall },
|
||||||
|
@ -61,6 +71,7 @@ const Kinematic = struct { col: AABB };
|
||||||
const Wire = struct { end: Vec2f, grabbed: ?enum { begin, end } = null };
|
const Wire = struct { end: Vec2f, grabbed: ?enum { begin, end } = null };
|
||||||
const Component = struct {
|
const Component = struct {
|
||||||
pos: Pos,
|
pos: Pos,
|
||||||
|
lastpos: LastPos,
|
||||||
control: Control,
|
control: Control,
|
||||||
sprite: Sprite,
|
sprite: Sprite,
|
||||||
staticAnim: StaticAnim,
|
staticAnim: StaticAnim,
|
||||||
|
@ -96,30 +107,31 @@ const playerAnim = pac: {
|
||||||
|
|
||||||
export fn start() void {
|
export fn start() void {
|
||||||
_ = world.create(.{
|
_ = world.create(.{
|
||||||
.pos = .{ 76, 76 },
|
.pos = .{ 100, 80 },
|
||||||
|
.lastpos = .{ 100, 80 },
|
||||||
.control = .{ .controller = .player, .state = .stand },
|
.control = .{ .controller = .player, .state = .stand },
|
||||||
.sprite = .{ .offset = .{ -4, -8 }, .size = .{ 8, 8 }, .index = 0, .flags = .{ .bpp = .b1 } },
|
.sprite = .{ .offset = .{ -4, -8 }, .size = .{ 8, 8 }, .index = 0, .flags = .{ .bpp = .b1 } },
|
||||||
.controlAnim = ControlAnim{
|
.controlAnim = ControlAnim{
|
||||||
.anims = playerAnim,
|
.anims = playerAnim,
|
||||||
.state = Anim{ .anim = &.{} },
|
.state = Anim{ .anim = &.{} },
|
||||||
},
|
},
|
||||||
.kinematic = .{ .col = .{ .offset = .{ -2, -8 }, .size = .{ 4, 8 } } },
|
.kinematic = .{ .col = .{ .pos = .{ -3, -6 }, .size = .{ 5, 5 } } },
|
||||||
}) catch unreachable;
|
}) catch unreachable;
|
||||||
|
|
||||||
for (assets.wire) |wire| {
|
for (assets.wire) |wire| {
|
||||||
w4.trace("begin {}, end {}", .{ wire[0], wire[1] });
|
// w4.trace("begin {}, end {}", .{ wire[0], wire[1] });
|
||||||
const begin = Vec2f{ @intToFloat(f32, wire[0][0]), @intToFloat(f32, wire[0][1]) };
|
const begin = Vec2f{ @intToFloat(f32, wire[0][0]), @intToFloat(f32, wire[0][1]) };
|
||||||
const end = Vec2f{ @intToFloat(f32, wire[1][0]), @intToFloat(f32, wire[1][1]) };
|
const end = Vec2f{ @intToFloat(f32, wire[1][0]), @intToFloat(f32, wire[1][1]) };
|
||||||
w4.trace("{}, {}, begin {d:3.0}, end {d:3.0}", .{ wire[0], wire[1], begin, end });
|
// w4.trace("{}, {}, begin {d:3.0}, end {d:3.0}", .{ wire[0], wire[1], begin, end });
|
||||||
const w = Wire{ .end = end };
|
const w = Wire{ .end = end };
|
||||||
const e = world.create(.{
|
_ = world.create(.{
|
||||||
.pos = begin,
|
.pos = begin,
|
||||||
.wire = w,
|
.wire = w,
|
||||||
}) catch {
|
}) catch {
|
||||||
w4.trace("problem", .{});
|
w4.trace("problem", .{});
|
||||||
unreachable;
|
unreachable;
|
||||||
};
|
};
|
||||||
w4.trace("{}", .{world.components.items(.wire)[e]});
|
// w4.trace("{}", .{world.components.items(.wire)[e]});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,8 +139,9 @@ export fn update() void {
|
||||||
w4.DRAW_COLORS.* = 0x0004;
|
w4.DRAW_COLORS.* = 0x0004;
|
||||||
w4.rect(.{ 0, 0 }, .{ 160, 160 });
|
w4.rect(.{ 0, 0 }, .{ 160, 160 });
|
||||||
|
|
||||||
world.process(1, &.{ .pos, .kinematic }, kinematicProcess);
|
world.process(1, &.{ .pos, .lastpos }, velocityProcess);
|
||||||
world.process(1, &.{ .pos, .control }, controlProcess);
|
world.process(1, &.{ .pos, .control }, controlProcess);
|
||||||
|
world.process(1, &.{ .pos, .lastpos, .kinematic }, kinematicProcess);
|
||||||
world.process(1, &.{ .sprite, .staticAnim }, staticAnimProcess);
|
world.process(1, &.{ .sprite, .staticAnim }, staticAnimProcess);
|
||||||
world.process(1, &.{ .sprite, .controlAnim, .control }, controlAnimProcess);
|
world.process(1, &.{ .sprite, .controlAnim, .control }, controlAnimProcess);
|
||||||
world.process(1, &.{ .pos, .sprite }, drawProcess);
|
world.process(1, &.{ .pos, .sprite }, drawProcess);
|
||||||
|
@ -148,15 +161,8 @@ export fn update() void {
|
||||||
}
|
}
|
||||||
|
|
||||||
world.process(1, &.{ .pos, .wire }, wireProcess);
|
world.process(1, &.{ .pos, .wire }, wireProcess);
|
||||||
// for (assets.wire) |wire| {
|
|
||||||
// w4.DRAW_COLORS.* = 0x0001;
|
|
||||||
// w4.line(wire[0], wire[1]);
|
|
||||||
// w4.DRAW_COLORS.* = 0x0031;
|
|
||||||
// if (distance(wire[0], w4.MOUSE.pos()) < 8) w4.oval(wire[0] - w4.Vec2{ 2, 2 }, w4.Vec2{ 5, 5 });
|
|
||||||
// if (distance(wire[1], w4.MOUSE.pos()) < 8) w4.oval(wire[1] - w4.Vec2{ 2, 2 }, w4.Vec2{ 5, 5 });
|
|
||||||
// }
|
|
||||||
|
|
||||||
mouseLast = w4.MOUSE.buttons.left;
|
mouseLast = w4.MOUSE.buttons.left;
|
||||||
|
button_1_last = w4.GAMEPAD1.button_1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn distance(a: w4.Vec2, b: w4.Vec2) i32 {
|
fn distance(a: w4.Vec2, b: w4.Vec2) i32 {
|
||||||
|
@ -176,6 +182,9 @@ fn wireProcess(_: f32, pos: *Pos, wire: *Wire) void {
|
||||||
w4.line(begin, end);
|
w4.line(begin, end);
|
||||||
w4.DRAW_COLORS.* = 0x0031;
|
w4.DRAW_COLORS.* = 0x0031;
|
||||||
|
|
||||||
|
const drawdistance = 16;
|
||||||
|
const clickdistance = 3;
|
||||||
|
|
||||||
if (wire.grabbed) |whichEnd| {
|
if (wire.grabbed) |whichEnd| {
|
||||||
switch (whichEnd) {
|
switch (whichEnd) {
|
||||||
.begin => pos.* = vec2tovec2f(w4.MOUSE.pos()),
|
.begin => pos.* = vec2tovec2f(w4.MOUSE.pos()),
|
||||||
|
@ -183,13 +192,13 @@ fn wireProcess(_: f32, pos: *Pos, wire: *Wire) void {
|
||||||
}
|
}
|
||||||
if (w4.MOUSE.buttons.left and !mouseLast) wire.grabbed = null;
|
if (w4.MOUSE.buttons.left and !mouseLast) wire.grabbed = null;
|
||||||
} else {
|
} else {
|
||||||
if (distance(begin, w4.MOUSE.pos()) < 8) {
|
if (distance(begin, w4.MOUSE.pos()) < drawdistance) {
|
||||||
w4.oval(begin - w4.Vec2{ 2, 2 }, w4.Vec2{ 5, 5 });
|
w4.oval(begin - w4.Vec2{ 2, 2 }, w4.Vec2{ 5, 5 });
|
||||||
if (w4.MOUSE.buttons.left and !mouseLast) wire.grabbed = .begin;
|
if (distance(begin, w4.MOUSE.pos()) < clickdistance and w4.MOUSE.buttons.left and !mouseLast) wire.grabbed = .begin;
|
||||||
}
|
}
|
||||||
if (distance(end, w4.MOUSE.pos()) < 8) {
|
if (distance(end, w4.MOUSE.pos()) < drawdistance) {
|
||||||
w4.oval(end - w4.Vec2{ 2, 2 }, w4.Vec2{ 5, 5 });
|
w4.oval(end - w4.Vec2{ 2, 2 }, w4.Vec2{ 5, 5 });
|
||||||
if (w4.MOUSE.buttons.left and !mouseLast) wire.grabbed = .end;
|
if (distance(end, w4.MOUSE.pos()) < clickdistance and w4.MOUSE.buttons.left and !mouseLast) wire.grabbed = .end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -221,23 +230,113 @@ fn controlAnimProcess(_: f32, sprite: *Sprite, anim: *ControlAnim, control: *Con
|
||||||
anim.state.update(&sprite.index);
|
anim.state.update(&sprite.index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var button_1_last = false;
|
||||||
|
|
||||||
fn controlProcess(_: f32, pos: *Pos, control: *Control) void {
|
fn controlProcess(_: f32, pos: *Pos, control: *Control) void {
|
||||||
var delta = Vec2f{ 0, 0 };
|
var delta = Vec2f{ 0, 0 };
|
||||||
if (w4.GAMEPAD1.button_up) delta[1] -= 1;
|
if (w4.GAMEPAD1.button_1 and !button_1_last) delta[1] -= 20;
|
||||||
if (w4.GAMEPAD1.button_down) delta[1] += 1;
|
|
||||||
if (w4.GAMEPAD1.button_left) delta[0] -= 1;
|
if (w4.GAMEPAD1.button_left) delta[0] -= 1;
|
||||||
if (w4.GAMEPAD1.button_right) delta[0] += 1;
|
if (w4.GAMEPAD1.button_right) delta[0] += 1;
|
||||||
if (delta[0] != 0 or delta[1] != 0) {
|
if (delta[0] != 0 or delta[1] != 0) {
|
||||||
control.state = .walk;
|
control.state = .walk;
|
||||||
pos.* += delta;
|
var move = delta * @splat(2, @as(f32, 0.2));
|
||||||
|
pos.* += move;
|
||||||
|
if (delta[0] > 0) control.facing = .right;
|
||||||
|
if (delta[0] < 0) control.facing = .left;
|
||||||
} else {
|
} else {
|
||||||
control.state = .stand;
|
control.state = .stand;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn kinematicProcess(_: f32, pos: *Pos, kinematic: *Kinematic) void {
|
/// pos should be in tile coordinates, not world coordinates
|
||||||
pos.* += Vec2f{ 0, 1 };
|
fn get_tile(x: i32, y: i32) ?u8 {
|
||||||
var topleft = pos.* + kinematic.col.offset;
|
if (x < 0 or x > 19 or y < 0 or y > 19) return null;
|
||||||
var bottomright = topleft + kinematic.col.size;
|
const i = x + y * 20;
|
||||||
if (bottomright[1] > 160) pos.*[1] = 160 - (kinematic.col.offset[1] + kinematic.col.size[1]);
|
return assets.solid[@intCast(u32, i)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// rect should be absolutely positioned. Add pos to kinematic.collider
|
||||||
|
fn level_collide(rect: AABB) std.BoundedArray(AABB, 9) {
|
||||||
|
const tileSize = 8;
|
||||||
|
const top_left = rect.pos / @splat(2, @as(f32, tileSize));
|
||||||
|
const bot_right = (rect.pos + rect.size) / @splat(2, @as(f32, tileSize));
|
||||||
|
var collisions = std.BoundedArray(AABB, 9).init(0) catch unreachable;
|
||||||
|
|
||||||
|
var i: isize = @floatToInt(i32, top_left[0]);
|
||||||
|
while (i <= @floatToInt(i32, bot_right[0])) : (i += 1) {
|
||||||
|
var a: isize = @floatToInt(i32, top_left[1]);
|
||||||
|
while (a <= @floatToInt(i32, bot_right[1])) : (a += 1) {
|
||||||
|
var tile = get_tile(i, a);
|
||||||
|
if (tile == null or tile.? != 1) {
|
||||||
|
collisions.append(AABB{
|
||||||
|
.pos = Vec2f{
|
||||||
|
@intToFloat(f32, i * tileSize),
|
||||||
|
@intToFloat(f32, a * tileSize),
|
||||||
|
},
|
||||||
|
.size = Vec2f{ tileSize, tileSize },
|
||||||
|
}) catch unreachable;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return collisions;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn kinematicProcess(_: f32, pos: *Pos, lastpos: *LastPos, kinematic: *Kinematic) void {
|
||||||
|
var next = lastpos.*;
|
||||||
|
next[0] = pos.*[0];
|
||||||
|
var hcol = level_collide(kinematic.col.addv(next));
|
||||||
|
if (hcol.len > 0) {
|
||||||
|
next[0] = lastpos.*[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
next[1] = pos.*[1];
|
||||||
|
var vcol = level_collide(kinematic.col.addv(next));
|
||||||
|
if (vcol.len > 0) {
|
||||||
|
next[1] = lastpos.*[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
pos.* = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn velocityProcess(_: f32, pos: *Pos, lastpos: *LastPos) void {
|
||||||
|
var vel = pos.* - lastpos.*;
|
||||||
|
|
||||||
|
vel *= @splat(2, @as(f32, 0.9));
|
||||||
|
vel += Vec2f{ 0, 0.25 };
|
||||||
|
vel = @minimum(Vec2f{ 8, 8 }, @maximum(Vec2f{ -8, -8 }, vel));
|
||||||
|
|
||||||
|
lastpos.* = pos.*;
|
||||||
|
pos.* += vel;
|
||||||
|
}
|
||||||
|
|
||||||
|
// fn gravityprocess(dt: f32, posptr: *comp.pos, gravityptr: *comp.gravity) void {
|
||||||
|
// _ = dt;
|
||||||
|
// posptr.*.cur = posptr.*.cur.add(gravityptr.*);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// fn collisionprocess(_: f32, posptr: *comp.pos, kinematicptr: *comp.kinematic) void {
|
||||||
|
// const pos = posptr.*.cur;
|
||||||
|
// const old = posptr.*.old;
|
||||||
|
// const kinematic = kinematicptr.*;
|
||||||
|
|
||||||
|
// var next = vec.init(pos.x, old.y);
|
||||||
|
// var collisions = level_collide(kinematic.collider.addv(next));
|
||||||
|
// if (collisions.len > 0) {
|
||||||
|
// next.x = old.x;
|
||||||
|
// kinematicptr.*.onwall = true;
|
||||||
|
// } else {
|
||||||
|
// kinematicptr.*.onwall = false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// next.y = pos.y;
|
||||||
|
// collisions = level_collide(kinematic.collider.addv(next));
|
||||||
|
// if (collisions.len > 0) {
|
||||||
|
// next.y = old.y;
|
||||||
|
// kinematicptr.*.onground = true;
|
||||||
|
// } else {
|
||||||
|
// kinematicptr.*.onground = false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// posptr.*.cur = next;
|
||||||
|
// }
|
||||||
|
|
Loading…
Reference in New Issue