2011-11-27 94 views
0

當我試圖將圖像繪製到一個Canvas元素我得到這個exeption:畫布繪製錯誤

Uncaught Error: INDEX_SIZE_ERR: DOM Exception 1
textureLoadedstaticsprite.js:14
StaticSpritestaticsprite.js:21
(anonymous function)

所有兩個CanvasRenderingContent和HTMLImageElement存在。 我只是不明白這一點:S

這裏是前述代碼我使用:

/** 
    * Class for drawing static sprites, like trees and blocks 
    */ 

function StaticSprite(args) { 

    // Private Fields 
    var texture = new Image(); 

    // Events 
    function textureLoaded(context) { 
     console.log(context); 
     console.log(texture); 
     context.drawImage(texture, 0, 0, 32, 32); 

    } 

    // Constructor 

    // Add event listeners 
    texture.addEventListener("load", textureLoaded(this.graphics), false); 

    // Load texture 
    texture.src = "img/assets/wall1.png"; 

    if(args != undefined) { 

     // Set local fields 
     this.x = args.x || this.x; 
     this.y = args.y || this.y; 
     this.z = args.z || this.z; 
     this.width = args.width || this.width; 
     this.height = args.height || this.height; 

    } 

    this.width = 32; 
    this.height = 32; 

} 

// Inherit from GraphicsEntity 
StaticSprite.prototype = new GraphicsEntity(); 

這裏是GraphicsEntity基類,如果你需要它:P

/** 
    * Class for presentation of graphical objects. 
    */ 

function GraphicsEntity(args) { 

    // Private Fields 
    var x = 0; // The X-position of the GraphicsEntity relative to it's parent container 
    var y = 0; // The Y-position of the GraphicsEntity relative to it's parent container 
    var z = 0; // The Z-position of the GraphicsEntity relative to it's parent container 
    var width = 0; // The width of the GraphicsEntity 
    var height = 0; // The height of the GraphicsEntity 

    // Public Fields 
    this.DOMElement = null; // Reference to the corresponding HTML Element 
    this.graphics = null; // The 2D context for rendering 2D onto the element. 
    this.name = ""; // The name of the GraphicsEntity 

    // Properties 
    // The Alpha or transparency value of the GraphicsEntity, 1 is completely opaque, 0 is completely transparent. 
    Object.defineProperty(this, "alpha", { 

     get: function() { return parseFloat(this.DOMElement.style.opacity); }, 
     set: function(value) { this.DOMElement.style.opacity = value; } 

    }); 

    // The height of the GraphicsEntity 
    Object.defineProperty(this, "height", { 

     get: function() { return height; }, 
     set: function(value) { 

      height = value; // Set internal width 
      this.DOMElement.setAttribute("height", height); // Set DOMElement width 

     } 

    }); 

    // The width of the GraphicsEntity 
    Object.defineProperty(this, "width", { 

     get: function() { return width; }, 
     set: function(value) { 

      width = value; // Set internal width 
      this.DOMElement.setAttribute("width", width); // Set DOMElement width 

     } 

    }); 

    // The X-position of the GraphicsEntity relative to it's parent container 
    Object.defineProperty(this, "x", { 

     get: function() { return x; }, 
     set: function(value) { 

      x = value; // Set internal X-axis 
      this.DOMElement.style.left = Math.ceil(x) + "px"; // Set DOMElement X-axis 

     } 

    }); 

    // The Y-position of the GraphicsEntity relative to it's parent container 
    Object.defineProperty(this, "y", { 

     get: function() { return y; }, 
     set: function(value) { 

      y = value; // Set internal Y-axis 
      this.DOMElement.style.top = Math.ceil(y) + "px"; // Set DOMElement Y-axis 

     } 

    }); 

    // The Z-position of the GraphicsEntity relative to it's parent container 
    Object.defineProperty(this, "z", { 

     get: function() { return z; }, 
     set: function(value) { this.DOMElement.style.zIndex = parseInt(value); } 

    }); 

    // Constructor 

    // Get constructor values of use default 
    if(args) { 

     x = args.x || x; 
     y = args.y || y; 
     z = args.z || z; 
     width = args.width || width; 
     height = args.height || height; 

    } 

    // Create a new canvas element 
    this.DOMElement = document.createElement('canvas'); 

    // Set postion 
    this.DOMElement.style.position = "absolute"; // Positioning style 
    this.DOMElement.style.left = x + "px"; // X-axis 
    this.DOMElement.style.top = y + "px"; // Y-axis 
    this.DOMElement.style.zIndex = z; // Z-Axis 
    this.DOMElement.width = width; 
    this.DOMElement.height = height; 

    // Set opacity/alpha 
    this.DOMElement.style.opacity = 1; 

    // Get 2d canvas context 
    this.graphics = this.DOMElement.getContext('2d'); 

} 
+0

你能告訴我們的HTML行?何時以及如何稱呼「紋理上鍊」?如果您在drawimage中設置參數,那麼所有參數或默認參數都將被使用或調用?你究竟在哪裏調用畫布元素?設置2D上下文等? – alonisser

+0

雖然看起來像您的'texture.addEventListener'行是錯誤的,我還沒有正確地查看您的代碼。你在那裏調用函數,而不是作爲處理程序發送它。你可以嘗試捲曲或裝訂。在當前版本中,發送的處理程序是「未定義」的,因爲這是函數的返回值。 – davin

回答

5
texture.addEventListener("load", textureLoaded(this.graphics), false); 

該行嘗試添加由textureLoaded(this.graphics)返回的函數作爲事件偵聽器。該函數返回未定義,所以它不完全工作。

嘗試改變該行

texture.addEventListener("load", textureLoaded, false); 

和更換線路

function textureLoaded(context) { 

隨着

var context = this.graphics; 
    function textureLoaded() { 
+0

是的,這回答了它。我想我會在完成繪圖時摧毀上下文變量。非常感謝! –