2012-01-16 76 views
1

我使用此构造函数为游戏创建对象。 现在,每次都会覆盖一系列图像,使所有对象在屏幕上看起来都一样。构造函数。无法覆盖对全局变量的引用

这里是有问题的对象:

function Box() { 
    this.ready = false; 
    this.pics = pictures;//[]; 
    this.state = 0; 
    this.x = 0; 
    this.y = 0; 
    this.w = 1; 
    this.h = 1; 
    this.fill = "#444"; 
    this.load = function(array){ 
     var foo = []; 
     pictures = []; 
     for(var i = 0; i < array.length; i++){ 
      pictures.push(loadPic(array[i])); 
      foo.push(loadPic(array[i])); 
     } 
     //this.pics = pictures; 
     this.pics = foo; 
    } 
} 

线

this.pics = foo; 

似乎做什么都没有。另外,如果我将图片的初始值更改为除“图片”(这是全局变量)之外的任何内容,则游戏不会启动。

的Contex:https://github.com/kaninepete/Javascript-Games/blob/images/MVP.js

+0

你曾经调用过'box.load()'吗? – 2012-01-16 21:37:59

回答

1

最初,您正在创建playertarget对象并通过调用load加载它们的图片。由于您使用的是对象点方法语法,例如player.load来调用函数,因此所有对this的引用都应根据需要/预期进行设置。

但是要开始游戏,请致电reset(例如从myDown)。在reset之内,playertarget中的对象将被新实例替换(请注意拨打addRect)。新方法从不会调用方法load,因此两者都保留相同的图片(初始设置在Box中的全局为pictures)。因为两者都共享相同的阵列,所以它们最终被绘制成相同的。

一般建议:我建议摆脱全局变量,因为它们之间的依赖关系并不明显。然后你应该调用reset函数进行初始化,而不是在全局级别上实现两倍。在介绍事件处理程序之前,先尝试绘制静态图片。

+0

谢谢! 你一直美好。 – Kaninepete 2012-01-16 22:40:11

2

试试这个:

var $this = this; 
this.load = function(array){ 
    //... 
    $this.pics = foo; 
} 

你必须知道,this一个函数内部是不一样的this作为构造。其实一个在load()功能指向浏览器window对象。

相反,我们定义一个名为$this的变量(大多数人更喜欢that),并从函数内部引用它,使其成为闭包。

0

在单独函数中使用this并不指向变量所属的对象。