%PDF- %PDF-
| Direktori : /home/infra/jogos/blocos-1/ext/ |
| Current File : //home/infra/jogos/blocos-1/ext/stage-physics.js |
/**
* PhysicsJS viewer for Stage.js
*/
(function() {
Stage.PJS = Viewer;
Viewer._super = Stage;
Viewer.prototype = Stage._create(Viewer._super.prototype);
function Viewer(world, options) {
Viewer._super.call(this);
this.label('PhysicsJS');
var self = this;
this.world = world;
this.options = {
lineWidth : 2,
lineColor : '#000000',
fillColor : function() {
var red = Stage.Math.random(192, 256) | 0;
var green = Stage.Math.random(192, 256) | 0;
var blue = Stage.Math.random(192, 256) | 0;
return '#' + red.toString(16) + green.toString(16) + blue.toString(16);
},
ratio : 1,
get : function(key) {
var value = this[key];
return typeof value === 'function' ? value() : value;
},
extend : function(options) {
return Stage._extend({}, this, options);
}
}.extend(options);
var subscribe = world.subscribe || world.on;
subscribe.call(world, 'add:body', function(data) {
data.body && self.addRenderable(data.body);
});
subscribe.call(world, 'remove:body', function(data) {
data.body && self.removeRenderable(data.body);
});
var bodies = world.getBodies();
for (var i = 0; i < bodies.length; i++) {
var body = bodies[i];
this.addRenderable(body);
}
var time = Date.now();
this.tick(function(t) {
time += t;
world.step(time);
var bodies = world.getBodies();
for (var i = 0; i < bodies.length; i++) {
var body = bodies[i];
if (body.ui) {
body.ui.pin({
offsetX : body.state.pos.get(0),
offsetY : body.state.pos.get(1),
rotation : body.state.angular.pos
});
}
}
});
}
Viewer.prototype.addRenderable = function(obj) {
if (obj.ui || !obj.geometry) {
return;
}
var geometry = obj.geometry;
var texture = null;
if ('circle' == geometry.name) {
texture = this.drawCircle(geometry.radius);
// } else {
// if (shape.points.length) {
// texture = this.drawConvex(shape.points);
// }
}
obj.ui = Stage.create().append(Stage.image(texture).pin({
handle : 0.5
})).appendTo(this);
};
Viewer.prototype.removeRenderable = function(obj) {
obj.ui && obj.ui.remove();
return this;
};
Viewer.prototype.drawCircle = function(radius, options) {
options = this.options.extend(options);
var lineWidth = options.get('lineWidth'), lineColor = options
.get('lineColor'), fillColor = options.get('fillColor');
var width = radius * 2 + lineWidth * 2;
var height = radius * 2 + lineWidth * 2;
var ratio = options.ratio;
return Stage.canvas(function(ctx) {
this.size(width, height, ratio);
ctx.scale(ratio, ratio);
ctx.beginPath();
ctx.arc(width / 2, height / 2, radius, 0, 2 * Math.PI);
if (fillColor) {
ctx.fillStyle = fillColor;
ctx.fill();
}
ctx.lineWidth = lineWidth;
ctx.strokeStyle = lineColor;
ctx.stroke();
});
};
Viewer.prototype.drawConvex = function(verts, options) {
options = this.options.extend(options);
var lineWidth = options.get('lineWidth'), lineColor = options
.get('lineColor'), fillColor = options.get('fillColor');
if (!verts.length) {
return;
}
var width = 0, height = 0;
var ratio = options.ratio;
for (var i = 0; i < verts.length; i++) {
var v = verts[i], x = v.x, y = v.y;
width = Math.max(Math.abs(x), width);
height = Math.max(Math.abs(y), 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 + width + lineWidth, y = v.y + height
+ lineWidth;
if (i == 0)
ctx.moveTo(x, y);
else
ctx.lineTo(x, y);
}
if (verts.length > 2) {
ctx.closePath();
}
if (fillColor) {
ctx.fillStyle = fillColor;
ctx.fill();
ctx.closePath();
}
ctx.lineWidth = lineWidth;
ctx.lineCap = 'round';
ctx.strokeStyle = lineColor;
ctx.stroke();
});
};
})();