feat: room controller, simplified diff

This commit is contained in:
cha0s 2019-03-27 01:52:55 -05:00
parent 173dde73f6
commit 1c686d7b67

View File

@ -10,30 +10,51 @@ import {
} from '@avocado/entity';
import {World} from '@avocado/physics/matter/world';
import {StateSynchronizer} from '@avocado/state';
import {Room} from '@avocado/topdown';
// Create game.
export default function(avocadoServer) {
avocadoServer.on('connect', createConnectionListener(avocadoServer));
setInterval(createMainLoop(avocadoServer), 1000 / 80);
}
// Entity tracking.
const entityList = new EntityList();
entityList.world = new World();
const informables = [];
const stateSynchronizer = new StateSynchronizer({
entityList,
});
// Room.
const roomJSON = {
layers: [
{
entities: [],
tiles: {
size: [12, 6],
data: [
1, 5, 6, 7, 1, 2, 3, 4, 1, 5, 6, 7,
1, 5, 6, 7, 1, 66, 67, 68, 1, 5, 6, 7,
1, 5, 6, 7, 1, 5, 6, 7, 1, 5, 6, 7,
1, 5, 6, 7, 1, 5, 6, 7, 1, 5, 6, 7,
1, 5, 6, 7, 1, 5, 6, 7, 1, 5, 6, 7,
1, 5, 6, 7, 1, 5, 6, 7, 1, 5, 6, 7,
],
},
tilesetUri: '/tileset.json',
},
],
};
for (let i = 0; i < 10; ++i) {
const x = Math.floor(Math.random() * 200) + 50;
const y = Math.floor(Math.random() * 75) + 50;
const flowerBarrel = createFlowerBarrelEntity([x, y]);
entityList.addEntity(flowerBarrel);
roomJSON.layers[0].entities.push(flowerBarrelJSON([x, y]));
}
const room = new Room()
room.world = new World();
room.fromJSON(roomJSON);
// Entity tracking.
const informables = [];
const stateSynchronizer = new StateSynchronizer({
room,
});
// Connection listener.
function createConnectionListener(avocadoServer) {
return (socket) => {
// Create and track a new entity for the connection.
const entity = createEntityForConnection(socket);
entityList.addEntity(entity);
room.addEntityToLayer(entity, 0);
// Listen for events.
socket.on('message', createMessageListener(avocadoServer, socket));
socket.on('disconnect', createDisconnectionListener(avocadoServer, socket));
@ -119,10 +140,8 @@ function createEntityForConnection(socket) {
entity.socket = socket;
return entity;
}
// Create a flower barrel.
function createFlowerBarrelEntity(position) {
const entity = createEntity();
return entity.fromJSON({
function flowerBarrelJSON(position) {
return {
traits: {
pictured: {
params: {
@ -153,7 +172,12 @@ function createFlowerBarrelEntity(position) {
},
},
},
});
};
}
// Create a flower barrel.
function createFlowerBarrelEntity(position) {
const entity = createEntity();
return entity.fromJSON(flowerBarrelJSON(position));
}
// Main loop.
let lastTime = performance.now();
@ -162,15 +186,14 @@ function createMainLoop(avocadoServer) {
const now = performance.now();
const elapsed = (now - lastTime) / 1000;
lastTime = now;
entityList.tick(elapsed);
room.tick(elapsed);
const diff = stateSynchronizer.diff();
if (StateSynchronizer.noChange === diff) {
return;
}
// All informed entities get their own slice.
for (const entity of informables) {
const CAMERA_LOCATION = [320, 180];
const reduced = entity.reduceStateDiff(diff, CAMERA_LOCATION);
const reduced = entity.reduceStateDiff(diff);
entity.inform(reduced);
}
}