diff --git a/static/engine.js b/static/engine.js index 24efc59..b6ed952 100644 --- a/static/engine.js +++ b/static/engine.js @@ -74,21 +74,28 @@ const engine = (() => { case "removeEntity": { let node = messageArgs[0]; entities[node].forEach(([componentType, component]) => { - components[componentType].remove(component); + delete components[componentType].instances[component]; }); delete entities[node]; queue.push((_) => node.remove()); break; } case "registerComponentType": { - let componentType = messageArgs[0]; - components[componentType] = new Set(); + let [componentType, constructor] = messageArgs; + components[componentType] = { + constructor, + instances: {} + }; break; } + case "getComponentContructor": { + let [componentType] = messageArgs; + return components [componentType].constructor; + } case "addComponent": { let [entity, componentType, component] = messageArgs; entities[entity].push([componentType, component]); - components[componentType].add(component); + components[componentType].instances[entity] = component; break; } case "registerEvent": { diff --git a/static/index.html b/static/index.html index 07e9d78..b5a0830 100644 --- a/static/index.html +++ b/static/index.html @@ -1,35 +1,56 @@ + - +
+ style="position:absolute;width:50px;height:50px; + background-color:rgba(50,0,127,0.7);" + >
+
- - - - - - -
- o o o -
+ + +
+
+ try selecting a radio button to teleport +
+ + + + +
+
+
diff --git a/static/input.js b/static/input.js index 1397b68..4e2a69e 100644 --- a/static/input.js +++ b/static/input.js @@ -29,12 +29,16 @@ const inputSystem = (engine) => { }; document.addEventListener('keydown', (event) => { + event.preventDefault(); currentPresses.add(event.key); + event.stopPropagation(); process(); }); document.addEventListener('keyup', (event) => { + event.preventDefault(); currentPresses.delete(event.key); + event.stopPropagation(); process(); }); diff --git a/static/player.js b/static/player.js index eee9302..b03cfec 100644 --- a/static/player.js +++ b/static/player.js @@ -1,66 +1,16 @@ console.log("loading player system"); -const renderPlayer = (entity) => { - 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"); -}; - const playerSystem = (engine) => { const entity = document.getElementById("player"); - engine("registerEntity", entity); - let playerTransform = transform(entity); - const movementRate = 0.5; + engine("registerEntity", entity); + const playerTransform = engine ("getComponentContructor", "transform")(entity); + const move = (direction) => (delta, eventData) => { let translation = [0,0]; switch (direction) { diff --git a/static/transform.js b/static/transform.js new file mode 100644 index 0000000..f05f14f --- /dev/null +++ b/static/transform.js @@ -0,0 +1,48 @@ +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); + }; + + // 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 (); + }; +}; + +const initTransformSystem = (engine) => { + engine("registerComponentType", "transform", transform); +}; + + +// transform needs to actually provide transformation utilities