javascript - 迭代不同大小的网格来播放康威生命游戏的音频

标签 javascript loops web-audio-api

所以我对我的 Conway's Game of Life 版本有一个迭代问题(这不是我的代码,只是游戏逻辑的一个示例)。所以基本上游戏板有多种尺寸,从 32(W)X16(H),并以 2 的幂增加到 1024(W)X512(H)。我正在创建一个音频版本,以便每当细胞存活时,网络音频都会短暂播放振荡器音符。该音符的频率和增益取决于音频在板上的位置。我有 32 个频率节点和 16 个增益节点,因此板最右上方的单元将以最高频率和最大增益 (0.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 个增益节点(值从 0.05 到 0.8)的阵列。感谢您的帮助,希望这是有意义的!

最佳答案

它应该像坐标除以超过 32x16 的比例一样简单。对于 64 的宽度,您可以使用 Math.floor(i/2) 而不仅仅是 i。抱歉,如果这很明显并且我错过了问题的要点......

关于javascript - 迭代不同大小的网格来播放康威生命游戏的音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26813459/

相关文章:

javascript - 根据 slider 值增加圆的半径

php - endforeach 循环?

node.js - 从 Node.js 上的 Web Audio API 播放 PCM 流

javascript - 播放源缓冲区的一部分时未触发 Web 音频事件 "ended"

具有原型(prototype)设计的 Javascript setter 函数

javascript - 单击将文本框更改为文本区域

javascript - 这个函数是做什么的?我对读写部分最困惑

jquery - jQuery 的each 方法中的$(this) 和$(element)

javascript - 循环遍历 JSON 对象

javascript - 取消预定的网络音频