一个功能来统治它们

时间:2013-05-05 18:44:13

标签: javascript jquery

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

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。
  4. 编辑:修正 @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:

    我还有另一个问题,每当我点击按钮时,都没有添加和绘制球,而是动画&#34;重播&#34;。似乎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...)之前的最后一个问题。

    感谢大家:)!

1 个答案:

答案 0 :(得分:3)

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

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是从0balls.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]