ホームページ ウェブフロントエンド H5 チュートリアル HTML5 キャンバスを使用して雪の結晶を降らせる方法

HTML5 キャンバスを使用して雪の結晶を降らせる方法

Jun 14, 2018 am 09:57 AM
canvas html5

この記事では主に雪片が落ちる特殊効果を実現するための HTML5 キャンバスを詳しく紹介します。この効果は魅力的でリアルなアニメーション効果を実現します。興味のある方は参考にしてください。

落下の効果を示す表示をインターネット上でたくさん見てきました。 HTML5 のスノーフレークは、確か​​に非常に魅力的です。皆さんも私と同じように興奮しており、コードの実装方法を研究したいと考えていると思います。ただし、これらのソース コードはさまざまな場所からダウンロードできます。そのようなアニメーションを作成するときに他の人がどのようなアイデアや考えを持っているかを分析します。

私は最近たまたまよく勉強していて、時間を利用して需要分析、知識ポイント、プログラミングから段階的に分析しました。笑わない。

最終的なレンダリングは次のとおりです:

図 1

1. 円形の雪の結晶

この例では、雪の結晶の形状は円形です

2。雪の結晶は固定されています

画像によると 1. 降る過程で、画像全体の雪の結晶の数を注意深く観察します。この要件は、観察と分析を通じて取得する必要があります。これは、私たちが実際に見る、空一面に雪が舞う光景と一致しています。

3. 雪の結晶のサイズは一定ではありません

各雪の結晶のサイズは異なるため、雪の結晶の半径はランダムになります。これは、現実の空に雪の結晶が飛んでいるのを見るシーンとも一致します。

4. 雪の結晶の位置が移動します

雪の結晶が降ってくると、当然その位置も移動します。

2. 知識のポイント

1. Html5 Canvas+JavaScript を使用して円を描画します - 円形の雪の結晶を形成します

Html5 では、円を描くために Canvas と JavaScript を使用して円弧を形成する必要があります(x ,y,r,start,stop);

2. 乱数 - 異なる半径と座標を持つ円形の雪の結晶を生成します

この例では、Web ページが初めて読み込まれるときに、特定の数の雪の結晶が生成されます。異なる半径と位置を生成する必要があるため、半径と座標は乱数になります。雪の結晶の落下過程では、半径は変化せず、座標は一定の範囲内で変化するため、この時点では座標も乱数になります。 Math.random()

3. プログラミング

1. 準備

キャンバスを置き、全体の背景色を黒に設定します

HTMLコード:

<canvas id="mycanvas">
    您的浏览器不支持canvas画布   
</canvas>
ログイン後にコピー

CSSコード:

* {   
    margin: 0;   
    padding: 0;   
}   
#mycanvas {   
    background: black;   
}
ログイン後にコピー

効果は次のとおりです:

注: キャンバス デフォルトでは、初期化の高さと幅があるため、心配する必要はありません

2. キャンバスは全画面で表示されます

コードは次のとおりです:

//获取mycanvas画布   
    var can = document.getElementById("mycanvas");   
    var ctx = can.getContext("2d");   
    //画布宽度   
    var wid = window.innerWidth;   
    //画布高度   
    var hei = window.innerHeight;   
    can.width=wid;   
    can.height=hei;
ログイン後にコピー

このときの効果は次のとおりです:

3. 初期化の生成 雪片の固定数

上記の需要分析と知識ポイントの解釈によれば、まず、雪の結晶の数は固定されているため、変数 var Snow = 100 を定義する必要があります。ここでは雪の結晶の数が 100 であると仮定します。オブジェクトの場合、このオブジェクトのプロパティには半径、座標 (X, Y) が含まれます。雪の結晶オブジェクトは var SnowOject={x:1, y:10,r:5} として記述できます。ここでは円形を表します。座標 (1,10) と半径 5 のスノーフレーク。この例では、半径と座標は乱数であるため、Math.random() を使用してそれぞれ半径と座標 (X, Y) を生成します。 ;

ここには 100 個の雪片があるため、後続の操作を容易にするために、配列を使用してこれら 100 個の雪片オブジェクトを保存します。

JavaScript コードは次のとおりです:

//雪花数目   
var snow = 100;   
//雪花坐标、半径   
var arr = []; //保存各圆坐标及半径   
for (var i = 0; i < snow; i++) {   
arr.push({   
x: Math.random() * wid,   
y: Math.random() * hei,   
r: Math.random() * 10 + 1   
})   
}
ログイン後にコピー

4. 雪の結晶の描画

上記では、100 個の雪の結晶の半径と座標 (X, Y) を生成しました。以下は、ループ内でキャンバスを使用して雪の結晶を描画する方法です (ここでは、円を描く)、ここで関数を定義します

JavaScript コードは次のとおりです:

//画雪花   
function DrawSnow() {   
    ctx.fillStyle="white";   
    ctx.beginPath();   
    for (var i = 0; i < snow; i++) {   
        var p = arr[i];   
        ctx.moveTo(p.x,p.y);   
        ctx.arc(p.x,p.y,p.r,0,2*Math.PI,false);   
    }   
    ctx.fill();   
  
    ctx.closePath();
ログイン後にコピー

次に DrawSnow() 関数を呼び出すと、効果は次のようになります:


Web ページを複数回更新して確認してください。異なるサイズと位置の雪の結晶が生成される場合 (通常は [はい])、これを実行すると最終的な効果に近づきます

注: ここでは 100 個の円を描画する必要があるため、描画開始座標は描画開始座標が再定義されるたびに再定義されます。円が描画されます: ctx.moveTo(p.x,p.y); それ以外の場合は、そのようになります 奇妙な効果がある場合は、信じられない場合は試してみてください

5. 雪の結晶がひらひらしています

100個の雪の結晶を描きました残念ながら、変化する効果は Web ページを更新することによってのみ確認できますが、達成する必要があるのは、雪片の移動が停止しないことです。

まず、setInterval 関数を使用して雪片を継続的に再描画する必要があります。ここでの間隔は 50 ミリ秒です: setInterval(DrawSnow,50);

同时每一朵雪花的坐标(X、Y)需要不停的改变(在一定幅度内),我们这里的雪花是从左上方飘落到右下方,所以每朵X、Y坐标值都在不停的增大,那我们用一个函数SnowFall()定义雪花飘过规则

该函数代码如下:

//雪花飘落   
function SnowFall() {   
    for (var i = 0; i < snow; i++) {   
        var p = arr[i];   
        p.y += Math.random() * 2 + 1;   
        if (p.y > hei) {   
            p.y = 0;   
        }   
        p.x += Math.random() * 2 + 1;   
        if (p.x > wid) {   
            p.x = 0;   
    <span style="white-space:pre">    </span>}   
    }   
}
ログイン後にコピー

然后将该函数放入DrawSnow()执行,注意:我们每隔50毫毛重画雪花,必须擦除画布,所以DrawSnow()函数体内必须在前面执行clearRect()函数,即:ctx.clearRect(0, 0, wid, hei);

此时DrawSnow函数定义如下:

//画雪花   
function DrawSnow() {   
    ctx.clearRect(0, 0, wid, hei);   
    ctx.fillStyle = "white";   
    ctx.beginPath();   
    for (var i = 0; i < snow; i++) {   
        var p = arr[i];   
        ctx.moveTo(p.x, p.y);   
        ctx.arc(p.x, p.y, p.r, 0, 2 * Math.PI, false);   
    }   
    ctx.fill();   
    SnowFall();   
    ctx.closePath();   
}
ログイン後にコピー

最后执行setInterval(DrawSnow, 50);

OK,经过我们上述步骤,小伙伴们是否已经对整个过程及技术实现很清晰了。

完整代码如下(大家可以直接复制到自己项目中执行,测试下效果):

<!DOCTYPE html>  
<html>  
  
    <head>  
        <meta charset="utf-8" />  
        <title></title>  
        <script src="js/jquery-1.8.3.min.js"></script>  
        <style type="text/css">  
            * {   
                margin: 0;   
                padding: 0;   
            }   
               
            #mycanvas {   
                background: black;   
            }   
        </style>  
    </head>  
  
    <body>  
        <canvas id="mycanvas">  
            您的浏览器不支持canvas画布   
        </canvas>  
        <script>  
            //获取mycanvas画布   
            var can = document.getElementById("mycanvas");   
            var ctx = can.getContext("2d");   
            //画布宽度   
            var wid = window.innerWidth;   
            //画布高度   
            var hei = window.innerHeight;   
            can.width = wid;   
            can.height = hei;   
            //雪花数目   
            var snow = 100;   
            //雪花坐标、半径   
            var arr = []; //保存各圆坐标及半径   
            for (var i = 0; i < snow; i++) {   
                arr.push({   
                    x: Math.random() * wid,   
                    y: Math.random() * hei,   
                    r: Math.random() * 10 + 1   
                })   
            }   
            //画雪花   
            function DrawSnow() {   
                ctx.clearRect(0, 0, wid, hei);   
                ctx.fillStyle = "white";   
                ctx.beginPath();   
                for (var i = 0; i < snow; i++) {   
                    var p = arr[i];   
                    ctx.moveTo(p.x, p.y);   
                    ctx.arc(p.x, p.y, p.r, 0, 2 * Math.PI, false);   
                }   
                ctx.fill();   
                SnowFall();   
                ctx.closePath();   
            }   
            //雪花飘落   
            function SnowFall() {   
                for (var i = 0; i < snow; i++) {   
                    var p = arr[i];   
                    p.y += Math.random() * 2 + 1;   
                    if (p.y > hei) {   
                        p.y = 0;   
                    }   
                    p.x += Math.random() * 2 + 1;   
                    if (p.x > wid) {   
                        p.x = 0;   
                    }   
                }   
            }   
            setInterval(DrawSnow, 50);   
        </script>  
    </body>  
  
</html>
ログイン後にコピー

好了,今天分享就到这里,希望对大家的学习有所帮助。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

如何在canvas里面基于随机点绘制一个多边形

用HTML5 Canvas来绘制三角形和矩形等多边形的方法

以上がHTML5 キャンバスを使用して雪の結晶を降らせる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

HTMLの表の境界線 HTMLの表の境界線 Sep 04, 2024 pm 04:49 PM

HTML の表の境界線に関するガイド。ここでは、HTML でのテーブルの境界線の例を示しながら、テーブル境界線を定義する複数の方法について説明します。

HTML のネストされたテーブル HTML のネストされたテーブル Sep 04, 2024 pm 04:49 PM

これは、HTML でのネストされたテーブルのガイドです。ここでは、テーブル内にテーブルを作成する方法をそれぞれの例とともに説明します。

HTML 左マージン HTML 左マージン Sep 04, 2024 pm 04:48 PM

HTML マージン左のガイド。ここでは、HTML margin-left の概要とその例、およびそのコード実装について説明します。

HTML テーブルのレイアウト HTML テーブルのレイアウト Sep 04, 2024 pm 04:54 PM

HTML テーブル レイアウトのガイド。ここでは、HTML テーブル レイアウトの値と例および出力について詳しく説明します。

HTML入力プレースホルダー HTML入力プレースホルダー Sep 04, 2024 pm 04:54 PM

HTML 入力プレースホルダーのガイド。ここでは、コードと出力とともに HTML 入力プレースホルダーの例について説明します。

HTML 内のテキストの移動 HTML 内のテキストの移動 Sep 04, 2024 pm 04:45 PM

HTML でのテキストの移動に関するガイド。ここでは、概要、マーキー タグが構文でどのように機能するか、および実装例について説明します。

HTML 順序付きリスト HTML 順序付きリスト Sep 04, 2024 pm 04:43 PM

HTML 順序付きリストのガイド。ここでは、HTML 順序付きリストと型の導入とその例についても説明します。

HTML の onclick ボタン HTML の onclick ボタン Sep 04, 2024 pm 04:49 PM

HTML オンクリック ボタンのガイド。ここでは、それらの紹介、動作、例、およびさまざまなイベントでの onclick イベントについてそれぞれ説明します。

See all articles