UNPKG

phaser

Version:

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

137 lines (112 loc) 4.42 kB
/** * @author Joachim Grill <joachim@codeandweb.com> * @author Richard Davey <rich@phaser.io> * @copyright 2018 CodeAndWeb GmbH * @copyright 2013-2025 Phaser Studio Inc. * @license {@link https://opensource.org/licenses/MIT|MIT License} */ var Bodies = require('./lib/factory/Bodies'); var Body = require('./lib/body/Body'); var Common = require('./lib/core/Common'); var GetFastValue = require('../../utils/object/GetFastValue'); var Vertices = require('./lib/geometry/Vertices'); /** * Use PhysicsEditorParser.parseBody() to build a Matter body object, based on a physics data file * created and exported with PhysicsEditor (https://www.codeandweb.com/physicseditor). * * @namespace Phaser.Physics.Matter.PhysicsEditorParser * @since 3.10.0 */ var PhysicsEditorParser = { /** * Parses a body element exported by PhysicsEditor. * * @function Phaser.Physics.Matter.PhysicsEditorParser.parseBody * @since 3.10.0 * * @param {number} x - The horizontal world location of the body. * @param {number} y - The vertical world location of the body. * @param {object} config - The body configuration and fixture (child body) definitions, as exported by PhysicsEditor. * @param {Phaser.Types.Physics.Matter.MatterBodyConfig} [options] - An optional Body configuration object that is used to set initial Body properties on creation. * * @return {MatterJS.BodyType} A compound Matter JS Body. */ parseBody: function (x, y, config, options) { if (options === undefined) { options = {}; } var fixtureConfigs = GetFastValue(config, 'fixtures', []); var fixtures = []; for (var fc = 0; fc < fixtureConfigs.length; fc++) { var fixtureParts = this.parseFixture(fixtureConfigs[fc]); for (var i = 0; i < fixtureParts.length; i++) { fixtures.push(fixtureParts[i]); } } var matterConfig = Common.clone(config, true); Common.extend(matterConfig, options, true); delete matterConfig.fixtures; delete matterConfig.type; var body = Body.create(matterConfig); Body.setParts(body, fixtures); Body.setPosition(body, { x: x, y: y }); return body; }, /** * Parses an element of the "fixtures" list exported by PhysicsEditor * * @function Phaser.Physics.Matter.PhysicsEditorParser.parseFixture * @since 3.10.0 * * @param {object} fixtureConfig - The fixture object to parse. * * @return {MatterJS.BodyType[]} - An array of Matter JS Bodies. */ parseFixture: function (fixtureConfig) { var matterConfig = Common.extend({}, false, fixtureConfig); delete matterConfig.circle; delete matterConfig.vertices; var fixtures; if (fixtureConfig.circle) { var x = GetFastValue(fixtureConfig.circle, 'x'); var y = GetFastValue(fixtureConfig.circle, 'y'); var r = GetFastValue(fixtureConfig.circle, 'radius'); fixtures = [ Bodies.circle(x, y, r, matterConfig) ]; } else if (fixtureConfig.vertices) { fixtures = this.parseVertices(fixtureConfig.vertices, matterConfig); } return fixtures; }, /** * Parses the "vertices" lists exported by PhysicsEditor. * * @function Phaser.Physics.Matter.PhysicsEditorParser.parseVertices * @since 3.10.0 * * @param {array} vertexSets - The vertex lists to parse. * @param {Phaser.Types.Physics.Matter.MatterBodyConfig} [options] - An optional Body configuration object that is used to set initial Body properties on creation. * * @return {MatterJS.BodyType[]} - An array of Matter JS Bodies. */ parseVertices: function (vertexSets, options) { if (options === undefined) { options = {}; } var parts = []; for (var v = 0; v < vertexSets.length; v++) { Vertices.clockwiseSort(vertexSets[v]); parts.push(Body.create(Common.extend({ position: Vertices.centre(vertexSets[v]), vertices: vertexSets[v] }, options))); } // flag coincident part edges return Bodies.flagCoincidentParts(parts); } }; module.exports = PhysicsEditorParser;