duckengine
Version:
A 2D Game Engine for the web.
126 lines (111 loc) • 3.28 kB
text/typescript
import { Duck } from '../..';
import Debug from '../debug/debug';
import Game from '../game';
/**
* @class DisplayList
* @classdesc Creates a DisplayList that manages Renderable objects
* @description The DisplayList Class. Keeps track of all Renderable objects
* @since 2.0.0
*/
export default class DisplayList {
public game: Game;
public list: Duck.Types.Renderable[] = [];
constructor(game: Game) {
this.game = game;
}
/**
* @memberof DisplayList
* @description Adds a renderableObject to the list
* @param {Duck.Types.Renderable} renderableObject A renderableObject
*
* Note: this pools the game's renderer pipeline for instant updates
*
* @since 2.0.0
*/
public add(renderableObject: Duck.Types.Renderable) {
this.list.push(renderableObject);
// pool renderer pipeline for instant update
this.game.renderer.pipeline.pool();
}
/**
* @memberof DisplayList
* @description Removes a renderableObject from the list
* @param {Duck.Types.Renderable} renderableObject A renderableObject
* @since 2.0.0
*/
public remove(renderableObject: Duck.Types.Renderable) {
const f = this.list.find((r) => r.id === renderableObject.id);
if (f) {
this.list.splice(
this.list.findIndex((r) => r.id === renderableObject.id),
1
);
} else {
new Debug.Error(
`INTERNAL -> Cannot remove renderableObject from displayList with id "${renderableObject.id}". If you suspect this as a bug, please report it on github.`
);
}
}
/**
* @memberof DisplayList
* @description Sorts all renderableObject by zIndex
* @returns {Duck.Types.Renderable[]}
* @since 2.0.0
*/
public depthSort() {
const sorted = [...this.list].sort(
(obj, obj2) => obj.zIndex - obj2.zIndex
);
return sorted;
}
/**
* @memberof DisplayList
* @description Filters all renderableObjects by its visible boolean property
* @param {boolean} [filter=true] By what to filter. EX: true, filters all visible objects, optional -> default: true
* @returns {Duck.Types.Renderable[]}
* @since 2.0.0
*/
public visibilityFilter(filter = true) {
const filtered = this.list.filter((r) => r.visible === filter);
return filtered;
}
/**
* @memberof DisplayList
* @template t
* @description Loops through each renderableObject and runs a callback with it passed
* @param {(renderableObject: Duck.Types.Renderable, index: number) => t} cb Callback
* @since 2.0.0
*/
public each<t = void>(
cb: (renderableObject: Duck.Types.Renderable, index: number) => t
) {
this.list.forEach(cb.bind(this));
}
/**
* @memberof DisplayList
* @description Removes an item from the list based on passed index
* @param {number} index
* @param {number} [amount]
* @since 2.0.0
*/
public splice(index: number, amount?: number) {
return this.list.splice(index, amount);
}
/**
* @memberof DisplayList
* @description Gets the length of the list
* @since 2.0.0
*/
public get length() {
return this.list.length;
}
/**
* @memberof DisplayList
* @description Overwrites the list items with passed parameter
* @param {Duck.Types.Renderable[]} listItems Renderable objects to overwrite with
* @since 2.0.0
*/
public set listItems(listItems: Duck.Types.Renderable[]) {
this.list = listItems;
}
}