feat: room controller, simplified diff
This commit is contained in:
parent
173dde73f6
commit
1c686d7b67
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user