45 lines
1.3 KiB
JavaScript
45 lines
1.3 KiB
JavaScript
import Schema from '@/ecs/schema.js';
|
|
|
|
export default function(Component) {
|
|
return class Ticking extends Component {
|
|
instanceFromSchema() {
|
|
const Instance = super.instanceFromSchema();
|
|
|
|
Instance.prototype.$$finished = [];
|
|
Instance.prototype.$$tickingPromises = [];
|
|
Instance.prototype.addTickingPromise = function(tickingPromise) {
|
|
this.$$tickingPromises.push(tickingPromise);
|
|
tickingPromise.then(() => {
|
|
this.$$finished.push(tickingPromise);
|
|
});
|
|
}
|
|
Instance.prototype.tick = function(elapsed) {
|
|
for (const tickingPromise of this.$$finished) {
|
|
this.$$tickingPromises.splice(
|
|
this.$$tickingPromises.indexOf(tickingPromise),
|
|
1,
|
|
);
|
|
}
|
|
this.$$finished = [];
|
|
for (const tickingPromise of this.$$tickingPromises) {
|
|
tickingPromise.tick(elapsed);
|
|
}
|
|
for (const tickingPromise of this.$$finished) {
|
|
this.$$tickingPromises.splice(
|
|
this.$$tickingPromises.indexOf(tickingPromise),
|
|
1,
|
|
);
|
|
}
|
|
this.$$finished = [];
|
|
}
|
|
return Instance;
|
|
}
|
|
static schema = new Schema({
|
|
type: 'object',
|
|
properties: {
|
|
isTicking: {defaultValue: 1, type: 'uint8'},
|
|
},
|
|
});
|
|
};
|
|
}
|