Skip to content

Send events to Processors #24

@adngdb

Description

@adngdb

Based on @CodestarGames' proposition in #21.

This is a proposal. I am not sure yet I want to include that. I am concerned that it could change the nature of processors from a simple "function" to something event-based. There are definitely places where I could see abusing the event thing, notably in node.js applications where running a loop is less practical.


The manager will emit events to processors on various occasions. Processors which implement the on method will receive each event emitted by the manager, and then do whatever they want with it. Processors which do not implement the on method will simply be skipped.

The on method accepts 2 arguments, the first one is a string identifying the event, and the second is an object containing data associated with the event. For example:

class MyProcessor {
    on(type, data) {
        switch (type) {
            // ...
        }
    }
}

For a start, events will be:

Type Data
COMPONENT_CREATED entity, component, state
COMPONENT_REMOVED entity, component
COMPONENT_STATE_UPDATED entity, component, state

The data sent along with each event will be:

{
    entity: 'entity ID', 
    component: 'component name', 
    state: {
        /* component state */
    }
}

Here's what a Processor using that could look like:

class RenderingProcessor {
    constructor(manager) {
        this.manager = manager;
        this._sprites = {};
    }

    on(type, data) {
        switch (type) {
            case 'COMPONENT_CREATED':
                if (data.component === 'Display') {
                    let display = data.state;
                    let position = this.manager.getComponentDataForEntity('Position', data.entity);
                    let newSprite = this.game.add.sprite(position.x, position.y, display.spriteImagePath);
                    this._sprites[data.entity] = newSprite;
                }
                break;
            case 'COMPONENT_REMOVED':
                if (data.component === 'Display' && this._sprites[data.entity]) {
                    this._sprites[entity].kill();
                    delete this._sprites[entity];
                }
                break;
            default:
                break;
        }
    }

    update(dt) {
        let displays = this.manager.getComponentsData('Display');
        for (let entity in displays) {
            let display = displays[entity];
            let position = this.manager.getComponentDataForEntity('Position', entity);

            this._sprites[entity].x = position.x;
            this._sprites[entity].y = position.y;
        }
    }
}

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions