2012-01-16 112 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並不指向變量所屬的對象。