2014-06-13 49 views
1

我正在尝试为简单的基于画布的Space Invaders游戏创建一个对象数组。 我创建了一个空间入侵者对象和一个空间入侵者数组。我想在添加到数组之前稍微更改每个入侵者的水平位置和其他属性。这是我正在努力做到这一点:无法设置存储到对象数组中的对象属性(JavaScript)

// Invaders 
invaders = new Array(); 
invader = { 
    x: 0, 
    y: 0, 
    size: 25, 
    xspeed: 0.25, 
    yspeed: 0.1, 
    alive: 1, 
    letter: "" 
}; 

invadersMovingLeft = true; 
kills = 0; 

word = "interesting"; 
numberOfInvaders = word.length; 
letters = word.split(''); 
letterNumber = 0; 
xpos = 0; 
invaderSpacing = 50; 
exploding = false; 
shuffledLetters = shuffle(letters); 
hitLetters = ""; 

for (i = 0; i < numberOfInvaders; i++) { 
    invader['letter'] = shuffledLetters[letterNumber]; 
    invader['x'] = xpos; 
    xpos = xpos + invaderSpacing; 
    letterNumber = letterNumber + 1; 
    invaders[i] = invader; 
    console.log(invaders); 
} 

控制台日志显示每个入侵者具有完全相同的特性。任何想法这里有什么问题?我在与对象合作方面很陌生,可能会让初学者犯下错误。

回答

1

问题是您正在尝试使用invader作为基础对象,这会使所有入侵者引用同一个对象。

取而代之的是,拥有一个类似类的入侵者,你可以实例化一个新的入侵者。然后每个入侵者都是一个新的独立实例,您可以将其推送到数组。

function invader(){ 
    this.x = 0; 
    this.y = 0; 
    this.size = 25; 
    this.xspeed = 0.25; 
    this.yspeed = 0.1; 
    this.alive = 1; 
    this.letter = ""; 
} 

var invaders=new Array(); 
var inv; 

for(i=0;i<numberOfInvaders;i++){ 
    inv = new invader(); 
    inv.letter = shuffledLetters[letterNumber]; 
    inv.x = xpos; 
    xpos = xpos+invaderSpacing; 
    letterNumber = letterNumber+1; 
    invaders.push(inv); 
} 

console.log(invaders); 
+0

谢谢,这有助于很多。那么,在我试图这样做的时候,对象中的属性是不能改变的呢?一旦他们设定,他们永久? – praine

+0

对象属性_可以更改。例如: var obj = {a:'hi'}; obj.a // =>'hi'; obj.a ='bye'; obj.a; // =>'bye' 但是如果你说obj2 = obj,现在已经对同一个对象做了一个新的_reference_。您对obj2所做的任何更改都会影响obj。你对obj所做的任何修改都会影响obj2。所以这就是为什么你需要在实例化你的个人入侵者时使用新的关键字。您使用invader()构造函数的语法允许您使用'new'来实例化各个实例。 – LexJacobs

+0

@ user3737956不,它们不是永久的,只要你有一个对象的引用,你可以随时随意更改属性。在你的代码中,你正在使用'invader',然后将它附加到数组中,所以你每次都将相同的对象添加到数组中。我的代码创建了一个入侵者类,并创建了它的多个实例,它们都是相互独立的。 – MrCode

0

尝试增加

var newInvader = new invader(); 

你的循环。 (第一行)

然后将newInvader的属性更改为所需,然后将newInvader添加到数组而不是入侵者。