html-tower/static/player.js

91 lines
2.9 KiB
JavaScript
Raw Normal View History

2024-05-19 04:37:53 +00:00
console.log("loading player system");
const renderPlayer = (entity) => {
2024-05-19 22:07:43 +00:00
entity.style.transform = `matrix(${entity.dataset.transform.replace(/\[|\]/g,'')})`;
// entity.style.left = `${entity.dataset.posX}px`;
// entity.style.top = `${entity.dataset.posY}px`;
};
const setEntityStyleFromTransform = (entity) => {
entity.style.transform = `matrix(${entity.dataset.transform.replace(/\[|\]/g,'')})`;
};
const transform =
(entity,
transformData = { x: {x: 1, y:0}, y: {x:0, y:1}, o: {x:0,y:0}}
) => {
let {x, y, o} = transformData;
let transform = [x.x, x.y, y.x, y.y, o.x, o.y];
const updateEntity = () => {
entity.dataset.transform = JSON.stringify (transform);
};
const renderEntity = () => setEntityStyleFromTransform (entity);
return (message, ...messageArgs) => {
switch (message) {
case "origin": {
return [transform[4], transform[5]];
}
case "x": {
return [transform[0], transform[1]];
}
case "y": {
return [transform[2], transform [3]];
}
case "translate": {
let [xTranslation, yTranslation] = messageArgs [0];
transform [4] += xTranslation;
transform [5] += yTranslation;
break;
}
}
updateEntity ();
renderEntity ();
};
};
// transform needs to actually provide transformation utilities
const collision = (entity) => {
// look through engine's collision components for overlap
};
const initTransformSystem = (engine) => {
engine("registerComponentType", "transform");
2024-05-19 04:37:53 +00:00
};
const playerSystem = (engine) => {
const entity = document.getElementById("player");
engine("registerEntity", entity);
2024-05-19 22:07:43 +00:00
let playerTransform = transform(entity);
2024-05-19 04:37:53 +00:00
const movementRate = 0.5;
const move = (direction) => (delta, eventData) => {
2024-05-19 22:07:43 +00:00
let translation = [0,0];
2024-05-19 04:37:53 +00:00
switch (direction) {
case "left":
2024-05-19 22:07:43 +00:00
translation [0] = -( movementRate * delta );
2024-05-19 04:37:53 +00:00
break;
case "right":
2024-05-19 22:07:43 +00:00
translation[0] = movementRate * delta;
2024-05-19 04:37:53 +00:00
break;
case "up":
2024-05-19 22:07:43 +00:00
translation[1] = - ( movementRate * delta );
2024-05-19 04:37:53 +00:00
break;
case "down":
2024-05-19 22:07:43 +00:00
translation[1] = movementRate * delta;
2024-05-19 04:37:53 +00:00
break;
}
2024-05-19 22:07:43 +00:00
playerTransform("translate", translation);
2024-05-19 04:37:53 +00:00
};
2024-05-19 22:07:43 +00:00
engine("registerEntity", entity);
engine("addComponent", entity, "transform", playerTransform);
// engine("")
2024-05-19 04:37:53 +00:00
engine("subscribeToEvent", "moveLeft", "movePlayerLeft", move("left"));
engine("subscribeToEvent", "moveRight", "movePlayerRight", move("right"));
engine("subscribeToEvent", "moveUp", "movePlayerUp", move("up"));
engine("subscribeToEvent", "moveDown", "movePlayerDown", move("down"));
};