ES6 クラス継承を使用してゴージャスなボール効果を実現する方法

ES6 クラス継承を使用してゴージャスなボール効果を実現する方法

導入

このエフェクトは Canvas で描画され、クラス継承を使用して実装されます。マウスが指定された Canvas の位置に移動すると、現在のマウスの位置にランダムな色の小さなボールが生成され、その後ボールがゆっくりと消えていきます。

効果図

実装手順

  • HTML の記述
  • キャンバス環境を作成する
  • ライティングボール
  • Ballクラスを継承するMoveBallクラスを実装する
  • ボールをインスタンス化する

HTML構造

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
    <メタ文字セット="UTF-8">
    <meta name="viewport" content="width=デバイス幅、初期スケール=1.0">
    <title>美しいボール</title>
    <スタイル>
        #キャンバス{
            左余白: 100px
        }
    </スタイル>
</head>
<本文>
    <canvas id="canvas">お使いのブラウザはキャンバスをサポートしていません</canvas>

    <!-- <script src="./underscore-min.js"></script> -->
    <!-- Underscore にはすでに _.random 関数がパッケージ化されています。これをインポートして手動でランダム関数を書く必要はありません。 -->
    <script src="./index.js"></script>
</本文>
</html>

キャンバス環境を作成する

 // インデックス.js
 
 // 1. 現在のキャンバスを取得します。const canvas = document.getElementById('canvas');
 const ctx = canvas.getContext('2d');
  
 // キャンバスのサイズスタイルを設定します。canvas.width = 1000;
 キャンバスの高さ = 600;
 キャンバス.スタイル.背景色 = '#000'

分析例

まず、キャンバス要素を見つけます。

定数キャンバス = document.getElementById("myCanvas");

次に、コンテキスト オブジェクトを作成します。

const ctx = canvas.getContext('2d');

幅と高さの背景色を設定する

ライティングボール

// インデックス.js

 // 2. ボールクラス class Ball {
     コンストラクタ (x, y, 色) {
         this.x = x; // x軸 this.y = y; // y軸 this.color = color; // ボールの色 this.r = 40; // ボールの半径 }
 
     // ボールを描画する render () {
         ctx.save();
         ctx.beginPath();
         ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2);
         ctx.fillStyle = this.color;
         ctx.fill();
         ctx.restore();
     }
 }

分析例

  • 構築メソッドであるconstructor() メソッドがあり、this キーワードがインスタンス オブジェクトを表していることがわかります。
  • save() ---- 環境の現在の状態を保存する
  • beginPath() ---- パスを開始するか、現在のパスをリセットします
  • arc() ---- 円弧/曲線を作成するために使用します (円または部分円を作成するために使用します) -- パラメータは次のとおりです
パラメータ説明する
x円の中心の x 座標。
ええ円の中心の y 座標。
r円の半径。
角度開始角度(ラジアン単位)(円弧の 3 時の位置は 0 度です)。
eアングル終了角度(ラジアン単位)。
反時計回りオプション。描画を反時計回りにするか時計回りにするかを指定します。 False = 時計回り、True = 反時計回り。
  • fillStyle() ---- ペイントを塗りつぶすために使用される色、グラデーション、またはパターンを設定または返します。
  • fill() ---- 現在の描画(パス)を塗りつぶします
  • restore() ---- 以前に保存したパスの状態とプロパティを返します。

Ballクラスを継承するMoveBallクラスを実装する

// インデックス.js

// 3. ボールを動かすクラス class MoveBall extends Ball { // コンストラクタ (x, y, color) を継承します {
        スーパー(x, y, 色);

        // 数量の変化 // ボールのランダム座標 this.dX = Random(-5, 5);
        this.dY = ランダム(-5, 5);
        // ボールは最初は大きく、その後ゆっくりと消えていくため、半径を減少させるための乱数 this.dR = Random(1, 3);
    }

    // 4. ボールの位置と半径を変更する upDate () {
        this.x += this.dX;
        this.y += this.dY;
        this.r -= this.dR;
        // ボールの半径が0未満かどうかを判定する
        0 の場合
            this.r = 0 // 半径が 0 の場合、ボールは消えます}
    }
}

分析例

  • ここでは MoveBall クラスが定義されており、extends キーワードを通じて Ball クラスのすべてのプロパティとメソッドを継承します。
  • ここでは親クラスのコンストラクターを表す super キーワードは、親クラスの新しい this オブジェクトを作成するために使用されます。サブクラスはコンストラクター メソッドでスーパー メソッドを呼び出す必要があります。そうしないと、新しいインスタンスを作成するときにエラーが報告されます。これは、サブクラス独自の this オブジェクトが、まず親クラスのコンストラクターによって形成され、親クラスと同じインスタンス プロパティとメソッドが取得され、その後、サブクラス独自のインスタンス プロパティとメソッドで処理および追加される必要があるためです。スーパーメソッドが呼び出されない場合、サブクラスは this オブジェクトを取得しません。 (詳細はこちら)
  • upDateメソッドの目的は、ボールの位置と半径を変更し、マウスの位置に応じて異なる変更を加えることです。

ボールをインスタンス化する

// インデックス.js

// 5. ボールをインスタンス化する // 生成されたボールを保存する let ballArr = [];

// ランダム関数を定義する underscore-min.js を参照する場合は、ランダム関数を書く必要はなく、_.random を直接使用できます。
ランダム = (最小値, 最大値) => {
    Math.floor(Math.random() * (max - min) + min) を返します。
}

// マウスの動きをリッスンする canvas.addEventListener('mousemove', function (e){
    // ランダムな色 // 固定の色の配列を使用することもできます let colorArr = ['red', 'green', 'blue', 'yellow', 'orange', 'pink'];
    // bgcolor ==> colorArr[Random(0, colorArr.length - 1)]
    bgColor = `rgb(${Random(0,256)}, ${Random(0,256)}, ${Random(0,256)})` とします。
    ballArr.push(新しいMoveBall(e.offsetX, e.offsetY, bgColor));
    console.log(ballArr);
})

// タイマーを開始する setInterval(function () {

    // 画面をクリアします ctx.clearRect(0, 0, canvas.width, canvas.height);

    // ボールを描画します for (let i = 0 ; i < ballArr.length; i++ ) {
        ballArr[i].render();
        ボールArr[i].upDate();
    }
}, 50);

分析例

  • ランダムな色を生成するためのランダム関数を書いた
  • マウスの動きを聞いて動くボールを作成し、ボールを格納する配列にプッシュします。このように、配列内のボールにはレンダリングメソッドと更新メソッドがあります。最後に、Ball クラスの render メソッドを順番に呼び出して描画し、MoveBall の update メソッドを呼び出します。効果が出てきました!
  • clearRect クリア操作 ---- 指定された四角形内の指定されたピクセルをクリアします (詳細についてはクリックしてください)。画面をクリアしない場合の効果については、下の図を参照してください。

画面をクリアしないボールの半径が徐々に小さくなっていることがわかりますが、ボールは最終的に消えません。これは間違いなく私たちが望んでいる効果ではありません。画面をクリアするとどのような効果がありますか?記事冒頭のエフェクトです! (ベイビー、楽しんでね❤)

index.js の完全なコード

// 1. 現在のキャンバスを取得します。const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

// キャンバスのサイズスタイルを設定します。canvas.width = 1000;
キャンバスの高さ = 600;
キャンバス.スタイル.背景色 = '#000'

// 2. ボールクラス class Ball {
    コンストラクタ (x, y, 色) {
        this.x = x;
        y = y;
        this.color = 色;
        r = 40; を出力します。
    }

    // ボールを描画する render () {
        ctx.save();
        ctx.beginPath();
        ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2);
        ctx.fillStyle = this.color;
        ctx.fill();
        ctx.restore();
    }

}

// 3. ボールを動かすクラス class MoveBall extends Ball { // コンストラクタ (x, y, color) を継承します {
        スーパー(x, y, 色);

        // 数量の変化 // ボールのランダム座標 this.dX = Random(-5, 5);
        this.dY = ランダム(-5, 5);
        // 半径が小さい乱数 this.dR = Random(1, 3);
    }

    // 4. ボールの位置と半径を変更する upDate () {
        this.x += this.dX;
        this.y += this.dY;
        this.r -= this.dR;
        // ボールの半径が0未満かどうかを判定する
        0 の場合
            .r = 0 です
        }
    }

}

// 5. ボールをインスタンス化する // 生成されたボールを保存する let ballArr = [];

// ランダム関数を定義する underscore-min.js を参照する場合は、ランダム関数を書く必要はなく、_.random を直接使用できます。
ランダム = (最小値, 最大値) => {
    Math.floor(Math.random() * (max - min) + min) を返します。
}

// マウスの動きをリッスンする canvas.addEventListener('mousemove', function (e){
    // ランダムな色 // 固定の色の配列を使用することもできます let colorArr = ['red', 'green', 'blue', 'yellow', 'orange', 'pink'];
    // bgcolor ==> colorArr[Random(0, colorArr.length - 1)]
    bgColor = `rgb(${Random(0,256)}, ${Random(0,256)}, ${Random(0,256)})` とします。
    ballArr.push(新しいMoveBall(e.offsetX, e.offsetY, bgColor));
    console.log(ボールArr);
})

// タイマーを開始する setInterval(function () {

    // 画面をクリアします ctx.clearRect(0, 0, canvas.width, canvas.height);

    // ボールを描画します for (let i = 0 ; i < ballArr.length; i++ ) {
        ballArr[i].render();
        ボールArr[i].upDate();
    }
}, 50);

要約する

この小さなデモが、ES6 のクラスの理解と使用方法をよりよく理解するのに役立つことを願っています。 ES6 クラス継承を使用してゴージャスな小さなボールの効果を実現する方法についてのこの記事はこれで終わりです。 ES6 クラス継承を使用して小さなボールを実現することに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。 今後とも 123WORDPRESS.COM を応援してください。

以下もご興味があるかもしれません:
  • ClassやExtendsなどのES6の新機能の概念と使用法の分析
  • ES6 JavaScript におけるクラス継承の詳細な使用例
  • ES6 クラスチェーン継承、インスタンス化、React Super (props) 原則の詳細な説明

<<:  Linux sftp コマンドの使用法の概要

>>:  Mysql varchar型の合計操作例

推薦する

Linux のパスワードを紛失した場合にリセットする方法

1. スタートアップメニューでは、カーソルを最初の行に移動します - eを押します 2. UTF-8...

CentOS7でFTPサーバーを設定する方法

FTP は主にファイル転送に使用され、Linux では vsftpd で実装されるのが一般的です。F...

MySQL実行計画を学ぶ

目次1. 実施計画の概要2. 実行計画の実践id:選択タイプ:テーブル:タイプ:可能なキー:鍵:キー...

el-table ヘッダーでテキストを折り返す 3 つの方法の詳細な説明

目次問題の説明レンダリング3種類のコード要約する問題の説明通常、表のヘッダーは折り返されませんが、ビ...

Vue3 トランジションアニメーションの落とし穴記録について

目次背景問題の場所さらなる分析要約する背景私のコース「Vue 3 エンタープライズレベルの音楽アプリ...

VSCode と SSH を使用したリモート開発

0. リモート開発が必要な理由組み込み Linux を開発する場合、便宜上、通常は Windows ...

要素テーブルの多層ネスト表示の実践

複数の注文を含むリストが必要です。各注文は一意にすることも、複数の注文を結合することもできます。各注...

Vue は水の波紋効果のクリックフィードバック指示を実装します

目次水波効果実装を見てみましょう水の波紋のデフォルトスタイルをカスタマイズする水の波紋の位置と直径を...

JavaScript で Priority Queue を実装する

目次1. 優先キューの紹介2. 優先キューのカプセル化1. 優先キューの紹介通常のキューに要素が挿入...

DOCTYPE要素詳細説明完全版

1. 概要この記事では、DOCTYPE要素を体系的に説明します。同時に、多くの情報を調べました。イン...

Docker イメージの最適化 (1.16GB から 22.4MB)

目次最適化の第一歩: 軽量ベースイメージの使用第2段階の最適化:多段階構築Docker は、ソフトウ...

W3C チュートリアル (2): W3C プログラム

W3C 標準化プロセスは 7 つの異なるステップに分かれています。 W3C 標準化プロセスは 7 つ...

JavaScript 型検出方法の例のチュートリアル

序文JavaScriptはWebフロントエンドで広く使われている言語の一つであり、Webアプリケーシ...

SASSで変数のデフォルト値を使用する方法

SASS で定義された変数では、後で設定された値によって古い値が上書きされます。 $色: 赤; $色...

Dockerのクイックガイド

Docker は、安全で繰り返し可能な環境でソフトウェアを自動的にデプロイする方法を提供し、コンピュ...