|
|
// Light sprite class
|
|
enyo.kind({
|
|
name: "Sprite",
|
|
published: { x: 0, y: 0, width: 0, height: 0, heading: 0, images: [], index: -1, sound: "" },
|
|
|
|
// Create component
|
|
create: function() {
|
|
this.inherited(arguments);
|
|
this.halfWidth = this.width/2;
|
|
this.halfHeight = this.height/2;
|
|
this.animating = false;
|
|
},
|
|
|
|
// Draw the sprite in the canvas context
|
|
draw: function(ctx) {
|
|
// Go to pos and heading and draw current image
|
|
ctx.save();
|
|
ctx.translate(this.x, this.y);
|
|
var rotate = (90-this.heading) * (Math.PI / 180);
|
|
ctx.rotate(rotate);
|
|
ctx.translate(-this.halfWidth,-this.halfHeight);
|
|
var image = document.getElementById(this.images[this.index]);
|
|
ctx.drawImage(image, 0, 0);
|
|
ctx.restore();
|
|
},
|
|
|
|
// Compute min rectangle around sprite
|
|
computeRect: function() {
|
|
var rotate = (90-this.heading) * (Math.PI / 180);
|
|
|
|
var wc = this.halfWidth*Math.cos(rotate);
|
|
var hc = this.halfHeight*Math.cos(rotate);
|
|
var ws = this.halfWidth*Math.sin(rotate);
|
|
var hs = this.halfHeight*Math.sin(rotate);
|
|
var sx0 = this.x-wc+hs;
|
|
var sy0 = this.y-hc+ws;
|
|
var sx1 = this.x+wc+hs;
|
|
var sy1 = this.y-hc-ws;
|
|
var sx2 = this.x+wc-hs;
|
|
var sy2 = this.y+hc-ws;
|
|
var sx3 = this.x-wc-hs;
|
|
var sy3 = this.y+hc+ws;
|
|
|
|
var x0 = Math.min(sx0, Math.min(sx1, Math.min(sx2, sx3)));
|
|
var y0 = Math.min(sy0, Math.min(sy1, Math.min(sy2, sy3)));
|
|
var x1 = Math.max(sx1, Math.max(sx1, Math.max(sx2, sx3)));
|
|
var y1 = Math.max(sy1, Math.max(sy1, Math.max(sy2, sy3)));
|
|
|
|
return { x: x0, y: y0, dx: x1-x0, dy: y1-y0 };
|
|
},
|
|
|
|
// Draw border around sprite
|
|
drawBorder: function(ctx) {
|
|
ctx.save();
|
|
ctx.strokeStyle = "blue";
|
|
var rect = this.computeRect();
|
|
ctx.strokeRect(rect.x, rect.y, rect.dx, rect.dy);
|
|
ctx.restore();
|
|
},
|
|
|
|
// Undraw the sprite: i.e. clear canvas at the sprite pos
|
|
unDraw: function(ctx) {
|
|
var rect = this.computeRect();
|
|
ctx.clearRect(rect.x, rect.y, rect.dx, rect.dy);
|
|
},
|
|
|
|
// Use first image for sprite
|
|
firstImage: function() {
|
|
this.index = 0;
|
|
},
|
|
|
|
// Use next image for sprite
|
|
nextImage: function(max) {
|
|
this.index = this.index + 1;
|
|
if (max === undefined)
|
|
max = this.images.length;
|
|
if (this.index >= max)
|
|
this.index = 0;
|
|
},
|
|
|
|
// Use a specific image
|
|
useImage: function(index) {
|
|
this.index = index;
|
|
},
|
|
|
|
// Play sound of the sprite
|
|
playSound: function() {
|
|
if (this.sound != "")
|
|
FoodChain.sound.play(this.sound);
|
|
},
|
|
|
|
// Test if the sprite intersect another sprite
|
|
intersect: function(sprite) {
|
|
var r1 = this.computeRect();
|
|
var r2 = sprite.computeRect();
|
|
|
|
return !(r2.x > (r1.x+r1.dx) || (r2.x+r2.dx) < r1.x ||
|
|
r2.y > (r1.y+r1.dy) || (r2.y+r2.dy) < r1.y);
|
|
},
|
|
|
|
// Compute distance between two sprites
|
|
distance: function(sprite) {
|
|
var dx = sprite.x-this.x;
|
|
var dy = sprite.y-this.y;
|
|
var dist = Math.sqrt(dx*dx+dy*dy);
|
|
|
|
return dist;
|
|
},
|
|
|
|
// Animate the sprite using a list of image and a movement
|
|
animate: function(ctx, images, dx, dy, action) {
|
|
if (this.animating)
|
|
return;
|
|
this.animating = true;
|
|
this.animation = {ctx: ctx, index: 0, images: images, dx: dx, dy: dy, action: action };
|
|
this.animation.job = window.setInterval(enyo.bind(this, "animateTimer"), 50);
|
|
},
|
|
|
|
// Timer use of animation
|
|
animateTimer: function() {
|
|
// End of animation ?
|
|
if (this.animation.index == this.animation.images.length) {
|
|
this.animating = false;
|
|
window.clearInterval(this.animation.job);
|
|
return;
|
|
}
|
|
|
|
// Draw current frame
|
|
this.unDraw(this.animation.ctx);
|
|
if (this.animation.dx != undefined)
|
|
this.x += this.animation.dx;
|
|
if (this.animation.dy != undefined)
|
|
this.y += this.animation.dy;
|
|
this.useImage(this.animation.images[this.animation.index]);
|
|
this.draw(this.animation.ctx);
|
|
|
|
// HACK: On Android, force redraw of canvas
|
|
if (enyo.platform.android && document.location.protocol.substr(0,4) != "http") {
|
|
document.getElementById('acanvas').style.display='none';
|
|
document.getElementById('acanvas').offsetHeight;
|
|
document.getElementById('acanvas').style.display='block';
|
|
}
|
|
|
|
// Action to do at each move
|
|
if (this.animation.action != undefined) {
|
|
if (!this.animation.action(this)) {
|
|
this.animating = false;
|
|
this.animation.index = this.animation.images.length;
|
|
window.clearInterval(this.animation.job);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Next frame
|
|
this.animation.index = this.animation.index + 1;
|
|
},
|
|
});
|