begin refactoring movement logic out of player code into entity code.
This commit is contained in:
parent
96678ea5a2
commit
c8e8d7eb70
3 changed files with 56 additions and 36 deletions
|
@ -1,12 +1,14 @@
|
|||
import * as world from "./world.mjs";
|
||||
const BOX_SIZE = world.BOX_SIZE;
|
||||
|
||||
|
||||
|
||||
const entities = [];
|
||||
|
||||
export function create (x, y, color = "#fff") {
|
||||
export function create (box, x = 0, y = 0, color = "#fff") {
|
||||
const entity = {
|
||||
id: entities.length,
|
||||
box,
|
||||
x,
|
||||
y,
|
||||
color,
|
||||
|
@ -25,3 +27,45 @@ export function for_each (callback) {
|
|||
callback(entity, entity.id);
|
||||
});
|
||||
}
|
||||
|
||||
function clamp_pos (entity) {
|
||||
if (entity.x < 0) entity.x = 0;
|
||||
if (entity.x >= BOX_SIZE) entity.x = BOX_SIZE - 1;
|
||||
if (entity.y < 0) entity.y = 0;
|
||||
if (entity.y >= BOX_SIZE) entity.y = BOX_SIZE - 1;
|
||||
return entity;
|
||||
}
|
||||
|
||||
export function set_pos (entity, x, y) {
|
||||
entity.x = x;
|
||||
entity.y = y;
|
||||
|
||||
/*
|
||||
if (out_of_bounds(entity)) {
|
||||
const could_exit = world.exit_box();
|
||||
if (could_exit) {
|
||||
set_player_pos(0, 0);
|
||||
} else {
|
||||
set_player_pos(previous_x, previous_y);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (world.get_tile(x, y)?.type === "box") {
|
||||
world.enter_box(world.get_tile(x, y).box);
|
||||
set_player_pos(world.CENTER, world.CENTER);
|
||||
return;
|
||||
}
|
||||
*/
|
||||
clamp_pos(entity);
|
||||
}
|
||||
|
||||
export function move (entity, d_x, d_y) {
|
||||
set_pos(entity, entity.x + d_x, entity.y + d_y);
|
||||
}
|
||||
|
||||
function out_of_bounds (entity) {
|
||||
const { x, y } = entity;
|
||||
return x < 0 || x >= BOX_SIZE ||
|
||||
y < 0 || y >= BOX_SIZE
|
||||
}
|
||||
|
|
|
@ -4,53 +4,25 @@ import * as entity from "./entity.mjs";
|
|||
|
||||
|
||||
|
||||
const player = entity.create(2, 1, "#0f0");
|
||||
world.set_tile(player.x, player.y, { type: "player" });
|
||||
const player = entity.create(world.get_root(), 2, 1, "#0f0");
|
||||
|
||||
function out_of_bounds (x, y) {
|
||||
return x < 0 || x >= world.BOX_SIZE ||
|
||||
y < 0 || y >= world.BOX_SIZE
|
||||
}
|
||||
|
||||
export function set_player_pos (x, y) {
|
||||
const previous_x = player.x;
|
||||
const previous_y = player.y;
|
||||
|
||||
if (out_of_bounds(x, y)) {
|
||||
const could_exit = world.exit_box();
|
||||
if (could_exit) {
|
||||
set_player_pos(0, 0);
|
||||
} else {
|
||||
set_player_pos(previous_x, previous_y);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (world.get_tile(x, y)?.type === "box") {
|
||||
world.enter_box(world.get_tile(x, y).box);
|
||||
set_player_pos(world.CENTER, world.CENTER);
|
||||
return;
|
||||
}
|
||||
|
||||
player.x = x;
|
||||
player.y = y;
|
||||
}
|
||||
|
||||
export function move_player (d_x, d_y) {
|
||||
set_player_pos(player.x + d_x, player.y + d_y);
|
||||
export function move (d_x, d_y) {
|
||||
entity.move(player, d_x, d_y);
|
||||
}
|
||||
|
||||
on_press("ArrowLeft", _ => {
|
||||
move_player(-1, 0);
|
||||
move(-1, 0);
|
||||
});
|
||||
on_press("ArrowRight", _ => {
|
||||
move_player(1, 0);
|
||||
move(1, 0);
|
||||
});
|
||||
on_press("ArrowUp", _ => {
|
||||
move_player(0, -1);
|
||||
move(0, -1);
|
||||
});
|
||||
on_press("ArrowDown", _ => {
|
||||
move_player(0, 1);
|
||||
move(0, 1);
|
||||
});
|
||||
|
||||
on_press(" ", _ => {
|
||||
|
|
|
@ -34,3 +34,7 @@ export function exit_box () {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
export function get_root () {
|
||||
return world;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue