【发布时间】:2014-10-14 10:41:23
【问题描述】:
我需要创建一个放置框的动画,当它到达画布上的某个 Y 点时,它应该反弹 10 次,每次比上一次低两倍。所以我有投递箱的动画,但我不能让反弹工作。以下是我编写的函数:
function dropBox(y, width, height) {
var img_box = new Image();
img_box.src = 'images/gift_box_small.png';
var box_y_pos = y;
if(y==0)
box_y_pos = y-img_box.naturalHeight;
img_box.onload = function(){
ctx_overlay.save();
ctx_overlay.clearRect(0,0,width,height);
ctx_overlay.drawImage(img_box, (width/2)-(img_box.naturalWidth/2), box_y_pos);
ctx_overlay.restore();
}
box_y_pos += 3;
var box_bottom_position = box_y_pos - img_box.naturalHeight;
if(box_y_pos+img_box.naturalHeight<height-25)
var loopTimer = setTimeout(function() {dropBox(box_y_pos, width, height)},24);
else
bounceBox(img_box, box_y_pos, box_y_pos, (height/2)-(img_box.naturalHeight/2), "up");
}
function bounceBox(img, img_final_pos, y, midway_pos, direction){
var midway = midway_pos;
var direction = direction;
var img_y_pos = y;
img.onload = function(){
ctx_overlay.save();
ctx_overlay.clearRect(0,0,docWidth,docHeight);
ctx_overlay.drawImage(img, (docWidth/2)-(img.naturalWidth/2), img_y_pos);
ctx_overlay.restore();
}
for(var i = 0; i < 10; i++){
if(direction=="up"){
//going up
if(img_y_pos>midway_){
img_y_pos -= 3;
var loopTimer = setTimeout(function() {bounceBox(img, img_final_pos, img_y_pos, midway_pos, "up")},24);
} else {
img_y_pos += 3;
midway = Math.floor(midway /= 2);
if(midway%2>0)
midway += 1;
var loopTimer = setTimeout(function() {bounceBox(img, img_final_pos, img_y_pos, midway_pos, "down")},24);
}
} else {
//going down
if(img_y_pos < img_final_pos){
img_y_pos += 3;
var loopTimer = setTimeout(function() {bounceBox(img, img_final_pos, img_y_pos, midway_pos, "down")},24);
}
}
}
}
JSFiddle:http://jsfiddle.net/n2derqgw/3/
为什么它不工作,我怎样才能让它工作?
【问题讨论】:
-
这里有一些伪代码可以让你指出正确的方向。
if(Box_Y + Box_VY >= canvas_height) Box_VY*=-1;基本上,如果盒子所在的位置大于画布的高度,那么(不使用你的变量)会做什么,反转盒子的方向。当我做动画时,我有一个setInterval()调用一个单一的绘图函数,并在绘图函数中使用单独的函数调用(只是为了清洁)。绘制形状时,我通常有一个速度变量和一个位置变量。例如:Box_VY。如果 Box_VY 是 - 则 Y 会下降
标签: javascript animation canvas html5-canvas