init naive movement
This commit is contained in:
commit
0f66e7198b
4 changed files with 172 additions and 0 deletions
82
static/engine.js
Normal file
82
static/engine.js
Normal file
|
@ -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");
|
27
static/index.html
Normal file
27
static/index.html
Normal file
|
@ -0,0 +1,27 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<script src="input.js" defer></script>
|
||||
<script src="player.js" defer></script>
|
||||
<script src="engine.js" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="player"
|
||||
data-sprite="player.png"
|
||||
data-pos-x="0"
|
||||
data-pos-y="0"
|
||||
id="player"
|
||||
style="position:absolute;width:50px;height:50px;background-color:black;"></div>
|
||||
<article class="level" id="test">
|
||||
<table class="enemy" id="table-enemy" >
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
o o o
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</article>
|
||||
</body>
|
||||
</html>
|
27
static/input.js
Normal file
27
static/input.js
Normal file
|
@ -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;
|
||||
}
|
||||
});
|
||||
};
|
36
static/player.js
Normal file
36
static/player.js
Normal file
|
@ -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"));
|
||||
};
|
Loading…
Reference in a new issue