【问题标题】:How to animate an array of objects?如何为对象数组设置动画?
【发布时间】:2012-01-26 16:21:30
【问题描述】:

这是我的代码,我在动画的每次迭代中应用到每个对象:

for(var i=0;i<60;i++){
 var ship = new object();
        ship.size = 10;
        ship.image = getMediaObject('shipImage');
        ship.speed.x = 0;
        ship.speed.y = 0;
        ship.flyingByEllipce = true;
        ship.MoveEllipce(p, cont, 4, 100);
        shipsMove.push(clone(ship));
}
for (var i = 0; i < shipsMove.length / 2; i++) {
    shipsMove[i].speed.x = (p1.info.point.x - shipsMove[i].x) / sens;
    shipsMove[i].speed.y = (p1.info.point.y - shipsMove[i].y) / sens;
    p.pop--;
    currentPop--;
    document.getElementById('population-current').innerHTML = currentPop;
    shipsMove[i].animatable = true;
    shipsMove[i].flyingByEllipce = false;
    shipsMove[i].animate(cont, p1.x + 25, p1.y + 25);
    shipsMove[i].animate(shipGo, p1.x + 25, p1.y + 25);
}

这里是动画本身的代码:

function object() { //flying object
var Ship = this;
this.x = 0;
this.y = 0;
this.speed={ x: 0, y: 0 };
this.size = 20;
this.iter = 0;
this.health = 100;
this.position = 3;
this.print= function (canvas) {
    canvas.ctx.drawImage(this.image, (this.x - this.size), (this.y - this.size), this.size, this.size);
};
this.redraw = function (canvas, beforeX, beforeY, afterX, afterY) {
    var params = {
        fromX: (beforeX - this.size),
        fromY: (beforeY - this.size),
        size: (this.size * 3),
        toX: (afterX - this.size),
        toY: (afterY - this.size)
    }
    canvas.ctx.clearRect(params.fromX - 7, params.fromY - 7, params.size + 2, params.size + 2);
    canvas.ctx.drawImage(getMediaObject('shipImage'), params.toX, params.toY, this.size, this.size);
};
this.animatable = false;
//метод подсчета урона наносимого кораблями
this.battle = function (canv,damage) {
    this.health -= damage;
    if (this.health <= 0)
        canv.ctx.clearRect((this.x - this.size) - 1, (this.y - this.size) - 1, (this.size) + 3, (this.size) + 3);
}
//анимация полета корабля
this.animate = function (canvas, tox, toy) {
    if ((this.x + this.speed.x) >= (tox - this.size) && (this.y + this.speed.y) <= (toy - this.size)) {
        //canvas.ctx.clearRect((Ship.x - Ship.size) - 1, (Ship.y - Ship.size) - 1, (Ship.size) + 3, (Ship.size) + 3);
        this.animatable = false;
    } else if ((this.x + this.speed.x) >= (tox - this.size) && (this.y + this.speed.y) >= (toy - this.size)) {
        //canvas.ctx.clearRect((Ship.x - Ship.size) - 1, (Ship.y - Ship.size) - 1, (Ship.size) + 3, (Ship.size) + 3);
        this.animatable = false;
    }
    this.redraw(canvas, this.x, this.y, (this.x + this.speed.x), (this.y + this.speed.y));
    this.x += this.speed.x;
    this.y += this.speed.y;
    if (this.animatable == true) {
        this.tim = setTimeout(this.animate, 60, canvas, tox, toy);
    } else clearTimeout(this.tim);
};

当我将动画应用于单个对象时,它可以工作,但是当我需要将动画应用于多个对象时,它不会发生,我该如何解决这个问题?

谢谢。

【问题讨论】:

  • 第二个区块中的Ship 是什么?您可以发布您的所有代码吗?
  • 请发布一个完整的 jsfiddle 示例

标签: javascript animation html5-canvas


【解决方案1】:

看来您需要在方法中将 Ship 替换为 this

【讨论】:

  • 不,他们不是。由于您没有在循环中执行 var Ship = this; 行,因此 Ship 会一直引用某个特定实例,而不是像 this 一直这样做的当前实例。
  • this 上替换了Ship,现在动画是一步和停止,所以每次点击。
  • 您需要引入一个闭包以在setTimeout 行中保留this 引用:而不是this.animatefunction() { thisShip.animate(); } 并在setTimeout 行之前添加var thisShip = this;。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2020-04-29
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
相关资源
最近更新 更多