82 lines
2.1 KiB
JavaScript
82 lines
2.1 KiB
JavaScript
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");
|