BouncingSvgParticle = Utilities.createSubclass(BouncingParticle, function(stage, shape) { BouncingParticle.call(this, stage); this._shape = shape; }, { _applyClipping: function(stage) { if (stage.clip != "star") return; stage.ensureClipStarIsCreated(); this.element.setAttribute("clip-path", "url(#star-clip)"); }, _move: function() { var transform = "translate(" + this.position.x + ", " + this.position.y + ")"; if (this._shape != "circle") transform += this.rotater.rotate(this.size.center); this.element.setAttribute("transform", transform); }, animate: function(timeDelta) { BouncingParticle.prototype.animate.call(this, timeDelta); this._move(); } }); BouncingSvgParticlesStage = Utilities.createSubclass(BouncingParticlesStage, function() { BouncingParticlesStage.call(this); }, { _createDefs: function() { return Utilities.createSVGElement("defs", {}, {}, this.element); }, _ensureDefsIsCreated: function() { return this.element.querySelector("defs") || this._createDefs(); }, _createClipStar: function() { var attrs = { id: "star-clip", clipPathUnits: "objectBoundingBox" }; var clipPath = Utilities.createSVGElement("clipPath", attrs, {}, this._ensureDefsIsCreated()); attrs = { d: "M.50,0L.38,.38L0,.38L.30,.60L.18,1L.50,.75L.82,1L.70,.60L1,.38L.62,.38z" }; Utilities.createSVGElement("path", attrs, {}, clipPath); return clipPath; }, ensureClipStarIsCreated: function() { return this.element.querySelector("#star-clip") || this._createClipStar(); }, particleWillBeRemoved: function(particle) { particle.element.remove(); } });