2013-06-02 35 views
0

У меня проблема с заполнением 25 элементов холста автоматически в цикле for. Они пронумерованы так: can01 до can25.Функция динамического холста DrawImage

Я пробовал все, что знал, чтобы рисовать разные изображения на холсте, и я потратил много времени на поиск нескольких статей, посвященных этой проблеме, но я их не нашел.

Это мой рабочий код, чтобы заполнить все элементы холст с тем же изображением:

var imageGrass = new Image();  

imageGrass.src = 'recources/imagesBG/grass.jpg'; 

imageGrass.onload = function() { 
    for (var i = 1; i < 26; i++) 
    { 
     if(i < 10) 
     { 
      var task = "can0" + i + "_ctx.drawImage(imageGrass, 0, 0);"; 
      eval(task); 
     } 
     else 
     { 
      var task = "can" + i + "_ctx.drawImage(imageGrass, 0, 0);"; 
      eval(task); 
     } 
    } 
} 

Но я действительно не знаю, как сделать imageGrass.src динамичным. Например, элемент холста №. 5 (can05) в этом случае будет выглядеть как текстура камня.

Я действительно с нетерпением жду ваших идей. Я просто не понимаю.

+0

Это яркий пример «eval is evil». Переформатируйте свой код, чтобы он не использовал 'eval', и вы найдете это * намного проще. – Dave

+1

hint: 'window ['name']' == 'name', но вы также можете использовать массив (что было бы лучше) – Dave

ответ

3

Вот как impliment хорошая идея Дейва использования массивов для организации холстов:

Создать массив, который будет содержать ссылки на все ваши 25 холстов (сделать то же самое для 25 контекстов)

var canvases=[]; 
var contexts=[]; 

Далее заполнить массив со всеми своими полотнами и контекстах:

for(var i=0;i<25;i++){ 
    var canvas=document.getElementById("can"+(i<10?"0":"")); 
    var context=canvas.getContext("2d"); 
    canvases[i]=canvas; 
    contexts[i]=context; 
} 

Если вы еще не видели его раньше : i<10?"0":"" является встроенным if/else, используемым здесь для добавления начального нуля к вашим сайтам с более низким номером.

Тогда вы можете получить ваши «can05» холст, как это:

var canvas=canvases[4];  

Почему 4 и не 5? Массивы основаны на нуле, поэтому холсты [0] имеют значение can01. Поэтому элемент 4 массива содержит ваш 5-й холст «can05».

Таким образом, вы можете принести рисунок контекст для «can05», как это:

var context=contexts[4]; 

Как говорит Дейв, «Evals зло», так вот, как извлечь контекст для «can05» и рисовать камень изображение на нем.

var context=contexts[4]; 
context.drawImage(stoneImage,0,0); 

Этого камень рисунок может быть сокращен до:

contexts[4].drawImage(stoneImage,0,0); 

Вы даже можете поместить этот сокращенный код в функцию для легкого повторного использования и модификации:

function reImage(canvasIndex, newImage){ 
    contexts[ canvasIndex ].drawImage(newImage,0,0); 
} 

Тогда вы можете изменить на любой из ваших полотен, позвонив по функции:

reimage(4,stoneImage); 

Вот и все!

Злые евреи были побеждены (предупреждение: никогда не приглашайте их на свой компьютер!)

Вот пример код и Fiddle: http://jsfiddle.net/m1erickson/ZuU2e/

Этот код создает 25 холстов динамически, а не жесткие кодирование элементы холста 25 HTML.

<!doctype html> 
<html> 
<head> 
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css --> 
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script> 

<style> 
    body{ background-color: ivory; padding:0px; margin:0px;border:0px; } 
    canvas{vertical-align: top; } 
</style> 

<script> 
$(function(){ 

    var canvases=[]; 
    var contexts=[]; 

    var grass=new Image(); 
    grass.onload=function(){ 

     // the grass is loaded 
     // now make 25 canvases and fill them with grass 
     // ALSO !!! 
     // keep track of them in an array 
     // so we can use them later! 
     make25CanvasesFilledWithGrass()  

     // just a test 
     // fill canvas#3 with gold 
     draw(3,"gold"); 
     // fill canvas#14 with red 
     draw(14,"red"); 

    } 
    //grass.src="https://dl.dropboxusercontent.com/u/139992952/stackoverflow/grass.jpg"; 
    //grass.src="grass.jpg"; 

    function make25CanvasesFilledWithGrass(){ 

     // get the div that we will fill with 25 canvases 
     var container=document.getElementById("canvasContainer"); 

     for(var i=0;i<25;i++){ 
      // create a new html canvas element 
      var canvas=document.createElement("canvas"); 
      // assign the new canvas an id, width and height 
      canvas.id="can"+(i<10?"0":"")+i; 
      canvas.width=grass.width; 
      canvas.height=grass.height; 
      // get the context for this new canvas 
      var ctx=canvas.getContext("2d"); 
      // draw the grass image in the new canvas 
      ctx.drawImage(grass,0,0); 
      // add this new canvas to the web page 
      container.appendChild(canvas); 
      // add this new canvas to the canvases array 
      canvases[i]=canvas; 
      // add the context for this new canvas to the contexts array 
      contexts[i]=ctx; 
     } 

    } 

    // test -- just fill the specified canvas with the specified color 
    function draw(canvasIndex,newColor){ 
     var canvas=canvases[canvasIndex]; 
     var ctx=contexts[canvasIndex]; 
     ctx.beginPath(); 
     ctx.fillStyle=newColor; 
     ctx.rect(0,0,canvas.width,canvas.height); 
     ctx.fill(); 
    } 


}); // end $(function(){}); 
</script> 

</head> 

<body> 
    <div id="canvasContainer"></div> 
</body> 
</html>