diff --git a/static/debug.js b/static/debug.js new file mode 100644 index 0000000..f4af848 --- /dev/null +++ b/static/debug.js @@ -0,0 +1,9 @@ +const ptr = document.querySelectorAll ("#pointer") [0]; +const toggler = document.querySelectorAll("#toggle-engine")[0]; +const toggleEngine = () => engine("state") == "running" + ? engine("halt") + : engine("start"); +toggler.addEventListener("click", () => { + toggleEngine(); + toggler.dataset.state=engine("state"); +}); diff --git a/static/engine.js b/static/engine.js index b6ed952..c39c086 100644 --- a/static/engine.js +++ b/static/engine.js @@ -24,6 +24,7 @@ const initEvent = () => { const engine = (() => { let queue = []; let timer; + let state; let time = Date.now(); let entities = {}; let components = {}; @@ -42,6 +43,7 @@ const engine = (() => { }; const halt = () => { console.log("halted"); + state="halted"; clearTimeout(timer); }; return (message, ...messageArgs) => { @@ -68,15 +70,15 @@ const engine = (() => { } case "registerEntity": { let node = messageArgs[0]; - entities[node] = []; + entities[node.id] = []; break; } case "removeEntity": { let node = messageArgs[0]; - entities[node].forEach(([componentType, component]) => { + entities[node.id].forEach(([componentType, component]) => { delete components[componentType].instances[component]; }); - delete entities[node]; + delete entities[node.id]; queue.push((_) => node.remove()); break; } @@ -88,14 +90,14 @@ const engine = (() => { }; break; } - case "getComponentContructor": { + case "getComponentConstructor": { let [componentType] = messageArgs; - return components [componentType].constructor; + return components [componentType].constructor(engine); } case "addComponent": { let [entity, componentType, component] = messageArgs; - entities[entity].push([componentType, component]); - components[componentType].instances[entity] = component; + entities[entity.id].push([componentType, component]); + components[componentType].instances[entity.id] = component; break; } case "registerEvent": { @@ -110,9 +112,13 @@ const engine = (() => { break; } case 'start': { + state="running"; tick(); break; } + case 'state': { + return state; + } case 'halt': { halt(); break; @@ -121,8 +127,10 @@ const engine = (() => { }; })(); +initCollisionSystem (engine); initTransformSystem(engine); inputSystem(engine); playerSystem(engine); +initEnvironmentSystem (engine); engine("start"); diff --git a/static/environment.js b/static/environment.js new file mode 100644 index 0000000..3de24b3 --- /dev/null +++ b/static/environment.js @@ -0,0 +1,22 @@ +console.log("loading environment system"); + +const initEnvironmentSystem = (engine) => { + document.querySelectorAll(".environment") + .forEach(entity => { + console.log(entity); + if (!entity.id) { + entity.id = Date.now().toString(16); + } + engine("registerEntity", entity); + console.log(entity.dataset); + let collider = engine("getComponentConstructor", "collision")( + entity, { + layers: new Set(entity.dataset.collisionLayers.split(",")), + mask: new Set(entity.dataset.collisionMask.split(",")), + collsionShape: {} + }); + engine("addComponent", entity, "collision", collider); + }); + + +} diff --git a/static/index.html b/static/index.html index b5a0830..8887805 100644 --- a/static/index.html +++ b/static/index.html @@ -2,35 +2,89 @@ + + + + -
+
+ + +
+ +
-
+ + +
+
-
+
~~this is a wall~~ (no collision handling yet)
- +
- try selecting a radio button to teleport + + try selecting a radio button to teleport + (not implemented yet) +
diff --git a/static/transform.js b/static/transform.js index f05f14f..4a719c6 100644 --- a/static/transform.js +++ b/static/transform.js @@ -1,43 +1,43 @@ console.log("loading transform system"); -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 transform = (engine) => ( + 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); + }; - // these may be pulled out in the future into a separate renderer - const setEntityStyleFromTransform = (entity) => { - entity.style.transform = - `matrix(${entity.dataset.transform.replace(/\[|\]/g,'')})`; - }; - const renderEntity = () => setEntityStyleFromTransform (entity); + // these may be pulled out in the future into a separate renderer + const setEntityStyleFromTransform = (entity) => { + entity.style.transform = + `matrix(${entity.dataset.transform.replace(/\[|\]/g,'')})`; + }; + 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 (); - }; + 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 (); + }; }; const initTransformSystem = (engine) => {