Canvasを使って同じアニメーションを同一ページ内で複数箇所に設置したくて色々試しています。
設置したいのは波のような動きをするアニメーションです。
配列を使えばできるんじゃないかというところまで行き着きましたが、どうしてもエラーが出て解決できません。
下記のエントリを参考にして、複数設置できるように修正をしようとしているところです。
Canvasで波のアニメーションを描画する
▼現在のコード
html
1<div class="canvas-container"> 2 <canvas class="sineCanvas" id="sineCanvas01" width="2000" height="200"></canvas> 3</div> 4<div class="canvas-container"> 5 <canvas class="sineCanvas" id="sineCanvas02" width="2000" height="200"></canvas> 6</div> 7<div class="canvas-container"> 8 <canvas class="sineCanvas" id="sineCanvas03" width="2000" height="200"></canvas> 9</div>
javascript
1(function () { 2 3var unit = 20, 4 canvas, canvas2, context2, 5 xAxis, 6 yAxis, 7 draw, 8 classCount = $(".sineCanvas").length; 9var context = []; 10var width = []; 11var height = []; 12/** 13 * Init function. 14 * 15 * Initialize variables and begin the animation. 16 */ 17function init() { 18 canvas = document.getElementsByClassName("sineCanvas"); 19 for (i = 0; i < classCount; i++) { 20 context[i] = canvas[i].getContext('2d'); 21 canvas[i].width = $('.sineCanvas').width(); 22 canvas[i].height = $('.sineCanvas').height(); 23 width[i] = canvas[i].width; 24 height[i] = canvas[i].height; 25 } 26 xAxis = Math.floor(height[0]/2); 27 yAxis = 0; 28 draw(); 29} 30 31/** 32 * Draw animation function. 33 * 34 * This function draws one frame of the animation, waits 20ms, and then calls 35 * itself again. 36 */ 37function draw() { 38 for (i = 0; i < classCount; i++) { 39 // キャンバスの描画をクリア 40 context[i].clearRect(0, 0, width[i], height[i]); 41 42 //波を描画 43 drawWave('#EFDBAD', 0.3, 3, 0); 44 drawWave('#EFDBAD', 0.3, 3, 0); 45 drawWave('#EFDBAD', 0.3, 3, 0); 46 47 // Update the time and draw again 48 draw.seconds = draw.seconds + .014; 49 draw.t = draw.seconds*Math.PI; 50 setTimeout(draw, 35); 51 } 52}; 53draw.seconds = 0; 54draw.t = 0; 55 56/** 57* 波を描画 58* drawWave(色, 不透明度, 波の幅のzoom, 波の開始位置の遅れ) 59*/ 60function drawWave(color, alpha, zoom, delay) { 61 for (i = 0; i < classCount; i++) { 62 context[i].fillStyle = color; 63 context[i].globalAlpha = alpha; 64 65 context[i].beginPath(); //パスの開始 66 drawSine(draw.t / 0.5, zoom, delay); 67 context[i].lineTo(width[i] + 10, height[i]); //パスをCanvasの右下へ 68 context[i].lineTo(0, height[i]); //パスをCanvasの左下へ 69 context[i].closePath() //パスを閉じる 70 context[i].fill(); //塗りつぶす 71 } 72} 73 74 75/** 76 * Function to draw sine 77 * 78 * The sine curve is drawn in 10px segments starting at the origin. 79 * drawSine(時間, 波の幅のzoom, 波の開始位置の遅れ) 80 */ 81function drawSine(t, zoom, delay) { 82 var x = t; 83 var y = Math.sin(x)/zoom; 84 for (i = 0; i < classCount; i++) { 85 context[i].moveTo(yAxis, unit*y+xAxis[i]); 86 for (k = yAxis; k <= width[i] + 10; k += 10) { 87 x = t+(-yAxis+k)/unit/zoom; 88 y = Math.sin(x - delay)/3; 89 context[i].lineTo(k, unit*y+xAxis[i]); 90 } 91 } 92} 93 94init(); 95 96})();
▼現時点で出ているエラーはこちらです(Firebugで確認)
TypeError: context[i] is undefined context[i].lineTo(width[i] + 10, height[i]); //パスをCanvasの右下へ
初心者なので処理を順を追ってalertなどで表示しながら間違っているところを午前中からずっと探しているのですが、もう完全にお手上げ状態です...。
どこが間違っているか、そもそもこの考え方で実現可能なのか教えていただけないでしょうか??
もしくは配列を使わずにやる方法があればぜひ教えてください。
どうかよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/09 09:13
2016/06/09 09:25
2016/06/09 09:34
2016/06/09 12:10
2016/06/09 13:45 編集
2016/06/10 05:31