addShape(shape) {
		if (shape instanceof Rect || shape instanceof Bounds) {
			const poly = shape.toPolygon();
			this.shapes.push(poly);
			// update the body bounds
			this.bounds.add(poly.points);
			this.bounds.translate(poly.pos);
		} else if (shape instanceof Ellipse) {
			if (!this.shapes.includes(shape)) {
				// see removeShape
				this.shapes.push(shape);
			}
			// update the body bounds
			this.bounds.addBounds(shape.getBounds());
			// use bounds position as ellipse position is center
			this.bounds.translate(shape.getBounds().x, shape.getBounds().y);
		} else if (shape instanceof Polygon) {
			if (!this.shapes.includes(shape)) {
				// see removeShape
				this.shapes.push(shape);
			}
			// update the body bounds
			this.bounds.add(shape.points);
			this.bounds.translate(shape.pos);
		} else if (shape instanceof Point) {
			if (!this.shapes.includes(shape)) {
				// see removeShape
				this.shapes.push(shape);
			}
			this.bounds.addPoint(shape);
		} else {
			// JSON object
			this.fromJSON(shape);
		}

		if (typeof this.onBodyUpdate === "function") {
			this.onBodyUpdate(this);
		}

		// return the length of the shape list
		return this.shapes.length;
	}
add a collision shape to this body <br>
(note: me.Rect objects will be converted to me.Polygon before being added)
@param {Rect|Polygon|Line|Ellipse|Point|Point[]|Bounds|object} shape - a shape or JSON object
@returns {number} the shape array length
@example
// add a rectangle shape
this.body.addShape(new me.Rect(0, 0, image.width, image.height));
// add a shape from a JSON object
this.body.addShape(me.loader.getJSON("shapesdef").banana);