constructor(minX, minY, maxX, maxY) {
		super(minX, minY, maxX - minX, maxY - minY);

		/**
		 * Axis definition
		 * @enum {number}
		 * @property {number} NONE no axis
		 * @property {number} HORIZONTAL horizontal axis only
		 * @property {number} VERTICAL vertical axis only
		 * @property {number} BOTH both axis
		 * @readonly
		 */
		this.AXIS = {
			NONE: 0,
			HORIZONTAL: 1,
			VERTICAL: 2,
			BOTH: 3,
		};

		/**
		 * Camera bounds
		 * @type {Bounds}
		 */
		this.bounds = boundsPool.get();

		/**
		 * enable or disable damping
		 * @private
		 * @default true
		 */
		this.smoothFollow = true;

		/**
		 * Camera damping for smooth transition [0 .. 1].
		 * 1 being the maximum value and will snap the camera to the target position
		 * @type {number}
		 * @default 1.0
		 */
		this.damping = 1.0;

		/**
		 * the closest point relative to the camera
		 * @type {number}
		 * @default -1000
		 */
		this.near = -1000;

		/**
		 * the furthest point relative to the camera.
		 * @type {number}
		 * @default 1000
		 */
		this.far = 1000;

		/**
		 * the default camera projection matrix
		 * (2d cameras use an orthographic projection by default).
		 * @type {Matrix3d}
		 */
		this.projectionMatrix = new Matrix3d();

		/**
		 * the invert camera transform used to unproject points
		 * @ignore
		 * @type {Matrix2d}
		 */
		this.invCurrentTransform = new Matrix2d();

		// offset for shake effect
		this.offset = new Vector2d();

		// target to follow
		this.target = null;

		// default value follow
		this.follow_axis = this.AXIS.NONE;

		/**
		 * shake variables
		 * @ignore
		 */
		this._shake = {
			intensity: 0,
			duration: 0,
			axis: this.AXIS.BOTH,
			onComplete: null,
		};

		/**
		 * flash variables
		 * @ignore
		 */
		this._fadeOut = {
			color: null,
			tween: null,
		};

		/**
		 * fade variables
		 * @ignore
		 */
		this._fadeIn = {
			color: null,
			tween: null,
		};

		// default camera name
		this.name = "default";

		// set a default deadzone
		this.setDeadzone(this.width / 6, this.height / 6);

		// for backward "compatiblity" (in terms of behavior)
		this.anchorPoint.set(0, 0);

		// enable event detection on the camera
		this.isKinematic = false;

		this.bounds.setMinMax(minX, minY, maxX, maxY);

		// update the projection matrix
		this._updateProjectionMatrix();

		// subscribe to the game reset event
		eventEmitter.addListener(GAME_RESET, this.reset.bind(this));
		// subscribe to the canvas resize event
		eventEmitter.addListener(CANVAS_ONRESIZE, this.resize.bind(this));
	}
@param {number} minX - start x offset
@param {number} minY - start y offset
@param {number} maxX - end x offset
@param {number} maxY - end y offset