UNPKG

phaser

Version:

A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.

113 lines (94 loc) 3.05 kB
/** * @author Richard Davey <rich@phaser.io> * @copyright 2013-2025 Phaser Studio Inc. * @license {@link https://opensource.org/licenses/MIT|MIT License} */ var Perimeter = require('./Perimeter'); var Point = require('../point/Point'); /** * Returns an array of points from the perimeter of the Rectangle, where each point is spaced out based * on either the `step` value, or the `quantity`. * * @function Phaser.Geom.Rectangle.MarchingAnts * @since 3.0.0 * * @generic {Phaser.Geom.Point[]} O - [out,$return] * * @param {Phaser.Geom.Rectangle} rect - The Rectangle to get the perimeter points from. * @param {number} [step] - The distance between each point of the perimeter. Set to `null` if you wish to use the `quantity` parameter instead. * @param {number} [quantity] - The total number of points to return. The step is then calculated based on the length of the Rectangle, divided by this value. * @param {(array|Phaser.Geom.Point[])} [out] - An array in which the perimeter points will be stored. If not given, a new array instance is created. * * @return {(array|Phaser.Geom.Point[])} An array containing the perimeter points from the Rectangle. */ var MarchingAnts = function (rect, step, quantity, out) { if (out === undefined) { out = []; } if (!step && !quantity) { // Bail out return out; } // If step is a falsey value (false, null, 0, undefined, etc) then we calculate // it based on the quantity instead, otherwise we always use the step value if (!step) { step = Perimeter(rect) / quantity; } else { quantity = Math.round(Perimeter(rect) / step); } var x = rect.x; var y = rect.y; var face = 0; // Loop across each face of the rectangle for (var i = 0; i < quantity; i++) { out.push(new Point(x, y)); switch (face) { // Top face case 0: x += step; if (x >= rect.right) { face = 1; y += (x - rect.right); x = rect.right; } break; // Right face case 1: y += step; if (y >= rect.bottom) { face = 2; x -= (y - rect.bottom); y = rect.bottom; } break; // Bottom face case 2: x -= step; if (x <= rect.left) { face = 3; y -= (rect.left - x); x = rect.left; } break; // Left face case 3: y -= step; if (y <= rect.top) { face = 0; y = rect.top; } break; } } return out; }; module.exports = MarchingAnts;