我正在编写一个显示符合某些物理定律的球的应用程序。 所以我有一个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);
但是我想添加一个添加和显示球的按钮。所以我正在寻找一个能够对所添加的球执行这些命令的功能。
这有点棘手,因为它必须:
编辑:修正 @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...)
之前的最后一个问题。
感谢大家:)!
答案 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
是从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_1
,ball_2
等。相反,你只需要一个数组balls
,并将其编入索引,例如, balls[0]
,balls[1]
等