commit 0f66e7198b692c7835833cc07af4293806e9fbb1 Author: oxaliq Date: Sun May 19 00:37:53 2024 -0400 init naive movement diff --git a/static/engine.js b/static/engine.js new file mode 100644 index 0000000..ac1326c --- /dev/null +++ b/static/engine.js @@ -0,0 +1,82 @@ +console.log("loading engine"); + +const initEvent = () => { + let subscribers = {}; + + return (message, ...messageArgs) => { + switch (message) { + case "addSubscriber": + let subscriberName = messageArgs[0]; + let subscriberFunc = messageArgs[1]; + subscribers[subscriberName] = subscriberFunc; + break; + case "raise": + let delta = messageArgs[0]; + let eventData = messageArgs[1]; + Object.entries(subscribers).forEach(([id, subscriber]) => { + subscriber(delta, eventData); + }); + break; + } + }; +}; + +const engine = (() => { + let queue = []; + let timer; + let time = Date.now(); + let entities = {}; + let events = {}; + + const engineTick = 1000 / 60; + const tick = () => { + let now = Date.now(); + let delta = now - time; + time = now; + while (queue.length > 0) { + let eventName = queue.shift(); + events[eventName]("raise", delta); + } + timer = setTimeout(tick, engineTick); + }; + const halt = () => { + console.log("halted"); + clearTimeout(timer); + }; + return (message, ...messageArgs) => { + switch (message) { + case "queueEvent": + queue.push(messageArgs[0]); + break; + case "events": + return events; + break; + case "registerEntity": + break; + case "removeEntity": + break; + case "registerEvent": + {let eventName = messageArgs[0]; + let newEvent = initEvent(); + events[eventName] = newEvent;} + break; + case "subscribeToEvent": + {let eventName = messageArgs[0]; + let subscriberName = messageArgs[1]; + let newSubscriber = messageArgs[2]; + events[eventName]("addSubscriber", subscriberName, newSubscriber);} + break; + case 'start': + tick(); + break; + case 'halt': + halt(); + break; + }; + }; +})(); + +inputSystem(engine); +playerSystem(engine); + +engine("start"); diff --git a/static/index.html b/static/index.html new file mode 100644 index 0000000..4d68ab9 --- /dev/null +++ b/static/index.html @@ -0,0 +1,27 @@ + + + + + + + + +
+
+ + + + + + +
+ o o o +
+
+ + diff --git a/static/input.js b/static/input.js new file mode 100644 index 0000000..44e7f20 --- /dev/null +++ b/static/input.js @@ -0,0 +1,27 @@ +console.log("loading input system"); + + +const inputSystem = (engine) => { + engine("registerEvent", "moveDown"); + engine("registerEvent", "moveUp"); + engine("registerEvent", "moveLeft"); + engine("registerEvent", "moveRight"); + + document.addEventListener('keydown', (event) => { + let target = event.target; + switch (event.key) { + case "ArrowDown": + engine("queueEvent", "moveDown", {target}); + break; + case "ArrowUp": + engine("queueEvent", "moveUp", {target}); + break; + case "ArrowLeft": + engine("queueEvent", "moveLeft", {target}); + break; + case "ArrowRight": + engine("queueEvent", "moveRight", {target}); + break; + } + }); +}; diff --git a/static/player.js b/static/player.js new file mode 100644 index 0000000..bee8b8d --- /dev/null +++ b/static/player.js @@ -0,0 +1,36 @@ +console.log("loading player system"); + +const renderPlayer = (entity) => { + entity.style.left = `${entity.dataset.posX}px`; + entity.style.top = `${entity.dataset.posY}px`; +}; + +const playerSystem = (engine) => { + const entity = document.getElementById("player"); + engine("registerEntity", entity); + + const movementRate = 0.5; + const move = (direction) => (delta, eventData) => { + let lastPos = [Number(entity.dataset.posX), Number(entity.dataset.posY)]; + switch (direction) { + case "left": + entity.dataset.posX = Number(lastPos[0] - (movementRate * delta)); + break; + case "right": + entity.dataset.posX = Number(lastPos[0] + (movementRate * delta)); + break; + case "up": + entity.dataset.posY = Number(lastPos[1] - (movementRate * delta)); + break; + case "down": + entity.dataset.posY = Number(lastPos[1] + (movementRate * delta)); + break; + } + renderPlayer(entity); + }; + + engine("subscribeToEvent", "moveLeft", "movePlayerLeft", move("left")); + engine("subscribeToEvent", "moveRight", "movePlayerRight", move("right")); + engine("subscribeToEvent", "moveUp", "movePlayerUp", move("up")); + engine("subscribeToEvent", "moveDown", "movePlayerDown", move("down")); +};