鍵盤控制小球移動
眾所周知,我們所看到的動畫其實就是一系列靜態畫面快速切換,讓肉眼因視覺殘像產生了「畫面在活動」的視覺效果。明白了這一點後,在canvas上繪製動畫效果就顯得比較簡單了。我們只需要將某個靜態圖形先清除,然後在另一個位置重新繪製,如此反复,讓靜態圖形按照一定的軌跡進行移動,就可以產生動畫效果了。
下面,我們在canvas上繪製一個實心小球,然後用鍵盤上的方向鍵控制小球的移動,從而產生動態效果。範例程式碼如下:
JavaScript Code複製內容到剪貼簿
-
html>
-
-
-
"UTF-8">
-
html5 canvas繪製可移動的小球入門範例
-
- "moveBall(event)">
-
-
-
style="border: 1px solid red;">
-
您的瀏覽器不支援canvas標籤。
-
-
-
<script><span class="string">"text/javascript"</script>>
-
-
var canvas = document.getElementById("myCanvas"
-
-
//表示圓球的類別
-
function Ball(x, y ,radius, speed){
- this.x = x || 10; //圓球的預設值
- this.y = y || 10; //圓球的預設值
this
- .radius = radius || 10; //圓球的半徑,預設為10 🎜>
.speed = speed || 5;
/圓球的速度, -
//上移動
-
-
thisfunction
(>- function(
this.y -= this
- if(this.y radius){
-
//防止超出上方邊界
this.y =
-
}
};
-
//向右移動
-
- this.moveRight =
- function(>
function-
(>(
this
.x = -
this.
var maxX = canvas.width -
this- 🎜>
if(this. 🎜>
this-
. >
//防止超過右邊界
-
this.x = maxX;
}
-
};
-
-
-
this.moveLeft = function(>function
- (>(
this.x -= this
- if(this. 🎜>this. radius){
-
//防止超出左邊界
-
this.x =
}
}; -
-
- //向下移動
-
this
.moveDown = -
function(>function(>(
this
- .y = this.
var maxY = canvas.height -
- this if(this
.y >
-
//防止超出下邊界
this-
.y = maxY;
- }
};
- }
-
-
//畫小球
-
-
function drawBall(ball){
- if(typeof
- ctx >){
ctx.beginPath();
ctx.arc(ball.x, ball.y, ball.radius, 0, Math.PI * 2, false >
ctx.fill();
-
}
-
}
-
-
-
function clearCanvas(){
-
if(typeof ctx >){
ctx.clearRect(0, 0, 400, 300);
-
}
-
}
-
var-
ball = var Ball(); Ball();
//簡單地偵測目前瀏覽器是否支援Canvas對象,以免在一些不支援html5的瀏覽器中提示語法錯誤 -
if-
(canvas.getContext){
//取得對應的CanvasRenderingContext2D物件(畫筆) -
var-
ctx = canvas.getContext("2d";
drawBall(ball);
}
-
-
-
-
function moveBall(event){
-
switch(event.keyCode){
-
case 37: ball.moveLeft();
-
break-
;
case-
38: //上方向鍵>
ball.moveUp();
break-
;
-
case 39:
//方向鍵約
-
ball.moveRight();
;
-
case-
40: //下方方向鍵
ball.moveDown();
-
break;
default- :
- return;
- }
clearCanvas(); //先清空畫布
-
drawBall(ball); //再繪製最新的小球
-
- }
-
-
請使用支援html5的瀏覽器開啟以下網頁以查看實際效果(使用方向鍵進行移動):
- 使用canvas繪製可移動的小球。
- 小丑笑臉
只需要了解很少的幾個API,然後使用需要的動畫參數,就能製作出這個有趣又能響應你的動作的Web動畫。 - 第一步,畫五官
這個小丑沒有耳朵和眉毛,所以只剩下三官,但它的兩個眼睛我們要分別繪製,所以一共是四個部分。下面先看看程式碼。
- 繪製左眼的代碼
JavaScript Code
複製內容到剪貼簿
-
var leftEye = new Kinetic.Line({ Kinetic.Line({
-
x: 150,
-
points: [0, 200, 50, 190, 100, 200, 50, 210],
- tension: 0.5,
- closed: true,
- stroke: 'white',
- strokeWidth: 10
- });
繪製右眼的代碼
JavaScript Code複製內容到剪貼簿
- var rightEye = new Kinetic.Line({ Kinetic.Line({
-
x: sw - 250,
-
points: [0, 200, 50, 190, 100, 200, 50, 210],
-
tension: 0.5,
-
closed: true,
-
stroke: 'white',
-
strokeWidth: 10
-
});
繪製鼻子的代碼
JavaScript Code複製內容到剪貼簿
-
var nose = new Kinetic.Line({
Kinetic.Line({ - Kinetic.Line({
-
points: [240, 280, sw/2, 300, sw-240,280],
-
tension: 0.5,
closed:
true-
,
stroke:
'white'-
,
-
strokeWidth: 10
});
繪製嘴巴的程式碼
JavaScript Code複製內容到剪貼簿
-
var mouth = new Kinetic.Line({ >
points: [150, 340, sw/2, 380, sw - 150, 340, sw/2, sh], sh],
- tension: 0.5,
- closed: true
- ,
stroke: 'red'
- ,
strokeWidth: 10
- });
-
你會不會覺得很失望,原來就這麼簡單幾行程式碼。沒錯,就是這麼簡單,相信你對自己能成為Web遊戲動畫程式設計師開始有信心了!
簡單講解一下上面的程式碼。 Kinetic就是我們使用的js工具包。在頁面的頭部,我們需要這樣引用它:
JavaScript Code複製內容到剪貼簿
var
mouth = - new Kinetic.Line({ >
points: [150, 340, sw/2, 380, sw - 150, 340, sw/2, sh], sh],
tension: 0.5,
closed: - true
, -
stroke: -
'red',
strokeWidth: 10 -
});
-
其它幾個分別是幾個關鍵點,線條彈性,顏色,寬度等。這些都很容易理解。
第二步,讓圖片動起來-
這個動畫之所以能吸引人,是因為它能回應你的滑鼠動作,和使用者有互動,這是一個成功的動畫最關鍵的地方。如果你仔細觀察,這個小丑五官的變化只是形狀的變化,眼睛變大,嘴巴變大,鼻子變大,但特別的是這個變化不是瞬間變化,而是有過渡性的,這裡面有一些算法,這就是最讓人煩惱的地方。幸運的是,這演算法技術都非常的成熟,不需要我們來思考,在這些動畫引擎庫裡都把這些技術封裝成了非常簡單方便的介面。下面我們來看看如何讓動起來。
左眼的動畫
JavaScript Code複製內容到剪貼簿
var leftEyeTween = new
Kinetic.Tween({ >
- node: leftEye,
duration: 1,
easing: Kinetic.Easings.ElasticEaseOut,
- y: -100,
- points: [0, 200, 50, 150, 100, 200, 50, 200]
}); -
-
右眼的動畫
-
JavaScript Code
- 複製內容到剪貼簿
-
var rightEyeTween = new Kinetic.Tween({
node: rightEye,
-
duration: 1,
-
easing: Kinetic.Easings.ElasticEaseOut,
-
y: -100,
-
points: [0, 200, 50, 150, 100, 200, 50, 200]
-
});
-
鼻子的動畫
JavaScript Code
複製內容到剪貼簿
var
- noseTween = new Kinetic.Tween({ Kinetic.Tween({
node: nose,
- duration: 1,
- easing: Kinetic.Easings.ElasticEaseOut,
- y: -100,
- points: [220, 280, sw/2, 200, sw-220,280]
- });
-
嘴巴的動畫
JavaScript Code
複製內容到剪貼簿
var
mouthTween = -
new Kinetic.Tween({
node: mouth,
duration: 1,
-
easing: Kinetic.Easings.ElasticEaseOut,
- points: [100, 250, sw/2, 250, sw - 100, 250, sw/2, sh-20] 100, 250, sw/2, sh-20]
}); -
-
這些程式碼非常的簡單,而且變數名能自釋其意。稍微有點經驗的程式設計師想看懂這些程式碼應該不難。基本每段程式碼都是讓你提供一些點,指定動畫動作的衰退模式和持續時間。
完整的動畫程式碼-
JavaScript Code
複製內容到剪貼簿
-
-
-
-
-
-
-
"container">
-
<script><span class="string">"/js/lib/kinetic-v5.0.1.min.js"</script>>
「延遲」>
-
var sw = 578;
-
var sh = 400;
-
var stage = 新 新
- (
容器: '容器',
-
寬度:578,
-
高度:400
-
});
-
var 層 = 新
- 新
y: -30 -
}); -
-
var leftEye = 新
- 新
-
x:150,
-
積分:[0, 200, 50, 190, 100, 200, 50, 210],
-
張力:0.5,
關閉:
true-
,
中風:
'白色'-
,
-
筆畫寬度:10
-
});
-
var rightEye =
新-
x: sw - 250, -
積分:[0, 200, 50, 190, 100, 200, 50, 210], -
張力:0.5, -
關閉: true
, -
中風: '白色'
, -
筆畫寬度:10 -
});
-
-
var 鼻子 = 新
新- 積分:[240, 280, sw/2, 300, sw-240,280],
-
張力:0.5,
-
關閉: true,
-
中風: '白色',
-
筆畫寬度:10
-
});
-
-
var 嘴 = 新
- 新
- 新
-
分:[150, 340, sw/2, 380, sw - 150, 340, sw/2,10],
張力:0.5,
關閉: -
true,
中風: - '紅色'
, -
筆畫寬度:10 -
}); -
-
layer.add(leftEye) -
.add(rightEye) -
.add(鼻子) -
.add(口); -
-
stage.add(layer); -
- //補間
-
var
leftEyeTween = - 新
節點:左眼, -
持續時間: 1, -
緩動:Kinetic.Easings.ElasticEaseOut, -
y: -100, -
積分:[0, 200, 50, 150, 100, 200, 50, 200] -
});
-
-
var rightEyeTween = 節點:右眼,
- 持續時間: 1,
- 緩動:Kinetic.Easings.ElasticEaseOut,
- y: -100,
- 積分:[0, 200, 50, 150, 100, 200, 50, 200]
- });
-
- var
- noseTween = 新 節點:鼻子,
持續時間: 1,
- 緩動:Kinetic.Easings.ElasticEaseOut,
- y: -100,
- 積分:[220, 280, sw/2, 200, sw-220,280]
- });
-
- var
- mouthTween = 新
-
節點:嘴,
持續時間: 1,
緩動:Kinetic.Easings.ElasticEaseOut,
- 分:[100, 250, sw/2, 250, sw - 100, 250, sw/2,sh-20] 100,
}); -
-
stage.getContainer().addEventListener(- '滑鼠懸停'
, - 函數
, -
函數 >
-
leftEyeTween.play();
rightEyeTween.play();
noseTween.play();
-
mouthTween.play();
-
});
-
- stage.getContainer().addEventListener(
'mouseout'- ,
函數-
leftEyeTween.reverse();
-
rightEyeTween.reverse();
noseTween.reverse();
mouthTween.reverse();
-
});
-
-
腳本>
-