2016-05-30 3 views
0

Я пытаюсь нарисовать котенка в холсте HTML5 через конструктор классов с использованием TypeScript, но я смущен тем, как достичь этой задачи. Я прокомментировал код, чтобы показать, что я пытался сделать, исходя из поведения, которое я ожидал, и того, что на самом деле работает. Большое спасибо за ваш таймер и совет.Класс TypeScript .drawImage

module Game { 

    export class Test { 

     width: number; 
     height: number; 

     cellWidth: number; 
     cellHeight: number; 

     canvas: HTMLCanvasElement; 
     context: CanvasRenderingContext2D; 

     constructor() { 

      this.width = 28; 
      this.height = 31; 

      this.cellWidth = 20; 
      this.cellHeight = 20; 

      this.canvas = <HTMLCanvasElement> document.getElementById("game_canvas"); 
      this.context = this.canvas.getContext("2d"); 
      this.canvas.width = this.width * this.cellWidth; 
      this.canvas.height = this.height * this.cellHeight; 

      this.context.fillStyle = "blue"; 
      this.context.fillRect(0, 0, this.canvas.width, this.canvas.height); 

      let kitten = new Image(); 
      kitten.src = 'img/kitten.png'; 

      // When trying to draw a kitten in the canvas, 
      // this will work: 

      kitten.onload =() => { 
       this.context.drawImage(kitten, 0, 0); 
      }; 

      // but this work won't: 
      //this.context.drawImage(kitten, 0, 0); 

      /* 
      I was assuming that by accessing the this.context property 
      I would have direct access to the canvas and I will be able to use 
      drawImage to draw the kitten on it; however, that approach 
      produces no kitten in the canvas. 
      Only by using the .onload method it works. 
      I am using the() => notation so that the this inside the block 
      is referring to the class. 
      I have seen many JavasScript files in which images are simple drawn 
      through: 
      context.drawImage(image, 0, 0); 
      They are not embedded in .onload 
      I have tried to Google information but I cannot pinpoint what is 
      happening. 
      */ 
     } 
    } 
} 
+1

довольно просто потому, что вы объявляете новое изображение() и устанавливаете src, ваш вызов drawImage, без сомнения, будет зависеть от загружаемого src ... если вы использовали ранее загруженное изображение (например, из DOM), то создание нового изображения и загрузки не потребуется –

+0

@AMacdonald Большое спасибо за ваше объяснение! Теперь я понимаю лучше. Должен ли я затем загружать изображения вне этого класса - например, в другом классе? Когда я попытался использовать метод для класса для загрузки изображения до использования this.context.drawImage(), он не сработал. Я пытаюсь придерживаться ООП-проекта :) Я должен нарисовать четырех котят на холсте. Я думаю, что лучше загружать и хранить их в массиве, но не уверен, где создать этот массив. Спасибо за любую дополнительную информацию :) – decahub

+0

установка триггеров src нагрузка - выполнение этого в другом классе по-прежнему подвергает вас времени ожидания загрузки, и вы не можете быть уверены - я бы сказал, что использование onload является пуленепробиваемым и необходимым, если вы являетесь загрузчиком используемых вами изображений - единственными альтернативными методами являются то, что изображения уже загружены в DOM, вы можете найти, что примеры холста, которые вы видели, предназначены для инициирования загрузки изображений. –

ответ

0

Согласно моим комментариям, это мой ответ: довольно просто потому, что вы объявляете новое изображение() и устанавливаете src, ваш вызов drawImage, без сомнения, будет зависеть от загружаемого src ... если бы вы были используйте ранее загруженное изображение (например, из DOM), тогда создание нового изображения и загрузка не потребуются

установка триггеров src, загрузка - выполнение этого в другом классе по-прежнему подвергает вас времени ожидания загрузки и вы не можете быть уверены - я бы сказал, что использование onload является пуленепробиваемым и существенным, если вы являетесь загрузчиком изображений, которые вы используете - единственными альтернативными методами являются, когда изображения уже загружены в DOM (или предварительно загружены в другое место), вы можете найти примеры холста, которые вы видели, предназначены для инициирования загрузки изображений rned

1

Из кода:

 let kitten = new Image(); 
     kitten.src = 'img/kitten.png'; 

     // When trying to draw a kitten in the canvas, 
     // this will work: 

     kitten.onload =() => { 
      this.context.drawImage(kitten, 0, 0); 
     }; 

     // but this work won't: 
     //this.context.drawImage(kitten, 0, 0); 

Использование onload является де-факто, как вы получите изображение, которое вы можете рисовать на холсте. Микрооптимизация заключалась бы в том, чтобы сохранить словарь загруженных изображений, чтобы вы могли повторно использовать их при рисовании нескольких котят.

Смежные вопросы