Javascriptでボイド(群れのシミュレーション)が背景画像を塗りつぶすようにしたいのですが、背景画像をボイドを重ね合わせたり、ボイドに対してbackground-imageを設定することが出来ませんことが出来ません。
HTML
1<!DOCTYPE html> 2<meta charset="utf-8"> 3<title>BakuBag(MemoryEater)</title> 4<style>body{margin:0;padding:0;}</style> 5<canvas id="world"></canvas> 6<link rel="stylesheet" href="stylesheet.css"> 7<div> 8 <script src="bakubag.js"></script> 9</div>
Javascript
1var FPS = 30; // フレームレート 2var SCREEN_SIZE = 500; // 画面サイズ 3var NUM_BOIDS = 150; // ボイドの数 4var BOID_SIZE = 10; // ボイドの大きさ 5var MAX_SPEED = 600; // ボイドの最大速度 6var canvas = document.getElementById('world'); 7var ctx = canvas.getContext('2d'); 8var boids = []; // ボイド 9 10 11 12window.onload = function() { 13 /* 初期化 */ 14 canvas.width = canvas.height = SCREEN_SIZE; 15 ctx.fillStyle = "rgba(0, 0, 0, 0.2)"; // ボイドの色 16 for (var i=0; i<NUM_BOIDS; ++i) { 17 boids[i] = { 18 x: Math.random()*SCREEN_SIZE, // x座標 19 y: Math.random()*SCREEN_SIZE, // y座標 20 vx: 0, // x方向の速度 21 vy: 0 // y方向の速度 22 } 23 } 24 /* ループ開始 */ 25 setInterval(simulate, 1000/FPS); 26}; 27 28var simulate = function() { 29 draw(); // ボイドの描画 30 move(); // ボイドの座標の更新 31}; 32/** 33 * ボイドの描画 34 */ 35var draw = function() { 36 // 画面をクリア 37 // 全てのボイドの描画 38 for (var i=0,len=boids.length; i<len; ++i) { 39 ctx.fillRect(boids[i].x-BOID_SIZE/2, boids[i].y-BOID_SIZE/2, BOID_SIZE, BOID_SIZE); 40 } 41}; 42/** 43 * ボイドの位置の更新 44 */ 45var move = function() { 46 for (var i=0,len=boids.length; i<len; ++i) { 47 // ルールを適用して速さを変更 48 rule1(i); // 近くの群れの真ん中に向かおうとする 49 rule2(i); // ボイドは他のボイドと距離を取ろうとする 50 rule3(i); // ボイドは他のボイドの平均速度に合わせようとする 51 // limit speed 52 var b = boids[i]; 53 var speed = Math.sqrt(b.vx*b.vx + b.vy*b.vy); 54 if (speed >= MAX_SPEED) { 55 var r = MAX_SPEED / speed; 56 b.vx *= r; 57 b.vy *= r; 58 } 59 // 壁の外に出てしまった場合速度を内側へ向ける 60 if (b.x<0 && b.vx<0 || b.x>SCREEN_SIZE && b.vx>0) b.vx *= -1; 61 if (b.y<0 && b.vy<0 || b.y>SCREEN_SIZE && b.vy>0) b.vy *= -1; 62 // 座標の更新 63 b.x += b.vx; 64 b.y += b.vy; 65 } 66}; 67/** 68 * ルール1: ボイドは近くに存在する群れの中心に向かおうとする 69 */ 70var rule1 = function(index) { 71 var c = {x: 0, y:0}; // 自分を除いた群れの真ん中 72 for (var i=0,len=boids.length; i<len; ++i) { 73 if (i != index) { 74 c.x += boids[i].x; 75 c.y += boids[i].y; 76 } 77 } 78 c.x /= boids.length - 1; 79 c.y /= boids.length - 1; 80 boids[index].vx += (c.x-boids[index].x) / 100; 81 boids[index].vy += (c.y-boids[index].y) / 100; 82}; 83/** 84 * ルール2: ボイドは隣のボイドとちょっとだけ距離をとろうとする 85 */ 86var rule2 = function(index) { 87 for (var i=0,len=boids.length; i<len; ++i) { 88 if (i != index) { 89 var d = getDistance(boids[i], boids[index]); // ボイド間の距離 90 if (d < 5) { 91 boids[index].vx -= boids[i].x - boids[index].x; 92 boids[index].vy -= boids[i].y - boids[index].y; 93 } 94 } 95 } 96}; 97/** 98 * ルール3: ボイドは近くのボイドの平均速度に合わせようとする 99 */ 100var rule3 = function(index) { 101 var pv = {x: 0, y: 0}; // 自分を除いた群れの平均速度 102 for (var i=0,len=boids.length; i<len; ++i) { 103 if (i != index) { 104 pv.x += boids[i].vx; 105 pv.y += boids[i].vy; 106 } 107 } 108 pv.x /= boids.length - 1; 109 pv.y /= boids.length - 1; 110 boids[index].vx += (pv.x-boids[index].vx) / 8; 111 boids[index].vy += (pv.y-boids[index].vy) / 8; 112}; 113/** 114 * 2つのボイド間の距離 115 */ 116var getDistance = function(b1, b2) { 117 var x = b1.x - b2.x; 118 var y = b1.y - b2.y; 119 return Math.sqrt(x*x + y*y); 120};
CSS
1div { 2 background-image: url(https://rr.img.naver.jp/mig?src=http%3A%2F%2Fimgcc.naver.jp%2Fkaze%2Fmission%2FUSER%2F20150327%2F67%2F6958377%2F2%2F1593x900x25ac922fae9c3d7642663d7.jpg%2F300%2F600&twidth=300&theight=600&qlt=80&res_format=jpg&op=r); 3 4}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/08/14 22:43
退会済みユーザー
2017/08/14 23:00
2017/08/15 13:12