2011-11-27 111 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

是的,这回答了它。我想我会在完成绘图时摧毁上下文变量。非常感谢! –