0

请考虑代码:

// define the GameObject constructor function

    var GameObject = function(width, height) {
    this.x = Math.floor((Math.random() * myCanvasWidth) + 1);
    this.y = Math.floor((Math.random() * myCanvasHeight) + 1);
    this.width = width;
    this.height = height;
    return this;
};

// (re)define the GameObject prototype object

GameObject.prototype = {
    x: 0,
    y: 0,
    width: 5,
    width: 5,
    draw: function() {
        myCanvasContext.fillRect(this.x, this.y, this.width, this.height);
    }
};

然后我们可以实例化 GameObject 100 次。

var x = 100,
arrayOfGameObjects = [];
do {
    arrayOfGameObjects.push(new GameObject(10, 10));
    } while(x--);

现在我们有一个包含 100 个游戏对象的数组,它们都共享相同的原型和绘制方法的定义,这极大地节省了应用程序内的内存。

当我们调用 draw 方法时,它将引用完全相同的函数。

var GameLoop = function() {
    for(gameObject in arrayOfGameObjects) {
        gameObject.draw(); // this is my problem. Is this correct? gameObject is simply and index who draw() method gets executed
    }
};

我的问题是执行方法 draw() 的最后一行代码。既然 gameObject 只是一个索引,那么 draw() 方法怎么能被执行呢?该索引不包含任何对象。它只是一个索引,对吗?

是一个链接

4

4 回答 4

1

您应该真正使用以下内容GameLoop

var GameLoop = function() {
    for(var i = 0; i < arrayOfGameObjects.length; i++) {
        arrayOfGameObjects[i].draw();
    }
};
于 2013-04-03T08:06:39.513 回答
0

使用普通for循环遍历数组。

var GameLoop = function() {
    for (var i = 0; i < arrayOfGameObjects.length; i++) {
        arrayOfGameObjects[i].draw();
    }
};

for in在数组上使用循环实际上是一种不好的做法,因为它只是一种获取所需索引的方法。

于 2013-04-03T08:06:58.513 回答
0

我喜欢 jquery $.each

$.each(arrayOfGameObjects, function(i, gObject) {
    gObject.draw();
});

否则,如其他人所述,使用数组长度进行迭代

于 2013-04-03T08:10:00.487 回答
0
var GameLoop = function() {
    for(var i = 0, len = arrayOfGameObjects.length; i<len; i++) {
        gameObject.draw();
    }
};

在http://jsfiddle.net/SdBcx/2/上看到这个工作

一些注意事项:

  • 使用for(obj in array)on Array 对象是不好的做法。原因是,如果你在 中添加自定义函数Array.prototype,自定义函数就会出现在你的 for 循环中!我在这里写了一个例子:http: //jsfiddle.net/BUp6T/
  • 您可以看到我将 保存arrayOfGameObjects.lengthlen变量中。这只发生一次,在循环执行之前。这比常见的解决方案要快得多,后者是:for(var i = 0; i < arrayOfGameObjects.length; i++)每次循环迭代都检索数组长度。
于 2013-04-17T00:46:09.243 回答