我遇到了一个我不确定如何解决的错误。我有下面的函数update(),它接受一个对象,然后对它执行逻辑。
var requestAnimFrame = ( function() {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback) {
window.setTimeout(callback, 10);
};
})();
function doAnimation(ballObject) {
requestAnimFrame(doAnimation);
update(ballObject);
console.log( getProperty("ball","top") );
console.log( getProperty("ball","left") );
}
function Ball(id) {
this.id = id;
this.xVel = .17;
this.yVel = .13;
this.ts;
}
function update(ball){
// do timestamp calculations
var newBall = ball;
var ts = Date.now();
newBall.ts = newBall.ts || ts;
var time_elapsed = ts - newBall.ts;
newBall.ts = ts;
// get values from ball
var ball_y = parseFloat( getProperty(newBall.id,"top").replace ("px", "") ) || 0;
var ball_x = parseFloat( getProperty(newBall.id,"left").replace("px", "") ) || 0;
// do other things, such as set new location for the ball's top and
// left position and etc.
}
// Code that starts the entire process
(function() {
ball = new Ball("ball");
doAnimation(ball);
})();
正如您从上面我的函数的作用中可以看到的那样,我试图将“newBall”对象上的属性“ts”分配给名为“ts”的局部变量所持有的值。但是,当我去做那个赋值时,“newBall”对象的整个值变为局部变量“ts”的值,而不仅仅是“newBall”对象的“ts”属性。我假设这反映了我的语法错误,但我真的没有任何线索?有没有人有任何想法为什么会这样?
我知道从c ++指针开始,您必须在可以访问指针对象的属性之前取消引用指针。我在某种程度上必须做同样的事情吗?
编辑:我在update()函数之前包含了我的类声明,以及管理重复调用以更新的两个函数。
答案 0 :(得分:0)
问题在于您的doAnimation
功能:
function doAnimation(ballObject) {
requestAnimFrame(doAnimation);
update(ballObject);
/* Logging here */
}
当requestAnimationFrame
再次调用您的函数时,它将不会传递ballObject
参数。事实上,它将传递一个高分辨率的时间戳,这是你在update
函数上手动(精度较低)得到的。有关requestAnimationFrame
工作原理的详细信息,请查看the documentation at Mozilla Developer Network。
回到ballObject
参数,您需要使用其他方法来维护对它的引用。通常在javascript中,这是通过闭包实现的:
function doAnimation(ballObject) {
requestAnimFrame(function() {
doAnimation(ballObject);
});
update(ballObject);
/* Logging here */
}