ホームページ ウェブフロントエンド jsチュートリアル キャンバスに黒い背景で赤い花火を作る方法

キャンバスに黒い背景で赤い花火を作る方法

Mar 13, 2018 pm 04:04 PM
canvas 背景

今回はキャンバスを使って黒背景の赤い花火を作る方法を紹介します。 キャンバスを使って黒背景の赤い花火を作るときの注意点は何ですか。実際の事例を見てみましょう。

キャンバスに黒い背景で赤い花火を作る方法

html

<canvas id="canvas"></canvas>
ログイン後にコピー

css

body {    background: #000;    margin: 0;
}canvas {    cursor: crosshair;    display: block;}
ログイン後にコピー

js

// when animating on canvas, it is best to use requestAnimationFrame instead of setTimeout or setInterval// not supported in all browsers though and sometimes needs a prefix, so we need a shimwindow.requestAnimFrame = (function () {    return window.requestAnimationFrame ||        window.webkitRequestAnimationFrame ||        window.mozRequestAnimationFrame ||        function (callback) {            window.setTimeout(callback, 1000 / 60);
        };
})();// now we will setup our basic variables for the demovar canvas = document.getElementById(&#39;canvas&#39;),
    ctx = canvas.getContext(&#39;2d&#39;),    // full screen dimensions
    cw = window.innerWidth,
    ch = window.innerHeight,    // firework collection
    fireworks = [],    // particle collection
    particles = [],    // starting hue
    hue = 120,    // when launching fireworks with a click, too many get launched at once without a limiter, one launch per 5 loop ticks
    limiterTotal = 5,
    limiterTick = 0,    // this will time the auto launches of fireworks, one launch per 80 loop ticks
    timerTotal = 80,
    timerTick = 0,
    mousedown = false,    // mouse x coordinate,
    mx,    // mouse y coordinate
    my;// set canvas dimensionscanvas.width = cw;
canvas.height = ch;// now we are going to setup our function placeholders for the entire demo// get a random number within a rangefunction random(min, max) {    return Math.random() * (max - min) + min;
}// calculate the distance between two pointsfunction calculateDistance(p1x, p1y, p2x, p2y) {    var xDistance = p1x - p2x,
        yDistance = p1y - p2y;    return Math.sqrt(Math.pow(xDistance, 2) + Math.pow(yDistance, 2));
}// create fireworkfunction Firework(sx, sy, tx, ty) {    // actual coordinates
    this.x = sx;    this.y = sy;    // starting coordinates
    this.sx = sx;    this.sy = sy;    // target coordinates
    this.tx = tx;    this.ty = ty;    // distance from starting point to target
    this.distanceToTarget = calculateDistance(sx, sy, tx, ty);    this.distanceTraveled = 0;    // track the past coordinates of each firework to create a trail effect, increase the coordinate count to create more prominent trails
    this.coordinates = [];    this.coordinateCount = 3;    // populate initial coordinate collection with the current coordinates
    while (this.coordinateCount--) {        this.coordinates.push([this.x, this.y]);
    }    this.angle = Math.atan2(ty - sy, tx - sx);    this.speed = 2;    this.acceleration = 1.05;    this.brightness = random(50, 70);    // circle target indicator radius
    this.targetRadius = 1;
}// update fireworkFirework.prototype.update = function (index) {    // remove last item in coordinates array
    this.coordinates.pop();    // add current coordinates to the start of the array
    this.coordinates.unshift([this.x, this.y]);    // cycle the circle target indicator radius
    if (this.targetRadius < 8) {        this.targetRadius += 0.3;
    } else {        this.targetRadius = 1;
    }    // speed up the firework
    this.speed *= this.acceleration;    // get the current velocities based on angle and speed
    var vx = Math.cos(this.angle) * this.speed,
        vy = Math.sin(this.angle) * this.speed;    // how far will the firework have traveled with velocities applied?
    this.distanceTraveled = calculateDistance(this.sx, this.sy, this.x + vx, this.y + vy);    // if the distance traveled, including velocities, is greater than the initial distance to the target, then the target has been reached
    if (this.distanceTraveled >= this.distanceToTarget) {
        createParticles(this.tx, this.ty);        // remove the firework, use the index passed into the update function to determine which to remove
        fireworks.splice(index, 1);
    } else {        // target not reached, keep traveling
        this.x += vx;        this.y += vy;
    }
}// draw fireworkFirework.prototype.draw = function () {
    ctx.beginPath();    // move to the last tracked coordinate in the set, then draw a line to the current x and y
    ctx.moveTo(this.coordinates[this.coordinates.length - 1][0], this.coordinates[this.coordinates.length - 1][        1
    ]);
    ctx.lineTo(this.x, this.y);
    ctx.strokeStyle = &#39;hsl(&#39; + hue + &#39;, 100%, &#39; + this.brightness + &#39;%)&#39;;
    ctx.stroke();
    ctx.beginPath();    // draw the target for this firework with a pulsing circle
    ctx.arc(this.tx, this.ty, this.targetRadius, 0, Math.PI * 2);
    ctx.stroke();
}// create particlefunction Particle(x, y) {    this.x = x;    this.y = y;    // track the past coordinates of each particle to create a trail effect, increase the coordinate count to create more prominent trails
    this.coordinates = [];    this.coordinateCount = 5;    while (this.coordinateCount--) {        this.coordinates.push([this.x, this.y]);
    }    // set a random angle in all possible directions, in radians
    this.angle = random(0, Math.PI * 2);    this.speed = random(1, 10);    // friction will slow the particle down
    this.friction = 0.95;    // gravity will be applied and pull the particle down
    this.gravity = 1;    // set the hue to a random number +-20 of the overall hue variable
    this.hue = random(hue - 20, hue + 20);    this.brightness = random(50, 80);    this.alpha = 1;    // set how fast the particle fades out
    this.decay = random(0.015, 0.03);
}// update particleParticle.prototype.update = function (index) {    // remove last item in coordinates array
    this.coordinates.pop();    // add current coordinates to the start of the array
    this.coordinates.unshift([this.x, this.y]);    // slow down the particle
    this.speed *= this.friction;    // apply velocity
    this.x += Math.cos(this.angle) * this.speed;    this.y += Math.sin(this.angle) * this.speed + this.gravity;    // fade out the particle
    this.alpha -= this.decay;    // remove the particle once the alpha is low enough, based on the passed in index
    if (this.alpha <= this.decay) {
        particles.splice(index, 1);
    }
}// draw particleParticle.prototype.draw = function () {
    ctx.beginPath();    // move to the last tracked coordinates in the set, then draw a line to the current x and y
    ctx.moveTo(this.coordinates[this.coordinates.length - 1][0], this.coordinates[this.coordinates.length - 1][        1
    ]);
    ctx.lineTo(this.x, this.y);
    ctx.strokeStyle = &#39;hsla(&#39; + this.hue + &#39;, 100%, &#39; + this.brightness + &#39;%, &#39; + this.alpha + &#39;)&#39;;
    ctx.stroke();
}// create particle group/explosionfunction createParticles(x, y) {    // increase the particle count for a bigger explosion, beware of the canvas performance hit with the increased particles though
    var particleCount = 30;    while (particleCount--) {
        particles.push(new Particle(x, y));
    }
}// main demo loopfunction loop() {    // this function will run endlessly with requestAnimationFrame
    requestAnimFrame(loop);    // increase the hue to get different colored fireworks over time
    hue += 0.5;    // normally, clearRect() would be used to clear the canvas
    // we want to create a trailing effect though
    // setting the composite operation to destination-out will allow us to clear the canvas at a specific opacity, rather than wiping it entirely
    ctx.globalCompositeOperation = &#39;destination-out&#39;;    // decrease the alpha property to create more prominent trails
    ctx.fillStyle = &#39;rgba(0, 0, 0, 0.5)&#39;;
    ctx.fillRect(0, 0, cw, ch);    // change the composite operation back to our main mode
    // lighter creates bright highlight points as the fireworks and particles overlap each other
    ctx.globalCompositeOperation = &#39;lighter&#39;;    var text = "HAPPY NEW YEAR !";
    ctx.font = "50px sans-serif";    var textData = ctx.measureText(text);
    ctx.fillStyle = "rgba(" + parseInt(random(0, 255)) + "," + parseInt(random(0, 255)) + "," + parseInt(random(0,        255)) + ",0.3)";
    ctx.fillText(text, cw / 2 - textData.width / 2, ch / 2);    // loop over each firework, draw it, update it
    var i = fireworks.length;    while (i--) {
        fireworks[i].draw();
        fireworks[i].update(i);
    }    // loop over each particle, draw it, update it
    var i = particles.length;    while (i--) {
        particles[i].draw();
        particles[i].update(i);
    }    // launch fireworks automatically to random coordinates, when the mouse isn&#39;t down
    if (timerTick >= timerTotal) {        if (!mousedown) {            // start the firework at the bottom middle of the screen, then set the random target coordinates, the random y coordinates will be set within the range of the top half of the screen
            for (var h = 0; h < 50; h++) {
                fireworks.push(new Firework(cw / 2, ch / 2, random(0, cw), random(0, ch)));
            }
            timerTick = 0;
        }
    } else {
        timerTick++;
    }    // limit the rate at which fireworks get launched when mouse is down
    if (limiterTick >= limiterTotal) {        if (mousedown) {            // start the firework at the bottom middle of the screen, then set the current mouse coordinates as the target
            fireworks.push(new Firework(cw / 2, ch / 2, mx, my));
            limiterTick = 0;
        }
    } else {
        limiterTick++;
    }
}// mouse event bindings// update the mouse coordinates on mousemovecanvas.addEventListener(&#39;mousemove&#39;, function (e) {
    mx = e.pageX - canvas.offsetLeft;
    my = e.pageY - canvas.offsetTop;
});// toggle mousedown state and prevent canvas from being selectedcanvas.addEventListener(&#39;mousedown&#39;, function (e) {
    e.preventDefault();
    mousedown = true;
});
canvas.addEventListener(&#39;mouseup&#39;, function (e) {
    e.preventDefault();
    mousedown = false;
});// once the window loads, we are ready for some fireworks!window.onload = loop;
ログイン後にコピー

この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い内容については、PHP 中国語 Web サイトの他の関連記事に注目してください。

推奨読書:

JS の async/await

React.js での CSS の使用法

以上がキャンバスに黒い背景で赤い花火を作る方法の詳細内容です。詳細については、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)

Win11 新バージョンの描画: ワンクリックで背景を削除し、切り抜き機能を実現 Win11 新バージョンの描画: ワンクリックで背景を削除し、切り抜き機能を実現 Sep 15, 2023 pm 10:53 PM

Microsoft は、Canary チャネルと Dev チャネルの WindowsInsider プロジェクト メンバーを招待して、新しいペイント アプリケーションをテストして体験してもらいます (最新バージョン番号は 11.2306.30.0)。今回のバージョンアップで最も注目すべき新機能は、ワンクリック切り抜き機能で、ユーザーが一度クリックするだけで自動的に背景を除去して写真本体を強調表示するため、その後の操作が容易になります。手順全体は非常に簡単です。ユーザーは新しいレイアウト アプリケーションに画像をインポートし、ツールバーの [背景の削除] ボタンをクリックして画像の背景を削除します。また、四角形を使用して削除する領域を選択することもできます。背景。

Win11の下部のステータスバーが黒スタイルに変更されました Win11の下部のステータスバーが黒スタイルに変更されました Dec 31, 2023 pm 08:11 PM

win11 のデフォルトの下部タスクバーは水色で、より美しいですが、一部の友人は、win11 の下部ステータス バーが突然黒くなったことを発見しました。これは、テーマまたは背景色が変更されたためである可能性があります。元に戻してください。 win11 の下部にあるステータス バーが黒くなります。 1. まず、下部のスタート メニューをクリックして「設定」を開きます。 2. 次に、左側の列に「個人用設定」を入力します。 3. 次に、「カラー」設定を開きます。 4. 入力後、「透明効果」をオフにします (オンにすると、デスクトップが黒になり、ステータス バーも黒になります) 5. 壁紙が黒でない場合は、選択モードを「明るい色」に変更します。 。 できる。 6. 他の色が気に入った場合は、テーマカラーから自由に選択できます。

Meitu Xiuxiuで写真の背景色を変更する方法 Meitu Xiuxiuで写真の背景色を変更する方法 Apr 08, 2024 pm 03:56 PM

1. Meitu Xiu Xiu ソフトウェアを開き、[画像美化] を選択し、アルバムから写真をインポートします。 2. 下部ツールバーの[カット]をクリックし、[背景置換]機能を選択します。 3. [背景] オプションで、単色ボックスから希望の背景色を選択するか、カスタム画像をアップロードします。 4. 選択内容を確認後、[保存]をクリックすると背景色の変更が完了します。

すべてのPPTの背景を置き換える方法 すべてのPPTの背景を置き換える方法 Mar 25, 2024 pm 04:25 PM

PPT の背景の置換は、プレゼンテーションの視覚スタイルを迅速に統一できる重要な操作です。スライド マスターを変更するか、背景の書式設定機能を使用すると、プレゼンテーション全体の背景をすばやく置き換えることができます。さらに、一部の PPT バージョンでは、すべてのスライドの背景を簡単に置き換えることができる一括置換機能も提供しています。背景を置き換えるときは、プレゼンテーションのテーマに合った背景を選択することに注意し、背景の鮮明さと解像度が要件を満たしていることを確認する必要があります。

キャンバス フレームワークを学び、一般的に使用されるキャンバス フレームワークについて詳しく説明します キャンバス フレームワークを学び、一般的に使用されるキャンバス フレームワークについて詳しく説明します Jan 17, 2024 am 11:03 AM

Canvas フレームワークを探索する: 一般的に使用される Canvas フレームワークを理解するには、特定のコード例が必要です。 はじめに: Canvas は HTML5 で提供される描画 API であり、これを通じて豊富なグラフィックスやアニメーション効果を実現できます。描画の効率と利便性を向上させるために、多くの開発者がさまざまな Canvas フレームワークを開発しました。この記事では、一般的に使用される Canvas フレームワークをいくつか紹介し、読者がこれらのフレームワークの使用方法をより深く理解できるように、具体的なコード例を示します。 1.EaselJSフレームワークEa

uniapp は、キャンバスを使用してチャートやアニメーション効果を描画する方法を実装します。 uniapp は、キャンバスを使用してチャートやアニメーション効果を描画する方法を実装します。 Oct 18, 2023 am 10:42 AM

キャンバスを使用して uniapp でチャートやアニメーション効果を描画する方法には、特定のコード例が必要です。 1. はじめに モバイル デバイスの普及に伴い、モバイル端末上でさまざまなチャートやアニメーション効果を表示する必要があるアプリケーションがますます増えています。 uniapp は、Vue.js に基づくクロスプラットフォーム開発フレームワークとして、キャンバスを使用してチャートやアニメーション効果を描画する機能を提供します。この記事では、uniapp がキャンバスを使用してチャートやアニメーション効果を実現する方法を紹介し、具体的なコード例を示します。 2.キャンバス

Go言語の誕生背景と本来の意図 Go言語の誕生背景と本来の意図 Apr 04, 2024 am 08:48 AM

Go 言語は、C++ の複雑さと同時実行サポートの不十分さの問題を解決するために Google で生まれました。その本来の目的は、プログラマーの生産性を向上させ、信頼性が高くスケーラブルなシステムを構築し、コードの移植と共有を促進するために、シンプルで学習しやすく効率的な同時実行性、メモリセーフなクロスプラットフォーム言語を作成することです。

html2canvas にはどのようなバージョンがありますか? html2canvas にはどのようなバージョンがありますか? Aug 22, 2023 pm 05:58 PM

html2canvas のバージョンには、html2canvas v0.x、html2canvas v1.x などが含まれます。詳細な紹介: 1. html2canvas v0.x (html2canvas の初期バージョン) 最新の安定バージョンは v0.5.0-alpha1 です。これは、多くのプロジェクトで広く使用され、検証されている成熟したバージョンです。2. html2canvas v1.x、これは html2canvas の新しいバージョンです。

See all articles