キャンバスは、マウスがまぶしい小さなボールの実装に従ってください。
マウスのボールを追う
<ブロッククオートキャンバスに負けず劣らず、とても楽しかったです。
エフェクトの実装
超クール
実装原理
- ボールを作成する
- blobにランダムな色とランダムな半径を追加する
- マウスの動きをインスタンス化して新しいBlobを追加する
- プロトタイプに追加されたメソッドを呼び出して、ブロブをアニメートさせる
- タイマーを使ってキャンバスを継続的に更新する
処理の実装
ボールを作成する
create関数は、blobのすべてのスタイルを保存し、関数のインスタンスを作成して、マウスの現在位置を
Ball
関数で作成したボールをインスタンス化し、最後に作成したボールを配列に格納し、各ボールのプロパティと値をオブジェクトとして保持します
function Ball(x, y, r) {
this.x = x;
this.y = y;
this.r = r;
this.color = getRandom();//generate a random color
this.dx = parseInt(Math.random() * 10) - 5;//generate the random move position
this.dy = parseInt(Math.random() * 10) - 5;//`-5` is to allow the ball to move randomly around
ballArr.push(this);//add the ball
}
//Listen for mouse movement events
canvas.addEventListener('mousemove', function (e) {
new Ball(e.offsetX, e.offsetY, parseInt(Math.random() * 20));
/* Instantiate Ball as a Ball object to call the methods of the prototype via __proto__ *})
ランダムカラーを生成する
<ブロッククオート
について
color
プロパティでは、色は6ビットの16進数値で表現されます。
したがって、6ビットの16進数をランダムに生成することで、ランダムカラーとして使用することができる
は、その
0 to f
この16個の数字を配列に格納し、ランダムに6個を生成することで
0 to 16
のインデックス値を得ることができるため、配列のインデックス番号からランダムに6から
0 to f
の数値は
split
の配列を返します。
//set a random color
function getRandom() {
var allType = '0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f';//hexadecimal colors
var allTypeArr = allType.split(',');//separate into arrays by ','
var color = '#';
for (var i = 0; i < 6; i++) {
//generate a random number from 0-16
var random = parseInt(Math.random() * allTypeArr.length);
color += allTypeArr[random];
}
return color;//return the randomly generated color
}
ブロブをレンダリングする
関数にプロトタイプチェーンを追加する
render
メソッドを通過するすべてのテストがBall
関数は、これらのメソッドを持つオブジェクトをインスタンス化します。
この関数が行うことは
Ball
を保持するオブジェクトを生成し、インスタンス化します。
x,y,r
これらの値
Ball.prototype.render = function () {
ctx.beginPath();//path start
ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2, false);//draw circle, position, radius
ctx.fillStyle = this.color;/ ctx.fill();/}
ボール情報の更新
なぜなら、生成されたブロブ
x,y,r
は固定されているので、Blobの位置も固定され、変更されることはありません。
そこで、それぞれのボールの位置と半径を変化させてボールを動かす必要があり、ボールの半径が0より小さいときに
remove
メソッドを使用して、配列からボールを削除します。
/* Update ball position and radius Clear if less than 0 *Ball.prototype.update = function () {
this.x += this.dx;//x changes
this.y += this.dy;//y change
this.r -= 0.1;//radius decreases
if (this.r < 0) {
this.remove();//call the added remove method
}
}
ブロブを削除する
これは、上記の呼び出しを
remove
メソッドは、これは現在のボールの半径が0未満である場合iは、配列全体をトラバース、このこの、つまり、&quot;このボール&quotを見つけ、配列内のメソッドを呼び出して配列のこの要素を削除します
splice(index,num) メソッドは、インデックスから始まる配列から num 個の要素を削除します。
Ball.prototype.remove = function () {
for (var i = 0; i < ballArr.length; i++) {
if (ballArr[i] == this) {
ballArr.slice(i, 1);//find the element that is less than 0 and remove it
}
}
}
キャンバスをレンダリングする
キャンバスはタイマーによって常に更新され、主に以下の手順で更新されます。
- キャンバスをクリアする
- 配列を繰り返し、すべてのボールに関する情報を取得し、canvas にレンダリングします。
- これを繰り返し呼び出すことで、ボール情報を更新する
setInterval(function () {
ctx.clearRect(0, 0, canvas.width, canvas.height);//clear the screen
for (var i = 0; i < ballArr.length; i++) {
ballArr[i].update();//update the ball
if (ballArr[i]) {
ballArr[i].render();//render the ball
}
}
}, 20);
フルコード
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body {
background: black;
}
canvas {
display: block;
border: 1px solid black;
margin: 0 auto;
}
</style>
</head>
<body>
<canvas width="1000px" height="1000px" id="myCanvas">
Current browser version is not supported, please upgrade your browser
</canvas>
<script>
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
// Define the position and radius of the ball
function Ball(x, y, r) {
this.x = x;
this.y = y;
this.r = r;
this.color = getRandom();//generate a random color
this.dx = parseInt(Math.random() * 10) - 5;//generate the random move position
this.dy = parseInt(Math.random() * 10) - 5;
ballArr.push(this);//add the ball
}
/* Update ball position and radius Clear if less than 0 * Ball.prototype.update = function () {
this.x += this.dx;
this.y += this.dy;
this.r -= 0.1;
if (this.r < 0) {
this.remove();// call the added remove method
}
}
Ball.prototype.remove = function () {
for (var i = 0; i < ballArr.length; i++) {
if (ballArr[i] == this) {
ballArr.slice(i, 1);//find the element that is less than 0 and remove it
}
}
}
//render the ball Draw the ball
//add methods to the prototype
Ball.prototype.render = function () {
ctx.beginPath();//start of path
ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2, false);//draw circle, position, radius
ctx.fillStyle = this.color;/ ctx.fill();
}
//Listen to mouse movement events
canvas.addEventListener('mousemove', function (e) {
new Ball(e.offsetX, e.offsetY, parseInt(Math.random() * 20));
//Instantiate Ball as a Ball object to call the prototype's methods via __proto__
console.log(ballArr);
})
var ballArr = [];
setInterval(function () {
ctx.clearRect(0, 0, canvas.width, canvas.height);//clear the screen
for (var i = 0; i < ballArr.length; i++) {
ballArr[i].update();//update the ball
if (ballArr[i]) {
ballArr[i].render();//render the ball
}
}
}, 20);
// Set the random color
function getRandom() {
var allType = '0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f';//hexadecimal colors
var allTypeArr = allType.split(',');//separate into arrays by ','
var color = '#';
for (var i = 0; i < 6; i++) {
var random = parseInt(Math.random() * allTypeArr.length);
// generate a random number from 0-16
color += allTypeArr[random];
}
return color;//return the randomly generated color
}
</script>
</body>
</html>
キャンバスは、マウスの実装を眩しいに従って、この記事は、これに導入され、より関連するキャンバスは、マウスのコンテンツは、以前の記事のスクリプトのホームを検索するか、次の関連記事を閲覧し続け、私はあなたが将来的にはより多くのスクリプトのホームをサポートして願ってくださいに従ってください!この記事では、キャンバスは、マウスの実装を眩しいに従って、この記事は、に導入されています。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン