%PDF- %PDF-
Direktori : /proc/self/root/home/infra/jogos/blocos-1/ext/ |
Current File : //proc/self/root/home/infra/jogos/blocos-1/ext/stage-matter.js |
/** * Matter.js viewer */ (function() { Stage.Matter = Viewer; var Composite = Matter.Composite; var Events = Matter.Events; var Runner = Matter.Runner || Matter.Engine; Viewer._super = Stage; Viewer.prototype = Stage._create(Viewer._super.prototype); function Viewer(engine) { Viewer._super.call(this); this.label('Matter'); engine.render = { controller : { create : function(options) { return options; }, clear : function() { }, world : function(engine) { }, setBackground : function() { } } }; engine.input = { mouse : { sourceEvents : {} } }; var self = this; var world = this.world = engine.world; Events.on(world, 'addBody', function(ev) { self.addRenderable(ev.body); }); Events.on(world, 'removeBody', function(ev) { self.removeRenderable(ev.body); }); Events.on(engine, 'afterTick', function(ev) { var bodies = Composite.allBodies(world); for (var i = 0; i < bodies.length; i++) { if (!bodies[i].isSleeping) { self.updateRenderable(bodies[i]); } } }); var bodies = Composite.allBodies(world); for (var i = 0; i < bodies.length; i++) { self.addRenderable(bodies[i]); } var runner = Runner.create(engine); var time = 0; this.tick(function(t) { time += t; Runner.tick(runner, engine, time); return true; }); } Viewer.prototype.addRenderable = function(body) { if (!body.ui) { var texture = null; if (body.circleRadius) { texture = this.drawCircle(body.circleRadius, body.render); } else if (body.vertices) { texture = this.drawConvex(body.vertices, body.position, body.render); } if (texture) { body.ui = Stage.image(texture).pin('handle', 0.5).appendTo(this); } this.updateRenderable(body); } }; Viewer.prototype.removeRenderable = function(body) { if (body.ui) { body.ui.remove(); } }; Viewer.prototype.updateRenderable = (function() { var pin = {}; return function(body) { if (body.ui) { pin.offsetX = body.position.x; pin.offsetY = body.position.y; pin.rotation = body.angle; body.ui.pin(pin); } }; })(); Viewer.prototype.drawCircle = function(radius, options) { var lineWidth = options.lineWidth; var width = radius * 2 + lineWidth * 2; var height = radius * 2 + lineWidth * 2; var ratio = 1; return Stage.canvas(function(ctx) { this.size(width, height, ratio); ctx.scale(ratio, ratio); ctx.arc(width / 2, height / 2, radius, 0, 2 * Math.PI); if (options.fillStyle) { ctx.fillStyle = options.fillStyle; ctx.fill(); } ctx.lineTo(width / 2, height / 2); ctx.lineWidth = options.lineWidth; ctx.strokeStyle = options.strokeStyle; ctx.stroke(); }); }; Viewer.prototype.drawConvex = function(verts, base, options) { var lineWidth = options.lineWidth; if (!verts.length) { return; } var x0 = base.x, y0 = base.y; var width = 0, height = 0; var ratio = 1; for (var i = 0; i < verts.length; i++) { var v = verts[i], x = v.x, y = v.y; width = Math.max(Math.abs(x - x0), width); height = Math.max(Math.abs(y - y0), height); } return Stage.canvas(function(ctx) { this.size(2 * width + 2 * lineWidth, 2 * height + 2 * lineWidth, ratio); ctx.scale(ratio, ratio); ctx.beginPath(); for (var i = 0; i < verts.length; i++) { var v = verts[i], x = v.x - x0 + width + lineWidth, y = v.y - y0 + height + lineWidth; if (i == 0) ctx.moveTo(x, y); else ctx.lineTo(x, y); } if (verts.length > 2) { ctx.closePath(); } if (options.fillStyle) { ctx.fillStyle = options.fillStyle; ctx.fill(); ctx.closePath(); } ctx.lineCap = "round"; ctx.lineWidth = options.lineWidth; ctx.strokeStyle = options.strokeStyle; ctx.stroke(); }); }; var addBody = Composite.addBody; Composite.addBody = function(composite, body) { var world = composite; while (world.parent) world = world.parent; Events.trigger(world, "addBody", { body : body }); return addBody.apply(this, arguments); }; var removeBody = Composite.removeBody; Composite.removeBody = function(composite, body) { var world = composite; while (world.parent) world = world.parent; Events.trigger(world, "removeBody", { body : body }); return removeBody.apply(this, arguments); }; })();