HTML5中的canvas是一個非常強大的元素,能夠讓我們在網頁中實現各式各樣的動態效果。其中經典的一個案例就是原地的魚代碼,極其逼真地模擬了魚兒在水中的游動狀態。以下是這段代碼:
var canvas = document.getElementById('canvas'); canvas.width = window.innerWidth; canvas.height = window.innerHeight; var context = canvas.getContext('2d'); var fishes = []; function Fish(x, y, scale, angle, speed, color) { this.x = x; this.y = y; this.scale = scale; this.angle = angle; this.speed = speed; this.color = color; } Fish.prototype.draw = function() { context.save(); context.translate(this.x, this.y); context.rotate(this.angle); context.scale(this.scale, this.scale); context.fillStyle = this.color; context.beginPath(); context.moveTo(0, 0); context.quadraticCurveTo(30, -15, 60, 0); context.quadraticCurveTo(30, 15, 0, 0); context.closePath(); context.fill(); context.restore(); } Fish.prototype.update = function() { this.x += Math.cos(this.angle) * this.speed; this.y += Math.sin(this.angle) * this.speed; if (this.x >canvas.width + 100) { this.x = -100; } if (this.y >canvas.height + 100) { this.y = -100; } if (this.x< -100) { this.x = canvas.width + 100; } if (this.y< -100) { this.y = canvas.height + 100; } this.angle += (Math.random() - 0.5) / 6; } for (var i = 0; i< 50; i++) { var x = Math.random() * canvas.width; var y = Math.random() * canvas.height; var scale = Math.random() + 0.5; var angle = Math.random() * 2 * Math.PI; var speed = 1 + Math.random() * 2; var color = 'hsl(' + Math.random() * 360 + ',50%,50%)'; var fish = new Fish(x, y, scale, angle, speed, color); fishes.push(fish); } function draw() { context.clearRect(0, 0, canvas.width, canvas.height); for (var i = 0; i< fishes.length; i++) { fishes[i].update(); fishes[i].draw(); } requestAnimationFrame(draw); } draw();
這段代碼中,我們首先創建了一個畫布元素,并設置了它的寬高和2d繪圖上下文。然后我們定義了一個魚類,包含位置、大小、方向、速度和顏色等屬性,并提供了繪制和更新方法。接著我們利用循環創建50條隨機位置、隨機顏色、隨機速度和隨機大小的魚,并將它們存入一個數組中。最后我們使用 requestAnimationFrame() 方法實現了動態的魚群效果。
需要注意的是,這段代碼使用了一些高級的數學計算和2d繪圖操作,以及 requestAnimationFrame() 方法來實現流暢的動畫效果。學習和理解它可以為我們今后的Web開發工作帶來很大的幫助。