2

我正在编写一个应用程序,它显示符合某些物理定律的球。所以我有一个球对象和一个路径原型。这个路径原型在任何给定时刻计算球的坐标并绘制它,有点像这样:

Ball.prototype.path = function(v) {
modifying the ball coordinates...
ctx.arc(....);
(other canvas stuff)}

如果我想显示球的动画,我这样做:

var ball1 = new Ball(...);
var ball2...
function loop () {
ctx.beginPath(); // The balls won't show up if I begin and close the Path in path(), I don't know why...
ball1.path();
ball2...
ctx.closePath();
};
setInterval(loop, 0.0015);

但我想添加一个按钮来添加和显示球。所以我正在寻找一个对添加的任何球执行这些命令的函数。

这有点棘手,因为它必须:

  1. 创建并命名一个新变量。
  2. 根据该名称执行 path() 。
  3. 所有这些,都在同一个循环函数中,所以我可以稍后创建一个 setInterval。

编辑:已修复 @Frederik @Doorknob 我使用了 BallArray:

var BallArray = new Array(); i=0; function AddBallonClick() { i++; BalleArray.push(i) }; function loop() { for (var i=0;i<BalleArray.length;i++) { ctx.beginPath(); var ball = new Ball(0, 0, 40); ball.path(); ctx.closePath(); }; }; setInterval(loop, dt);

但我想命名新变量ball_i,即:ball_1,ball_2...,我不知道如何命名。即使我只添加一次球,脚本似乎也不起作用,所以这也是一个问题......

编辑 2:已修复

另外,我想为每个新球设置一个初始速度,通常我这样做:

   ball.v = new V(...);

但是现在我有一个数组,我将它添加到循环中,但它不起作用......:

   balles[i].v = new V(...)

编辑 3:

我还有另一个问题,每当我单击按钮时,都不会添加和绘制球,而是动画“重播”。似乎javascript不能用我的代码同时画球:

    function loop()
    {
    for(var i = 0; i < balls.length; i++) {
        ctx.beginPath();
        balls[i].path();
        ctx.closePath();
    }
};
    setInterval(loop, dt);

编辑:全部修复我已经解决了最后一个问题,你只需ctx.clearRect(0, 0, width, height)要将for(var i=0...).

感谢大家 :) !

4

1 回答 1

3

正如评论中提到的,答案是数组。您似乎不太了解它们,所以这里有一个快速概述。数组是一种对象列表。在您的情况下,您可能需要一个Balls 列表。您可以像这样初始化它:

var balls = [];  // [] is about the same as new Array(), but more concise

要向它添加一个新球,您可以使用push,将球传给它:

balls.push(new Ball(/* ... */));

(当然,你也可以传一个已经存在的球:)

var ball = /* obtain ball from elsewhere */;
balls.push(ball);

您似乎确实了解如何遍历数组,但不了解如何在遍历数组时获取值。要遍历数组,请使用for循环:

for(var i = 0; i < balls.length; i++) {
    // ...
}

显然,i将是一个从0到的整数balls.length。但是,我们不能对数字本身做太多事情。我们真正想要的是数组中那个索引处的球。您可以通过索引数组来做到这一点。看起来像这样:

var ball = balls[i];

现在ball将球包含在i数组中的位置balls,您可以从那里做任何您想做的事情。在您的情况下,您可能想调用path它:

// If you've stored it into a variable as above:
ball.path();
// Or more concisely without having to store it into a variable:
balls[i].path();

使用数组,不需要命名变量,例如 ,ball_1ball_2。相反,您只需要一个数组 ,balls并对其进行索引,例如 ,balls[0]balls[1]

于 2013-05-05T22:02:50.273 回答