我有一些HTML应该在画布周围弹跳球,但是当我将它们设置为随机位置并使用alert("Co-ordinates " + (cirX[i]) + " x " + (cirY[i]));
进行测试时,存储坐标的数组似乎是“NaN” 。这返回'坐标NaN x NaN'。我试过用一个没有阵列的球做它并且它起作用。我不确定我是否正在严格编码我的数组或者是否是其他内容。这是我的HTML:
<!Doctype HTML>
<head>
<script>
var cirX = [];
var cirY = [];
var chX = [];
var chY = [];
var width;
var height;
function initCircle(nBalls) {
alert(nBalls)
for(var i = 0; i<nBalls;i++) {
alert("loop " + i)
chX[i] = (Math.floor(Math.random()*200)/10);
chY[i] = (Math.floor(Math.random()*200)/10);
cirX[i] = Math.floor(Math.random()*width);
cirY[i] = Math.floor(Math.random()*height);
alert("Co-ordinates " + (cirX[i]) + " x " + (cirY[i]));
circle(cirX[i],cirY[i],3);
setInterval('moveBall(i)',10);
}
}
function moveBall(ballNum) {
if(cirX[ballNum] > width||cirX[ballNum] < 0) {
chX[ballNum] = 0-chX[ballNum];
}
if(cirY[ballNum] > height|| cirY[ballNum] < 0) {
chY[ballNum] = 0-chY[ballNum];
}
cirX[ballNum] = cirX[ballNum] + chX[ballNum];
cirY[ballNum] = cirY[ballNum] + chY[ballNum];
circle(cirX[ballNum],cirY[ballNum],3);
}
function circle(x,y,r) {
var c=document.getElementById("canvas");
var ctx=c.getContext("2d");
canvas.width = canvas.width;
ctx.fillStyle="#FF0000";
ctx.beginPath();
ctx.arc(x, y, r, 0, Math.PI*2, true);
ctx.fill();
width = canvas.width;
height = canvas.height;
}
</script>
</head>
<body>
<canvas id="canvas" width="400" height="300">
</canvas>
<script>
initCircle(3); //this sets the number of circles
</script>
</body>
我已经查找了如何初始化数组e.c.t,但我似乎做得对吗?在此先感谢您的帮助!
修改
尽管解决了上述问题,但只有一个球以不同的速度移动,尽管ballNum
中的变量moveBall()
正如预期的那样从0变为2(通过添加alert(ballNum)
进行测试)。有谁知道为什么?
答案 0 :(得分:1)
你打电话给这一行
cirX[i] = Math.floor(Math.random()*width);
当width
仍未定义时。因此,您只能获得NaN
。
要从setInterval正确调用moveBall
函数,您可以使用
(function(i) { // embedds i to protect its value (so that it isn't the one of end of loop
setInterval(function(){moveBall(i)}, 10);
})(i);
答案 1 :(得分:1)
这是因为第一次执行语句时width
未定义。您可以在开始时获取画布及其尺寸,并使其保持全局。
http://jsbin.com/agavoq/9/edit
要调用setInterval,您可以使用自调用函数来保留i
(function(x){
setInterval(moveBall,10, x);
})(i);
或者只是
setInterval(moveBall,10, i);
或者
setInterval('moveBall(' + i+ ')',10);
答案 2 :(得分:0)
我看到另一个问题,因为看看这一行
setInterval('moveBall(i)',10);
i
不是您认为的那样。您不应在setTimeout
中使用字符串。