2011-11-05 86 views
0

我有一个 '对象':JavaScript方法没有找到

function Rock() 
{ 
    this.size = 30.0; 
    this.body; 
    this.isDead = false; 

    this.vertexPosBuffer; 
    this.vertexColBuffer; 
} 

我给一个函数:

Rock.prototype.Tick = function() 
{ 
    this.body.ApplyForce(new b2Vec2(0, 10), this.body.GetPosition()); 
} 

然后我使岩石的数组:

var rocks; 
function NewRandomRock() 
{ 
    var newRock = new Rock; 
    var pos = new b2Vec2; 
     pos.x = Math.random()*(gl.viewportWidth+1); 
     pos.y = Math.random()*(gl.viewportHeight+1); 
    newRock.InitRand(pos); 
    rocks.push(newRock); 
} 

然后我打电话给Tick功能:

function TickRocks() 
{ 
    for(var rock in rocks) 
    { 
     rock.Tick(); 
    } 
} 

现在的问题,我得到以下错误:

Uncaught TypeError: Object 0 has no method 'Tick'

虽然“InitRand(......)”的方法,我添加到岩以同样的方式,没有工作......

我在做什么错?

回答

2

你的问题是使用for in不是为迭代数组而设计的。它列举了对象属性。

您应该使用正常的循环:

for(var i = 0; i < rocks.length; i++) { 
    rocks[i].Tick(); 
} 
+1

这只是愚蠢的!但是啊,现在我学到了一些东西:D谢谢! –

1

你必须初始化变量:

function Rock() { 
    this.size = 30.0; 
    this.body = {};  //Initialize at an object 
    ... 
} 
var rocks = []; //Initalize an array 
function NewRandomRock() { 
    ... 

而且,由于rocks是一个数组,我建议循环使用for(; ;)

function TickRocks() 
{ 
    for(var i=0, l=rocks.length; i<l; i++) 
    { 
     var rock = rocks[i]; 
     rock.Tick(); 
    } 
} 
+0

我有一个'初始'方法,我使用初始化所有的变量;)(我这样做,因为有时我需要重新初始化对象)。 无论如何感谢:D –