constructor(x = 0, y = 0, width = Infinity, height = Infinity) {
		// call the super constructor
		super(x, y, width, height, true);

		// world is the root container
		this.name = "rootContainer";

		// to mimic the previous behavior
		this.anchorPoint.set(0, 0);

		/**
		 * the application (game) this physic world belong to
		 * @type {Application}
		 */
		this.app = undefined;

		/**
		 * the physic engine used by melonJS
		 * @see ApplicationSettings.physic
		 * @type {string}
		 * @default "builtin"
		 * @example
		 * // disable builtin physic
		 * me.game.world.physic = "none";
		 */
		this.physic = "builtin";

		/**
		 * the rate at which the game world is updated,
		 * may be greater than or lower than the display fps
		 * @default 60
		 * @see timer.maxfps
		 */
		this.fps = 60;

		/**
		 * world gravity
		 * @type {Vector2d}
		 * @default <0,0.98>
		 */
		this.gravity = new Vector2d(0, 0.98);

		/**
		 * Enabled pre-rendering for all tile layers. <br>
		 * If false layers are rendered dynamically, if true layers are first fully rendered into an offscreen canvas.<br>
		 * the "best" rendering method depends of your game (amount of layer, layer size, amount of tiles per layer, etc.)<br>
		 * Note : rendering method is also configurable per layer by adding a boolean "preRender" property to your layer in Tiled ({@link https://doc.mapeditor.org/en/stable/manual/custom-properties/#adding-properties}).
		 * @type {boolean}
		 * @default false
		 */
		this.preRender = false;

		/**
		 * the active physic bodies in this simulation
		 * @type {Set<Body>}
		 */
		this.bodies = new Set();

		/**
		 * the instance of the game world quadtree used for broadphase (used by the builtin physic and pointer event implementation)
		 * @type {QuadTree}
		 */
		this.broadphase = new QuadTree(
			this,
			this.getBounds().clone(),
			collision.maxChildren,
			collision.maxDepth,
		);

		/**
		 * the collision detector instance used by this world instance
		 * @type {Detector}
		 */
		this.detector = new Detector(this);

		// reset the world container on the game reset signal
		eventEmitter.addListener(GAME_RESET, this.reset.bind(this));

		// update the broadband world bounds if a new level is loaded
		eventEmitter.addListener(LEVEL_LOADED, () => {
			// reset the quadtree
			this.broadphase.clear(this.getBounds());
		});
	}
@param {number} [x=0] - position of the container (accessible via the inherited pos.x property)
@param {number} [y=0] - position of the container (accessible via the inherited pos.y property)
@param {number} [width=game.viewport.width] - width of the container
@param {number} [height=game.viewport.height] - height of the container