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

不言
リリース: 2018-06-14 09:57:45
オリジナル
3262 人が閲覧しました

この記事では主に雪片が落ちる特殊効果を実現するための 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート