2010-09-20 52 views
1

我有以下使用mootools和mootools畫布庫編寫的代碼片段。使用javascript需要幫助使用此功能銷燬畫布上的項目

CANVAS.init({ canvasElement : 'canvas', interactive : true }); 

var itemlayer = CANVAS.layers.add({ id : 'items' }); 

for(var j = 0; j < 5; j++) 
{ 
for(var i = 0; i < 5; i++) 
{ 

    itemlayer.add({ 

     id : 'item-'+i + '-' + j, 
     x : 51 * i, 
     y : 51 * j, 
     w : 50, 
     h : 50, 
     state : 'normal', 
     interactive : true, //although they have no interactive events! 
     colors : { normal : '#f00', hover : '#00f' }, 
     events : { 
      onDraw : function(ctx){ 

        ctx.fillStyle = this.colors[this.state]; 
        ctx.fillRect(this.x,this.y,this.w,this.h); 

        this.setDims(this.x,this.y,this.w,this.h); 
      } 
     } 

    }); 


} 

} 

CANVAS.addThread(new Thread({ 
      id : 'myThread', 
      onExec : function(){ 
        CANVAS.clear().draw(); 
      } 
    })); 

現在我想要做的就是在畫布上繪製後立即摧毀廣場。

的文檔,這樣做中給出的函數是

item.destroy(); 

Refer here

問題是,無論我怎麼做,我都無法從畫布上銷燬對象!什麼是正確的方法來做到這一點?

參考code here implemented on js fiddle.

+0

投票刪除它。這個問題是由於一個錯誤而產生的,並且在一個相關的問題中得到解決。 – Shouvik 2010-10-12 04:52:52

回答

0

我不熟悉的mootools的內部結構,但它看起來像item.destroy()僅僅是發送一個事件,而不是實際破壞畫布上的項目。畫布僅僅是一個位圖 - 它沒有像SVG那樣的獨立基元的圖層或記錄。

您將需要實際重畫在畫布上沒有他們,畫他們,或使用自己破壞矩形:

ctx.clearRect(this.x, this.y, this.w, this.h); 

這將清除由參數定義的矩形中在畫布上的所有信息。

編輯:在做了一些閱讀之後,它看起來像是將一個destroy()函數傳遞給canvas項目的構造函數。這個函數必須包含你想銷燬你的物品的任何代碼(clearRect,fillRect,不管)。

+0

但是,我想清除項目ID,並希望另一個項目重用該ID。你是否告訴我,銷燬物品不允許我重複使用itemID,即一旦該物品被分配了一個ID就不能被銷燬? – Shouvik 2010-09-20 06:11:49

+0

您可以重新使用物品ID,但在沒有任何底層代碼的情況下觸發物件的銷燬事件不會使物件從畫布上消失。您需要自己清理像素,方法是編寫自己的銷燬事件函數,因爲畫布不知道在其上繪製了什麼「對象」 - 只是(x,y)處有一定的顏色。 – 2010-09-20 14:20:39

1

Mootools是一個基於JavaScript的框架。爲了使用它,你需要調用對象,就好像它們是類而不是直接構造器一樣。

CANVAS庫是規則的例外,因爲它是一個「靜態」類。但是,在使用圖層方法之前,您需要初始化圖層類。

當您使用Layer類的add方法時,您要求將新項目添加到該Layer類。你使用這個方法兩次,一次在循環之前,一次在它內部。但是,您無法初始化圖層類。因此,我假設循環應該初始化類。這需要與var itemlayer = new Layer('items');

當使用itemlayer.add循環內進行更換,要傳遞和對象到對象層,然後自動爲用戶在創建CanvasItem對象。然後它將這些對象返回給你。由於destroy方法是CanvasItem類的成員,因此需要將它們捕獲到變量中以便調用它。由於它發生在一個循環內,如果你想刪除循環外的對象,你將需要一個數組。

CANVAS.init({ canvasElement : 'canvas', interactive : true }); 

var itemlayer = new Layer('items'); 
var itemArray = new Array; 
for(var j = 0; j < 5; j++) 
{ 
for(var i = 0; i < 5; i++) 
{ 

    item Array[j][i] = itemlayer.add({ 

     id : 'item-'+i + '-' + j, 
     x : 51 * i, 
     y : 51 * j, 
     w : 50, 
     h : 50, 
     state : 'normal', 
     interactive : true, //although they have no interactive events! 
     colors : { normal : '#f00', hover : '#00f' }, 
     events : { 
      onDraw : function(ctx){ 

        ctx.fillStyle = this.colors[this.state]; 
        ctx.fillRect(this.x,this.y,this.w,this.h); 

        this.setDims(this.x,this.y,this.w,this.h); 
      } 
     } 

    }); 


} 

然後,當你想摧毀一個項目,只要你知道它的j和I指數,你可以用itemArray[j][i].destroy()刪除。

最後,請記住,destroy方法僅記錄爲觸發CanvasItem的銷燬事件。根據庫實現的內容,您可能需要編寫自己的銷燬事件以便實際將其從畫布中移除。

+0

嗨魯珀特。我其實想要釋放該項目,而不是僅使用僅刪除圖像的銷燬項目功能。我反而嘗試在同一個庫中使用remove函數,並遇到了很多問題。所以我得到了一些幫助,很快在源代碼中發現了一個錯誤。請參考這個問題。 http://stackoverflow.com/questions/3749880/i-am-able-to-draw-the-box-but-i-am-not-able-to-remove-it-canvas – Shouvik 2010-09-21 04:29:18