forest[0] = {
x : cvs.width/2-width_path_near-tree_size/2,
y : cvs.height/2-tree_size+10,
size : tree_size,
}
function draw() {
for (var i=0; i<forest.length; i++){
ctx.drawImage(masTree[randTree], forest[i].x, forest[i].y, forest[i].size, forest[i].size);
if(forest[i].y == 3*cvs.height/4){
forest.push({
y : cvs.height/2-tree_size+10,
x : cvs.width/2-width_path_near-tree_size/2,
size : tree_size
});
}
forest[i].y += 0.5;
forest[i].x -= 0.4;
forest[i].size += 0.4;
}
requestAnimationFrame(draw);
}
http://jsfiddle.net/Nata_Hamster/et7f9p6w/
如果在这种情况下将 forest[0] 声明(仅它,或 forest[0] 和 var forest )放置在 draw() 内,使其成为本地,则 draw 不起作用(x,y,大小不变) http: //jsfiddle.net /Nata_Hamster/8g697z02/ JS背后的逻辑是什么?
移入内部时,每次调用函数时都会初始化第一个元素的值
draw。这意味着在循环结束时,这个元素的值会发生变化,但是下次调用该函数时,它们会被设置为初始值。
因此,渲染只发生在一个点上。
在渲染第一次赋值的情况下,它不会在每次 start 时重置
draw,这意味着新的渲染发生在新的坐标处。1)你的图片每隔一段时间加载一次
2)这件必须删除
3)这是一个工作示例
四)
requestAnimationFrame像每秒调用一次,每次调用函数时,坐标、大小和框架都会改变。在下面的示例中可以观察到 - 有绘图,没有运动。
5)将重复数据包装在一个函数中
6)如果可能,取出计算值
例如
3 * cvs.height / 4,在函数外计数一次就足够了