terraform/website/source/javascripts/app/Engine.Shape.js

164 lines
2.8 KiB
JavaScript
Raw Normal View History

2014-07-24 09:37:27 +02:00
(function(
Engine,
Point,
Polygon,
Vector
){
Engine.Shape = function(x, y, width, height, points, polygons){
2014-07-24 09:37:27 +02:00
var i, ref, point, poly;
this.pos = new Vector(x, y);
2014-07-24 09:37:27 +02:00
this.size = new Vector(width, height);
this.sizeRef = this.size.clone();
2014-07-24 09:37:27 +02:00
ref = {};
this.points = [];
this.polygons = [];
for (i = 0; i < points.length; i++) {
point = new Point(
points[i].id,
points[i].x,
points[i].y,
this.size
2014-07-24 09:37:27 +02:00
);
ref[point.id] = point;
this.points.push(point);
}
for (i = 0; i < polygons.length; i++) {
poly = polygons[i];
this.polygons.push(new Polygon(
ref[poly.points[0]],
ref[poly.points[1]],
ref[poly.points[2]],
2014-07-28 02:19:01 +02:00
poly.color,
poly.stroke
2014-07-24 09:37:27 +02:00
));
}
};
Engine.Shape.prototype = {
breathing: false,
breath: 0,
breathLength: 1,
breatheIn: false,
resize: function(newSize, offset){
var len, p;
this.size.x = newSize;
this.size.y = newSize;
this.pos.x = -(newSize / 2);
this.pos.y = -(newSize / 2 + offset);
for (p = 0, len = this.points.length; p < len; p++) {
this.points[p].resize();
}
},
startBreathing: function(){
var p;
this.breathing = true;
this.breath = this.breathLength;
for (p = 0; p < this.points.length; p++) {
this.points[p].updateBreathingPhysics();
}
},
breathe: function(tick){
var p, scale, newSize;
this.breath += tick;
if (this.breath < this.breathLength) {
return;
}
if (this.breatheIn) {
scale = 1;
} else {
scale = 1.05;
}
this.breatheIn = !this.breatheIn;
newSize = Vector.mult(this.sizeRef, scale);
for (p = 0; p < this.points.length; p++) {
this.points[p].updateTarget(newSize);
}
this.breath = 0;
},
2014-07-24 09:37:27 +02:00
update: function(engine){
var p;
if (this.breathing === true) {
this.breathe(engine.tick);
}
2014-07-24 09:37:27 +02:00
for (p = 0; p < this.points.length; p++) {
this.points[p].update(engine);
}
for (p = 0; p < this.polygons.length; p++) {
2014-07-26 08:09:04 +02:00
this.polygons[p].update(engine);
2014-07-24 09:37:27 +02:00
}
2014-07-24 09:46:14 +02:00
return this;
2014-07-24 09:37:27 +02:00
},
draw: function(ctx, scale, engine){
var p, poly;
2014-07-24 09:37:27 +02:00
ctx.translate(
this.pos.x * scale >> 0,
this.pos.y * scale >> 0
);
2014-07-24 09:37:27 +02:00
for (p = 0; p < this.polygons.length; p++) {
poly = this.polygons[p];
ctx.beginPath();
ctx.moveTo(
poly.a.pos.x * scale >> 0,
poly.a.pos.y * scale >> 0
);
ctx.lineTo(
poly.b.pos.x * scale >> 0,
poly.b.pos.y * scale >> 0
);
ctx.lineTo(
poly.c.pos.x * scale >> 0,
poly.c.pos.y * scale >> 0
);
ctx.closePath();
ctx.fillStyle = poly.fillStyle;
ctx.fill();
2014-07-28 02:19:01 +02:00
ctx.lineWidth = poly.strokeWidth * scale;
ctx.strokeStyle = poly.strokeStyle;
ctx.stroke();
2014-07-24 09:37:27 +02:00
}
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.translate(
engine.width / 2 * engine.scale >> 0,
engine.height / 2 * engine.scale >> 0
);
2014-07-24 09:46:14 +02:00
return this;
2014-07-24 09:37:27 +02:00
}
};
})(
window.Engine,
window.Engine.Point,
window.Engine.Polygon,
window.Vector
);