色とスタート地点の違う円がcanvas内を跳ね返りながら移動するコードを書きました。しかし同じような命令が重複してしまっていて見にくく、関数などでまとめようと試行錯誤しましたが正常に作動せず困っています。まとめる前のコードは以下です(こちらのコードは正常に作動しました)。
HTML
1<!DOCTYPE html> 2<html><head> 3<meta charset="utf-8"> 4<title></title> 5<style> 6#canvas { 7 background-color: #000000; 8 border: 1px solid #999999; 9} 10</style> 11<script> 12var spdx=2.0; //横(x軸)方向への円の移動速度 13var spdy=2.0; //縦(y軸)方向への円の移動速度 14var spdx2=2.0; //横(x軸)方向への円の移動速度 15var spdy2=2.0; //縦(y軸)方向への円の移動速度 16var spdx3=2.0; //横(x軸)方向への円の移動速度 17var spdy3=2.0; //縦(y軸)方向への円の移動速度 18var spdx4=2.0; //横(x軸)方向への円の移動速度 19var spdy4=2.0; //縦(y軸)方向への円の移動速度 20var spdx5=2.0; //横(x軸)方向への円の移動速度 21var spdy5=2.0; //縦(y軸)方向への円の移動速度 22var coox=200; //円中心のx座標 23var cooy=200; //円中心のy座標 24var coox2=380; //円2中心のx座標 25var cooy2=450; //円2中心のy座標 26var coox3=5; //円3中心のx座標 27var cooy3=120; //円3中心のy座標 28var coox4=25; //円4中心のx座標 29var cooy4=360; //円4中心のy座標 30var coox5=300; //円5中心のx座標 31var cooy5=20; //円5中心のy座標 32 33var canvas, context, context2, context3, context4, context5; 34 35function init() { 36 //canvasを使えるかどうか判定 37 canvas=document.getElementById("canvas"); 38 context=canvas.getContext("2d"); 39 context2=canvas.getContext("2d"); 40 context3=canvas.getContext("2d"); 41 context4=canvas.getContext("2d"); 42 context5=canvas.getContext("2d"); 43 44 if (!context) return; 45 46 //30ミリ秒ごとにdrawing()を実行するようにタイマーを設定 47 setInterval(drawing,30); 48} 49 50function drawing() { 51 //Canvasを塗りつぶす 52 context.globalCompositeOperation="source-over"; 53 context.fillStyle="rgba(0,0,0,0.2)"; 54 context.fillRect(0,0,canvas.width,canvas.height); 55 context.globalCompositeOperation="lighter"; 56 57 //円の中心位置を更新 58 coox=coox+spdx; 59 cooy=cooy+spdy; 60 coox2=coox2+spdx2; 61 cooy2=cooy2+spdy2; 62 coox3=coox3+spdx3; 63 cooy3=cooy3+spdy3; 64 coox4=coox4+spdx4; 65 cooy4=cooy4+spdy4; 66 coox5=coox5+spdx5; 67 cooy5=cooy5+spdy5; 68 69 //左右(横方向)の移動方向を反転 70 if (coox<0 || canvas.width<coox) { 71 spdx=spdx*(-1); 72 } 73 if (coox2<0 || canvas.width<coox2) { 74 spdx2=spdx2*(-1); 75 } 76 if (coox3<0 || canvas.width<coox3) { 77 spdx3=spdx3*(-1); 78 } 79 if (coox4<0 || canvas.width<coox4) { 80 spdx4=spdx4*(-1); 81 } 82 if (coox5<0 || canvas.width<coox5) { 83 spdx5=spdx5*(-1); 84 } 85 86 //上下(縦方向)の移動方向を反転 87 if (cooy<0 || canvas.height<cooy) { 88 spdy=spdy*(-1); 89 } 90 if (cooy2<0 || canvas.height<cooy2) { 91 spdy2=spdy2*(-1); 92 } 93 if (cooy3<0 || canvas.height<cooy3) { 94 spdy3=spdy3*(-1); 95 } 96 if (cooy4<0 || canvas.height<cooy4) { 97 spdy4=spdy4*(-1); 98 } 99 if (cooy5<0 || canvas.height<cooy5) { 100 spdy5=spdy5*(-1); 101 } 102 103 104 //更新後の位置に円を描画 105 context.beginPath(); 106 context.fillStyle="#ff0066"; 107 context.arc(coox,cooy,3,0,Math.PI*2.0,true); 108 context.fill(); 109 110 context2.beginPath(); 111 context2.fillStyle="red"; 112 context2.arc(coox2,cooy2,3,0,Math.PI*2.0,true); 113 context2.fill(); 114 115 context3.beginPath(); 116 context3.fillStyle="blue"; 117 context3.arc(coox3,cooy3,3,0,Math.PI*2.0,true); 118 context3.fill(); 119 120 context4.beginPath(); 121 context4.fillStyle="green"; 122 context4.arc(coox4,cooy4,3,0,Math.PI*2.0,true); 123 context4.fill(); 124 125 context5.beginPath(); 126 context5.fillStyle="white"; 127 context5.arc(coox5,cooy5,3,0,Math.PI*2.0,true); 128 context5.fill(); 129} 130</script> 131</head> 132<body onload="init()"> 133<canvas id="canvas" width="640" height="480"> 134</body> 135</html>
この場合、どのようにまとめるのが最善なのでしょうか?またはまとめる必要はないのでしょうか?初心者なのでコードや詳しい解説を添えていただけたら非常に嬉しいです。よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/09 07:24