下記のサイトを参考に、落ち葉を降らせるアニメーションを製作中です。
Canvasで桜を降らせてみました | 株式会社オーツー|スタッフブログ
やりたいこと
このサイトの例に習って、落ち葉を動かすことはできたのですが、
更に、いくつかの別々の葉っぱの画像をランダムに表示させたいと思っています。
例)leaf1.svg,leaf2.svg,leaf3.svg
(サイトの例では、1つの画像を仕様)
現状のコードは以下のとおりです。
・参考サイトにある「雲の動き」などは使わないので省いてあります
・キャンバスサイズの指定など少し修正しています。
javascript
1var canvas = document.getElementById("canvas"); 2var container = document.getElementById('canvas_wrap'); 3var ctx = canvas.getContext("2d"); 4sizing(); 5var imgCnt = 15; 6var aryImg = []; 7var aryCloud = []; 8var cvsw = $(window).width(); 9var cvsh = $(window).height(); 10var imgBaseSizeW = 15; 11var imgBaseSizeH = 20; 12var aspectMax = 2; 13var aspectMin = 1; 14var speedMax = 4; 15var speedMin = 2; 16var angleAdd = 100; 17var wind = 200; 18var newWind = 20; 19var windMax = 10; 20var windMin = 5; 21var img = new Image(); 22img.src = "resource/images/common/leaf.svg"; 23img.onload = flow_start; 24 25function sizing() { 26 canvas.height = container.offsetHeight; 27 canvas.width = container.offsetWidth; 28 } 29 30 31function setImagas(){ 32 var aspect = 0; 33 for(var i = 0;i < imgCnt;i++){ 34 aspect = Math.random()*(aspectMax-aspectMin)+aspectMin; 35 aryImg.push({ 36 "posx": Math.random()*cvsw, 37 "posy": Math.random()*cvsh, 38 "sizew": imgBaseSizeW*aspect, 39 "sizeh": imgBaseSizeH*aspect, 40 "speedy": Math.random()*(speedMax-speedMin)+speedMin, 41 "angle": Math.random()*360, 42 }); 43 } 44} 45 46var idx = 0; 47var idxc = 0; 48var cos = 0; 49var sin = 0; 50var rad = Math.PI / 180; 51 52function flow(){ 53 ctx.clearRect(0,0,cvsw,cvsh); 54 for(idx = 0;idx < imgCnt;idx++){ 55 aryImg[idx].posx += wind/aryImg[idx].sizew; 56 aryImg[idx].posy += aryImg[idx].speedy; 57 (idx%2) ? aryImg[idx].angle += 1 : aryImg[idx].angle -= 1; 58 cos = Math.cos(aryImg[idx].angle * rad); 59 sin = Math.sin(aryImg[idx].angle * rad); 60 ctx.setTransform(cos, sin, sin, cos, aryImg[idx].posx, aryImg[idx].posy); 61 ctx.drawImage(img, 0, 0 , aryImg[idx].sizew , aryImg[idx].sizeh); 62 ctx.setTransform(1, 0, 0, 1, 0, 0); 63 if(aryImg[idx].posy >= cvsh){ 64 aryImg[idx].posy = -aryImg[idx].sizeh; 65 if(imgCnt < idx){ 66 aryImg.splice(idx, 1); 67 } 68 } 69 if(aryImg[idx].posx >= cvsw){ 70 aryImg[idx].posx = -aryImg[idx].sizew; 71 if(imgCnt < idx){ 72 aryImg.splice(idx, 1); 73 } 74 } 75 } 76} 77 78function windowChange(){ 79 newWind = Math.random()*(windMax-windMin)+windMin; 80 setInterval(function(){ 81 if(newWind != wind){ 82 (newWind > wind) ? wind += 0 : wind -= 0; 83 } 84 },100); 85} 86 87function flow_start(){ 88 setImagas(); 89 setInterval(flow,10); 90}
調べたりやってみたこと
画像の指定部分は
javascript
1img.src = "resource/images/common/leaf.svg";
canvasで画像の描画部分は、
javascript
1ctx.drawImage(img, 0, 0 , aryImg[idx].sizew , aryImg[idx].sizeh);
だと思うので、ここの変数imgを配列を使ったり、Math.randomとかで何かするのかなぁと思ったのですが、うまくいきません。
どうしたら実現できるのかお教えください。よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/12 14:29
退会済みユーザー
2019/09/13 00:17