The GameEngine is the core of your game, running on both the server and the client. The server's execution is authoritative, while the client runs the engine to predict movement.
Registration
In your GameEngine sub-class, use registerClasses(serializer) to register all your DynamicObject types so the Lance serializer can handle them.
Event Handling
Use this.on(eventName, handler) in the constructor to respond to game lifecycle events. Common events include:
postStep: Runs after every game step (ideal for game logic).server__init: Server-only initialization.server__playerJoined: Triggered when a new client connects.server__playerDisconnected: Triggered when a client leaves.client__rendererReady: Client-side initialization.client__draw: Client-side rendering loop.
class Game extends GameEngine {
constructor(options) {
super(options);
this.physicsEngine = new SimplePhysicsEngine({ gameEngine: this });
// common code
this.on('postStep', this.gameLogic.bind(this));
// server-only code
this.on('server__init', this.serverSideInit.bind(this));
this.on('server__playerJoined', this.serverSidePlayerJoined.bind(this));
this.on('server__playerDisconnected', this.serverSidePlayerDisconnected.bind(this));
// client-only code
this.on('client__rendererReady', this.clientSideInit.bind(this));
this.on('client__draw', this.clientSideDraw.bind(this));
}
registerClasses(serializer) {
serializer.registerClass(Paddle);
serializer.registerClass(Ball);
}
}
constructor(options) {
super(options);
this.physicsEngine = new SimplePhysicsEngine({ gameEngine: this });
// common code
this.on('postStep', this.gameLogic.bind(this));
// server-only code
this.on('server__init', this.serverSideInit.bind(this));
this.on('server__playerJoined', this.serverSidePlayerJoined.bind(this));
this.on('server__playerDisconnected', this.serverSidePlayerDisconnected.bind(this));
// client-only code
this.on('client__rendererReady', this.clientSideInit.bind(this));
this.on('client__draw', this.clientSideDraw.bind(this));
}
registerClasses(serializer) {
serializer.registerClass(Paddle);
serializer.registerClass(Ball);
}