これはクールな HTML5 キャンバス アニメーションです。実際の生活に咲いている花火の特殊効果をシミュレートします。その効果は非常にリアルですが、結局のところ、ガール フレンドを連れて行っても、それはコンピューターのシミュレーションです。それは、まだ効果が少し悪いです。この HTML5 Canvas アニメーションの優れた点の 1 つは、花火をたくさん打ち上げても、Chrome 上では基本的に遅延が発生しないことです。
この HTML5 花火特殊効果を実装するプロセスとコードを簡単に分析してみましょう。これは主に HTML コード、CSS コード、JavaScript コードで構成されています。もちろん、最も重要なのは JavaScript コードです。
HTML コード:
XML/HTML コードコンテンツをクリップボードにコピー
- <div id=”gui”>div>
-
<div id=”canvas-container”> <div id=”mountains2″>div>
-
<div id=”mountains1″ >div><div id=”スカイライン”>div> div>
HTML の構造は非常に単純です。つまり、Canvas コンテナーが構築され、JS を使用してこのコンテナー内に Canvas オブジェクトを生成します。最終的な JS コードを見ればわかります。
CSSコード:
CSS コードコンテンツをクリップボードにコピーします
- #canvas-container { background: #000 url(bg.jpg); 高さ: 400px; 左: 50%; マージン: -200px 0 0 -300px; 位置: 絶対; トップ: 50%; 幅: 600px; z-index: 2;
-
} キャンバス { カーソル: クロスヘア; 表示: ブロック; 位置: 相対; z-index: 3;
-
} canvas:active { カーソル: クロスヘア;
-
} #skyline { 背景: url (skyline.png) 繰り返し-x 50% 0; 下下: 0; 高さ: 135px; 左: 0; 位置: 絶対; 幅: 100%; z-index: 1;
-
} #mountains1 { 背景: url (mountains1.png) 繰り返し-x 40% 0; 下下: 0; 高さ: 200px; 左: 0; 位置: 絶対; 幅: 100%; z-index: 1;
-
} #mountains2 { 背景: url (mountains2.png) 繰り返し-x 30% 0; 下下: 0; 高さ: 250px; 左: 0; 位置: 絶対; 幅: 100%; z-index: 1;
-
} #gui { 右右: 0; 位置: 固定; トップ: 0; z-index: 3;
- }
CSS コードは特別なものではなく、主に背景色と境界線を定義します。
次は最も重要な Javascript コードです。
JavaScript コード:
JavaScript コードコンテンツをクリップボードにコピーします
- self.init = 関数(){
- self.dt = 0;
- self.oldTime = Date.now();
-
self.canvas = document.createElement('canvas');
-
self.canvasContainer = $('#canvas-container'); var canvasContainerDisabled = document.getElementById('canvas-container');
-
self.canvas.onselectstart = function() { return false;
- };
-
- self.canvas.width = self.cw = 600;
- self.canvas.height = self.ch = 400;
-
- self.particles = [];
- self.partCount = 30;
- self.fireworks = [];
- self.mx = self.cw/2;
- self.my = self.ch/2;
- self.currentHue = 170;
- self.partSpeed = 5;
- self.partSpeedVariance = 10;
- self.partWind = 50;
- self.partFriction = 5;
- self.partGravity = 1;
- self.hueMin = 150;
- self.hueMax = 200;
- self.fworkSpeed = 2;
- self.fworkAccel = 4;
- self.hueVariance = 30;
- self.flickerDensity = 20;
-
self.showShockwave = false;
-
self.showTarget = true;
- self.clearAlpha = 25;
-
- self.canvasContainer.append(self.canvas);
-
self.ctx = self.canvas.getContext('2d');
-
self.ctx.lineCap = 'round';
-
self.ctx.lineJoin = 'round';
- self.lineWidth = 1;
- self.bindEvents();
- self.canvasLoop();
-
-
self.canvas.onselectstart = function() { return false;
- };
-
- };
この JS コードは、主に Canvas コンテナー内に Canvas オブジェクトを構築し、Canvas オブジェクトの外観とアニメーションのプロパティを初期化します。
JavaScript コードコンテンツをクリップボードにコピーします
- var Particle = function(x, y, hue){ this.x = x; これ.y = y; this.coordLast = [
- {x: x, y: y}、
- {x: x, y: y}、
- {x: x, y: y}
-
]; this.angle = rand(0, 360); this.speed = rand(((self.partSpeed - self.partSpeedVariance) this.friction = 1 - self.partFriction/100; this.gravity = self.partGravity/2; this.hue = rand(hue-self.hueVariance, hue self.hueVariance); this.brightness = rand(50, 80); この.alpha = rand(40,100)/100; this.decay = rand(10, 50)/1000; this.wind = (rand(0, self.partWind) - (self.partWind/2))/25; この.lineWidth = self.lineWidth;
- };
-
-
Particle.prototype.update = 関数(インデックス){ var ラジアン = this.angle * Math.PI / 180; var vx = Math.cos(ラジアン) * this.speed; var vy = Math.sin(ラジアン) * this.speed this 。重力; this.speed *= this.friction; this.coordLast[2].x = this.coordLast[1].x; this.coordLast[2].y = this.coordLast[1].y; this.coordLast[1].x = this.coordLast[0].x; this.coordLast[1].y = this.coordLast[0].y; this.coordLast[0].x = this.x; this.coordLast[0].y = this.y; this.x = vx * self.dt; this.y = vy * self.dt; this.angle = this.wind; this.alpha -= this.decay; if(!hitTest(0,0,self.cw,self.ch,this.x-this.radius, this.y-this.radius, this .radius*2, this.radius*2) || this.alpha < ){
- self.particles.splice(index, 1);
- }
- };
-
- Particle.prototype.draw = function(){ var coordRand = (rand(1,3) -1);
- self.ctx.beginPath();
- self.ctx.moveTo(Math.round(this.coordLast[coordRand].x), Math.round(this.coordLast[coordRand].y));
- self.ctx.lineTo(Math.round(this.x), Math.round(this .y));
- self.ctx.closePath();
- self.ctx.ストロークスタイル = 'hsla(' this.hue ' , 100%, ' これ.明るさ '%, ' これ.alpha ')';
- self.ctx.ストローク(); if(self.flickerDensity > 0){ var inverseDensity = 50 - self.flickerDensity; if(rand(0, inverseDensity) === inverseDensity){
- self.ctx.beginPath();
-
self.ctx.arc(Math.round(this.x), Math.round(this .y), rand(this.lineWidth,this.lineWidth 3)/2, 0, Math.PI*2, false) self.ctx.closePath(); var randAlpha = rand(50,100)/100;
-
self.ctx.fillStyle = 'hsla(' this.hue ' , 100%, ' この.明るさ '%, ' randAlpha ' )';
- self.ctx.fill();
- }
- }
- };
このセクションの JS コードの機能は、フラワー爆発後の小さな粒子の作成を実行することであり、描画方法からわかるように、任意の随伴点が構築され、この範囲の随伴点にカーボン粒子が散在する可能性があります。
JavaScript コード
复制コンテンツ到剪贴板
- var Firework = function(startX, startY, targetX, targetY){ this.x = startX; これ.y = startY; これ.startX = startX; これ.startY = startY; this.hitX = false; this.hitY = false; this.coordLast = [
- {x: startX, y: startY},
- {x: startX, y: startY},
- {x: startX, y: startY}
-
]; この.targetX = targetX; この.targetY = targetY; this.speed = self.fworkSpeed; this.angle = Math.atan2(targetY - startY, targetX - startX); this.shockwaveAngle = Math.atan2(targetY - startY, targetX - startX) (90*(Math.PI/180)); this.acceleration = self.fworkAccel/100; this.hue = self.currentHue; this.brightness = rand(50, 80); この.alpha = rand(50,100)/100; この.lineWidth = self.lineWidth; この.targetRadius = 1;
- };
-
-
Firework.prototype.update = 関数(インデックス){
-
self.ctx.lineWidth = this.lineWidth;
-
-
vx = Math.cos(this.angle) * this.speed,
-
vy = Math.sin(this.angle) * this.speed; this.speed *= 1 this.acceleration; this.coordLast[2].x = this.coordLast[1].x; this.coordLast[2].y = this.coordLast[1].y; this.coordLast[1].x = this.coordLast[0].x; this.coordLast[1].y = this.coordLast[0].y; this.coordLast[0].x = this.x; this.coordLast[0].y = this.y; if(self.showTarget){ if(this.targetRadius < 8){ this.targetRadius = .25 * self.dt;
- } else { this.targetRadius = 1 * self.dt;
- }
- } if(this.startX >= this.targetX){ if(this.x vx <= this.targetX){ this.x = this.targetX; this.hitX = true;
- } else { this.x = vx * self.dt;
- }
- } else { if(this.x vx >= これ.targetX){ これ.x = これ .targetX; this.hitX = true;
-
} else { this.x = vx * self.dt;
- }
-
} if(this.startY >= this.targetY){ if(this.y vy <= this.targetY){ this.y = this.targetY; this.hitY = true;
- } else { this.y = vy * self.dt;
- }
- } else { if(this.y vy >= これ.targetY){ これ.y = これ .targetY; this.hitY = true;
-
} else { this.y = vy * self.dt;
- }
-
} if(this.hitX && this.hitY){ var randExplosion = rand(0, 9);
-
self.createParticles(this.targetX, this.targetY, this.hue);
- self.fireworks.splice(index, 1);
- }
- };
-
-
Firework.prototype.draw = 関数(){
-
self.ctx.lineWidth = this.lineWidth; var coordRand = (rand(1,3)-1);
- self.ctx.beginPath();
-
self.ctx.moveTo(Math.round(this.coordLast[coordRand].x), Math.round(this.coordLast[coordRand].y));
-
self.ctx.lineTo(Math.round(this.x), Math.round(this .y));
- self.ctx.closePath();
-
self.ctx.ストロークスタイル = 'hsla(' this.hue ' , 100%, ' これ.明るさ '%, ' これ.alpha ')';
-
self.ctx.ストローク(); if(self.showTarget){
- self.ctx.save();
- self.ctx.beginPath();
-
self.ctx.arc(Math.round(this.targetX), Math.round(this .targetY),this.targetRadius, 0, Math.PI*2, false)
- self.ctx.closePath();
- self.ctx.lineWidth = 1;
- self.ctx.ストローク();
- self.ctx.restore();
-
} if(self.showShockwave){
- self.ctx.save();
-
self.ctx.translate(Math.round(this.x), Math.round(this .y));
-
self.ctx.rotate(this.shockwaveAngle);
- self.ctx.beginPath();
-
self.ctx.arc(0, 0, 1*(this.speed/5), 0, Math.PI, true);
-
self.ctx.drawingStyle = 'hsla(' this.hue ' , 100%, ' この.明るさ '%,' rand(25, 60)/100 ')';
-
self.ctx.lineWidth = this.lineWidth;
- self.ctx.ストローク();
- self.ctx.restore();
- }
- };
このセグメントの JS コードは、フラワー サンプルを作成するものであり、マウス ポイントが画布内のある時点で、フラワー送信の目的がそのポイントにあることが、draw メソッドからもわかります。
この規約 HTML5 Canvas の効果の核心コードはこのようなものであり、大家に届くことを望んでおり、継続的に注目している脚本家、私たちはより多くの優れた文章を共有するよう努めています。