Rumah  >  Artikel  >  hujung hadapan web  >  Gunakan Kanvas HTML5 untuk mencipta kesan riak air yang akan dicetuskan apabila anda mengklik pada kemahiran tutorial picture_html5

Gunakan Kanvas HTML5 untuk mencipta kesan riak air yang akan dicetuskan apabila anda mengklik pada kemahiran tutorial picture_html5

WBOY
WBOYasal
2016-05-16 15:47:292228semak imbas

Hari ini, kami terus berkongsi contoh kesan yang dilaksanakan dalam JavaScript Artikel ini akan memperkenalkan penggunaan JavaScript untuk mencapai kesan riak air. Kesan gelombang air menggunakan gambar sebagai latar belakang dan akan dicetuskan dengan mengklik mana-mana pada gambar. Kadangkala, kita boleh mencipta penyelesaian yang menarik menggunakan Javascript biasa.

Muat turun kod sumber

Langkah 1. HTML

Seperti sebelum ini, yang pertama ialah kod HTML:

Salin kod
Kod tersebut adalah seperti berikut:

;
< ;kepala>

Kesan titisan air css/main.css " type="text/css" />
;badan>

Kesan titisan air

canvas id="water ">Pelayar yang mematuhi HTML5 diperlukan


🎜>


Langkah 2 . CSS


Ini ialah kod CSS yang digunakan:





Salin kod

Kodnya adalah seperti berikut :

body{background:#eee;margin:0;padding:0}
.example{background:#FFF;width:600px;border:1px #000 pepejal;margin:20px auto;padding:15px;-moz-border-radius: 3px;-webkit-border-radius: 3px}
#air {
lebar:500px; ;
paparan: blok ; margin:0px auto; 🎜>margin:15px; } #switcher img { lebar:160px;
tinggi:120px;


Langkah 3 JS


Berikut ialah kod JavaScript utama:





Salin kod


Kod adalah seperti berikut:

function drop(x, y, damping, shading, refraction, ctx, screenWidth, screenHeight){
this.x = x;
this.y = y;
this.shading = Schattierung;
this.refraction = Brechung;
this.bufferSize = this.x * this.y;
this.damping = Dämpfung;
this.background = ctx.getImageData(0, 0, screenWidth, screenHeight).data;
this.imageData = ctx.getImageData(0, 0, screenWidth, screenHeight);
this.buffer1 = [];
this.buffer2 = [];
for (var i = 0; i < this.bufferSize; i ){
this.buffer1.push(0);
this.buffer2.push(0);
}
this.update = function(){
for (var i = this.x 1, x = 1; i < this.bufferSize - this.x; i , x ){
if ((x < this.x)){
this.buffer2[i] = ((this.buffer1[i - 1] this.buffer1[i 1] this.buffer1[i - this.x] this.buffer1[i this.x]) / 2) - this.buffer2[i];
this.buffer2[i] *= this.damping;
} sonst x = 0;
}
var temp = this.buffer1;
this.buffer1 = this.buffer2;
this.buffer2 = temp;
}
this.draw = function(ctx){
var imageDataArray = this.imageData.data;
for (var i = this.x 1, index = (this.x 1) * 4; i < this.bufferSize - (1 this.x); i , index = 4){
var xOffset = ~~(this.buffer1[i - 1] - this.buffer1[i 1]);
var yOffset = ~~(this.buffer1[i - this.x] - this.buffer1[i this.x]);
var Shade = xOffset * this.shading;
var Textur = Index (xOffset * this.refraction yOffset * this.refraction * this.x) * 4;
imageDataArray[index] = this.background[texture] Shade;
imageDataArray[index 1] = this.background[texture 1] Shade;
imageDataArray[index 2] = 50 this.background[texture 2] Shade;
}
ctx.putImageData(this.imageData, 0, 0);
}
}
var fps = 0;
var watereff = {
// Variablen
timeStep: 20,
Brechungen: 2,
Shading: 3,
Dämpfung: 0,99,
screenWidth: 500,
screenHeight: 400,
pond: null,
textureImg: null,
interval: null,
backgroundURL: 'data_images/underwater1.jpg',
// Initialisierung
init: function() {
var canvas = document.getElementById('water');
if (canvas.getContext){
// fps countrt
fps = 0;
setInterval(function() {
document.getElementById('fps').innerHTML = fps / 2 ' FPS';
fps = 0;
}, 2000);
canvas.onmousedown = function(e) {
var mouse = watereff.getMousePosition(e).sub(new vector2d(canvas.offsetLeft, canvas.offsetTop));
watereff.pond.buffer1[mouse.y * watereff.pond.x mouse.x ] = 200;
}
canvas.onmouseup = function(e) {
canvas.onmousemove = null;
}
canvas.width = this.screenWidth;
canvas.height = this.screenHeight;
this.textureImg = new Image(256, 256);
this.textureImg.src = this.backgroundURL;
canvas.getContext('2d').drawImage(this.textureImg, 0, 0);
this.pond = new drop(
this.screenWidth,
this.screenHeight,
this.damping,
this.shading,
this.refractions,
canvas. getContext('2d'),
this.screenWidth, this.screenHeight
);
if (this.interval != null){
clearInterval(this.interval);
}
this.interval = setInterval(watereff.run, this.timeStep);
}
},
// Bild ändern func
changePicture : function(url){
this.backgroundURL = url;
this.init();
},
// Mausposition abrufen func
getMousePosition : function(e){
if (!e){
var e = window.event;
}
if (e.pageX || e.pageY){
return new vector2d(e.pageX, e.pageY);
} else if (e.clientX || e.clientY){
return new vector2d(e.clientX, e.clientY);
}
},
// Schleifenzeichnung
run : function(){
var ctx = document.getElementById('water').getContext('2d');
watereff.pond.update();
watereff.pond.draw(ctx);
fps ;
}
}
window.onload = function(){
watereff.init();
}

正如你所看到的, verwenden Sie Vector2D und verwenden Sie vector2d.js方法是使用纯数学实现,感兴趣的可以自己实验一下.
Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn