2014-11-08 1 views
0

Итак, у меня есть итерационный вопрос для моей версии Conway's Game of Life (Это не мой код, просто пример логики игры). Таким образом, в основном есть несколько размеров игрового поля, идущих от 32 (W) X16 (H) и возрастающих от 2 до 1024 (W) X512 (H). Я создаю аудио-версию, так что всякий раз, когда ячейка становится живой, веб-аудио воспроизводит заметку осциллятора на короткое время. Частота и усиление этой ноты зависят от того, где на доске находится аудио. У меня есть 32 частотных узла и 16 узлов усиления, поэтому ячейка в верхней правой части платы будет воспроизводить ноту на самой высокой частоте и наибольшее усиление (.8). Моя проблема возникает, когда размеры платы увеличиваются, например, 64X32. У меня возникли проблемы с выяснением логики того, как определить, какую ноту и выгоду использовать, поскольку ячейки в позиции 0 и 1 (слева направо снизу) будут иметь одинаковую частоту, равно как и ячейки в позиции 0 и 1 (вверху слева от левого угла) имеют одинаковый коэффициент усиления. Вот код для моей части, где у меня возникли проблемы:Итерация через сетки различного размера для воспроизведения звука для игры жизни Конвея

function updateGame() 
{ 
// GO THROUGH THE UPDATE GRID AND USE IT TO CHANGE THE RENDER GRID 
for (var i = 0; i < gridHeight; i++) 
    { 
     for (var j = 0; j < gridWidth; j++) 
      { 
       // HOW MANY NEIGHBORS DOES THIS CELL HAVE? 
       var numLivingNeighbors = calcLivingNeighbors(i, j); 

       // CALCULATE THE ARRAY INDEX OF THIS CELL 
       // AND GET ITS CURRENT STATE 
       var index = (i * gridWidth) + j; 
       var testCell = updateGrid[index]; 

       // CASES 
       // 1) IT'S ALIVE 
       if (testCell === LIVE_CELL) 
        { 
         if (gridWidth == 32) 
{ 
if (gainHeight == 0) 
{ 
    gainNode[0].gain.value = .05; 
    osc[i].connect(gainNode[0]); 
    gainNode[0].connect(context.destination); 
} 
else { 
    gainNode[j].gain.value = .05 * j; 
    osc[i].connect(gainNode[j]); 
    gainNode[j].connect(context.destination); 
     } 
    osc[i].start(context.currrentTime); 

if (context.currentTime == .5) 
{ 
gainNode[0].gain.value = 0; 
osc[i].connect(gainNode[0]); 
gainNode[0].connect(context.destination); 
} 

} 
else if (gridWidth == 64) //issues begin here 
{ 
if (gainHeight == 0 && (j == 0 || j == 1)) 
{ 

} 
else 
{ 

} 
} 
else if (gridWidth == 128) 
{ 

} 
else if (gridWidth == 256) 
{ 

} 
else if (gridWidth == 512) 
{ 

} 
else { 

} 
         // 1a FEWER THAN 2 LIVING NEIGHBORS 
         if (numLivingNeighbors < 2) 
          { 
           // IT DIES FROM UNDER-POPULATION 
           renderGrid[index] = DEAD_CELL; 
          } 
         // 1b MORE THAN 3 LIVING NEIGHBORS 
         else if (numLivingNeighbors > 3) 
          { 
           // IT DIES FROM OVERCROWDING 
           renderGrid[index] = DEAD_CELL; 
          } 
         // 1c 2 OR 3 LIVING NEIGHBORS, WE DO NOTHING 
         else 
          { 
           renderGrid[index] = LIVE_CELL; 
          } 
        } 
       // 2) IT'S DEAD 
       else if (numLivingNeighbors === 3) 
        { 
         renderGrid[index] = LIVE_CELL; 
        }      
       else 
        { 
         renderGrid[index] = DEAD_CELL; 
        } 
      } 
    } 
} 

Я на самом деле не реализовал звуковую часть кода все же, как я хотел, чтобы убедиться, что я имел правильную логику идти вперед, прежде чем я начал возиться с веб-аудио. У меня есть массив, заполненный 32 узлами осциллятора, и массив, заполненный 16 узлами усиления, оцененными от .05 до .8. Спасибо за помощь, и, надеюсь, это имело смысл!

ответ

1

Это должно быть так же просто, как деление координаты на то, насколько вы увеличены до 32x16. Для ширины 64 вы должны использовать Math.floor(i/2) вместо i. Извините, если это было очевидно, и я пропустил точку вопроса ...

+0

Нет, это был ответ, на который я надеялся. Просто не был уверен, как это выполнить синтаксически. Спасибо за быстрый ответ! – TeamRival

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