diff --git a/assets/actor.png b/assets/actor.png new file mode 100644 index 0000000..fc87c09 Binary files /dev/null and b/assets/actor.png differ diff --git a/assets/chicken.png b/assets/chicken.png new file mode 100644 index 0000000..60f8e41 Binary files /dev/null and b/assets/chicken.png differ diff --git a/assets/pot.png b/assets/pot.png new file mode 100644 index 0000000..cb0ccd3 Binary files /dev/null and b/assets/pot.png differ diff --git a/assets/shard.png b/assets/shard.png new file mode 100644 index 0000000..6d084a1 Binary files /dev/null and b/assets/shard.png differ diff --git a/src/actors/chicken.js b/src/actors/chicken.js index cc26186..22d916a 100644 --- a/src/actors/chicken.js +++ b/src/actors/chicken.js @@ -17,7 +17,7 @@ export function addChicken(k, world, tile) { const chicken = k.add([ ...visual(k, "chicken"), k.pos(p), - k.area({ collisionIgnore: ["player", "link", "chicken"] }), + k.area({ collisionIgnore: ["player", "link", "chicken"], scale: 0.7 }), k.body(), k.state("idle", ["idle", "chase"]), "chicken", @@ -49,8 +49,10 @@ export function addChicken(k, world, tile) { } if (chicken.wanderTarget) { const d = world.tc(chicken.wanderTarget).sub(chicken.pos); - if (d.len() > 2) chicken.move(d.unit().scale(CHICKEN_SPEED * 0.4)); - else chicken.wanderTarget = null; + if (d.len() > 2) { + if (Math.abs(d.x) > 1) chicken.flipX = d.x < 0; + chicken.move(d.unit().scale(CHICKEN_SPEED * 0.4)); + } else chicken.wanderTarget = null; } }); @@ -64,7 +66,10 @@ export function addChicken(k, world, tile) { return; } const d = tgt.pos.sub(chicken.pos); - if (d.len() > 2) chicken.move(d.unit().scale(CHICKEN_SPEED)); + if (d.len() > 2) { + if (Math.abs(d.x) > 1) chicken.flipX = d.x < 0; + chicken.move(d.unit().scale(CHICKEN_SPEED)); + } }); chicken.onUpdate(() => { diff --git a/src/actors/player.js b/src/actors/player.js index 05b9289..550cabb 100644 --- a/src/actors/player.js +++ b/src/actors/player.js @@ -8,7 +8,7 @@ export function addPlayer(k, world) { const player = k.add([ ...visual(k, "player"), k.pos(p), - k.area({ collisionIgnore: ["link", "chicken"] }), + k.area({ collisionIgnore: ["link", "chicken"], scale: 0.4 }), k.body(), // dynamic body: pushed out of static obstacles/walls "player", ]); diff --git a/src/main.js b/src/main.js index a7ac3da..5edb799 100644 --- a/src/main.js +++ b/src/main.js @@ -17,6 +17,10 @@ k.setGravity(0); // Actor sprites. k.loadSprite("link", "assets/link.png"); +k.loadSprite("grass", "assets/grasss.png"); +k.loadSprite("player", "assets/actor.png"); +k.loadSprite("shard", "assets/shard.png"); +k.loadSprite("chicken", "assets/chicken.png"); // Background music. Browsers block autoplay until the user interacts, so start // looping on the first key/click and keep the handle across scene changes. diff --git a/src/pots.js b/src/pots.js index 38261ad..71dd5ad 100644 --- a/src/pots.js +++ b/src/pots.js @@ -112,9 +112,9 @@ function spawnShard(k, world, tile) { const s = k.add([ ...visual(k, "shard"), k.pos(p.x + jx, p.y + jy), - k.area(), + k.area({ scale: 0.55 }), k.z(p.y), - k.rotate(k.rand() * 360), + k.rotate((k.rand() - 0.5) * 24), // slight tilt; keep debris upright-ish "shard", ]); return s; diff --git a/src/sprites.js b/src/sprites.js index 7ab4fd4..8c63b30 100644 --- a/src/sprites.js +++ b/src/sprites.js @@ -17,6 +17,10 @@ const SPEC = { // fall back to the placeholder shapes in SPEC. const SPRITES = { link: { name: "link", scale: 0.44 }, + grass: { name: "grass", scale: 1.6 }, // 16px tile -> ~26px clump + player: { name: "player", scale: 0.13 }, // 428px art -> ~52px tall + shard: { name: "shard", scale: 0.085 }, // 500px debris -> ~26px clump + chicken: { name: "chicken", scale: 1.1 }, }; export function visual(k, kind) {