首頁 > web前端 > H5教程 > 主體

利用HTML5 Canvas製作鍵盤及滑鼠動畫的實例分享_html5教學技巧

WBOY
發布: 2016-05-16 15:45:44
原創
2312 人瀏覽過

鍵盤控制小球移動

眾所周知,我們所看到的動畫其實就是一系列靜態畫面快速切換,讓肉眼因視覺殘像產生了「畫面在活動」的視覺效果。明白了這一點後,在canvas上繪製動畫效果就顯得比較簡單了。我們只需要將某個靜態圖形先清除,然後在另一個位置重新繪製,如此反复,讓靜態圖形按照一定的軌跡進行移動,就可以產生動畫效果了。

下面,我們在canvas上繪製一個實心小球,然後用鍵盤上的方向鍵控制小球的移動,從而產生動態效果。範例程式碼如下:

JavaScript Code複製內容到剪貼簿
  1. html>   
  2.   
  3.   
  4. "UTF-8">   
  5. html5 canvas繪製可移動的小球入門範例   
  6.   
  7. "moveBall(event)">   
  8.   
  9.   
  10. "myCanvas" width="400px""400px" style="border: 1px solid red;">   
  11. 您的瀏覽器不支援canvas標籤。  
  12.   
  13.   
  14. <script><span class="string">"text/javascript"</script>>   
  15. //取得Canvas物件(畫布)   
  16. var canvas = document.getElementById("myCanvas"
  17.   
  18. //表示圓球的類別   
  19. function Ball(x, y ,radius, speed){   
  20.     this.x = x || 10;   //圓球的預設值     
  21. this.y = y || 10;   //圓球的預設值     this
  22. .radius = radius || 10; //圓球的半徑,預設為10 🎜>     this.speed = speed || 5;    
  23. /圓球的速度,
  24.             //上移動
  25.   
  26.     
  27. this.moveUp = function
  28. (>
  29. function(         this.y -= this
  30.         if(this.y radius){   
  31.             //防止超出上方邊界                this.y = 
  32.         }        };   
  33.             //向右移動   
  34.     
  35. this.moveRight = 
  36. function(>
  37. function
  38. (>(         this
  39. .x  = 
  40. this.         var maxX = canvas.width - 
  41. this
  42. 🎜>         if(this. 🎜>
  43. this
  44. . >             //防止超過右邊界   
  45.             
  46. this.x = maxX;           }  
  47.     };   
  48.        
  49.     //向左移動   
  50.     this.moveLeft = function(>function
  51. (>(         this.x -= this
  52.         if(this. 🎜>this. radius){   
  53.             
  54. //防止超出左邊界   
  55.             
  56. this.x =          }   
  57.     };   
  58.        
  59.     
  60. //向下移動
  61.   
  62.     this
  63. .moveDown = 
  64. function(>function(>(         this
  65. .y  = this.         var maxY = canvas.height - 
  66. this        if(this
  67. .y >
  68.             //防止超出下邊界                
  69. this
  70. .y = maxY;    .y = maxY;   
  71.         }        };   
  72. }   
  73.   
  74. //畫小球
  75.   
  76. function drawBall(ball){   
  77.     if(typeof
  78.  ctx >){            ctx.beginPath();            ctx.arc(ball.x, ball.y, ball.radius, 0, Math.PI * 2, false >         ctx.fill();   
  79.     }   
  80. }  
  81.   
  82. //清空canvas畫布   
  83. function clearCanvas(){   
  84.     if(typeof ctx >){            ctx.clearRect(0, 0, 400, 300);         
  85.     }   
  86. }   
  87.   
  88. var
  89.  ball = var Ball();    Ball();  
  90. //簡單地偵測目前瀏覽器是否支援Canvas對象,以免在一些不支援html5的瀏覽器中提示語法錯誤
  91.   
  92. if
  93. (canvas.getContext){          
  94. //取得對應的CanvasRenderingContext2D物件(畫筆)
  95.        
  96. var
  97.  ctx = canvas.getContext("2d";     drawBall(ball);   
  98. }  
  99.   
  100. //onkeydown事件的回呼處理函數   
  101. //依照使用者的按鍵控制小球的移動   
  102. function moveBall(event){   
  103.     switch(event.keyCode){   
  104.         case 37:    //左方向鍵>             ball.moveLeft();   
  105.             
  106. break
  107. ;            
  108. case
  109.  38:    //上方向鍵>             ball.moveUp();                
  110. break
  111. ;   
  112.         case 39:    
  113. //方向鍵約
  114.             ball.moveRight();                break;   
  115.         
  116. case
  117.  40:    //下方方向鍵             ball.moveDown();   
  118.             break;            
  119. default
  120. :    
  121.             return;   
  122.     }                clearCanvas();  //先清空畫布
  123.        drawBall(ball); //再繪製最新的小球
  124.   
  125. }   
  126.      
  127.     請使用支援html5的瀏覽器開啟以下網頁以查看實際效果(使用方向鍵進行移動):
  128. 使用canvas繪製可移動的小球
  129. 小丑笑臉
  130. 只需要了解很少的幾個API,然後使用需要的動畫參數,就能製作出這個有趣又能響應你的動作的Web動畫。
  131. 第一步,畫五官 這個小丑沒有耳朵和眉毛,所以只剩下三官,但它的兩個眼睛我們要分別繪製,所以一共是四個部分。下面先看看程式碼。
  132. 繪製左眼的代碼
JavaScript Code

複製內容到剪貼簿

繪製右眼的代碼


JavaScript Code複製內容到剪貼簿
  1. var rightEye = new Kinetic.Line({   Kinetic.Line({  
  2.         x: sw - 250,   
  3.         points: [0, 200, 50, 190, 100, 200, 50, 210],   
  4.         tension: 0.5,   
  5.         closed: true,   
  6.         stroke: 'white',   
  7.         strokeWidth: 10      
  8.       });  


繪製鼻子的代碼

JavaScript Code複製內容到剪貼簿
  1. var nose = new Kinetic.Line({  
  2.  Kinetic.Line({  
  3.  Kinetic.Line({  
  4.         points: [240, 280, sw/2, 300, sw-240,280],   
  5.         tension: 0.5,            closed: 
  6. true
  7. ,            stroke: 
  8. 'white'
  9. ,   
  10.         strokeWidth: 10   
      });  


繪製嘴巴的程式碼
JavaScript Code複製內容到剪貼簿
  1. var mouth = new Kinetic.Line({ >         points: [150, 340, sw/2, 380, sw - 150, 340, sw/2, sh],  sh],  
  2.         tension: 0.5,   
  3.         closed: true
  4. ,            stroke: 'red'
  5. ,            strokeWidth: 10   
  6.       });  
  7. 你會不會覺得很失望,原來就這麼簡單幾行程式碼。沒錯,就是這麼簡單,相信你對自己能成為Web遊戲動畫程式設計師開始有信心了!
簡單講解一下上面的程式碼。 Kinetic就是我們使用的js工具包。在頁面的頭部,我們需要這樣引用它:

JavaScript Code

複製內容到剪貼簿
var
     mouth = 
  1. new Kinetic.Line({ >         points: [150, 340, sw/2, 380, sw - 150, 340, sw/2, sh],  sh],           tension: 0.5,   
  2.         closed: 
  3. true
  4. ,   
  5.         stroke: 
  6. 'red',   
  7.         strokeWidth: 10   
  8.       });  
  9. 其它幾個分別是幾個關鍵點,線條彈性,顏色,寬度等。這些都很容易理解。
  10. 第二步,讓圖片動起來
  11. 這個動畫之所以能吸引人,是因為它能回應你的滑鼠動作,和使用者有互動,這是一個成功的動畫最關鍵的地方。如果你仔細觀察,這個小丑五官的變化只是形狀的變化,眼睛變大,嘴巴變大,鼻子變大,但特別的是這個變化不是瞬間變化,而是有過渡性的,這裡面有一些算法,這就是最讓人煩惱的地方。幸運的是,這演算法技術都非常的成熟,不需要我們來思考,在這些動畫引擎庫裡都把這些技術封裝成了非常簡單方便的介面。下面我們來看看如何讓動起來。
  12. 左眼的動畫

JavaScript Code

複製內容到剪貼簿


var leftEyeTween = new
 Kinetic.Tween({  >
  1.         node: leftEye,            duration: 1,            easing: Kinetic.Easings.ElasticEaseOut,   
  2.         y: -100,   
  3.         points: [0, 200, 50, 150, 100, 200, 50, 200]  
  4.       });  
  5. 右眼的動畫
  6. JavaScript Code
  7. 複製內容到剪貼簿
    1. var rightEyeTween = new Kinetic.Tween({           node: rightEye,   
    2.         duration: 1,   
    3.         easing: Kinetic.Easings.ElasticEaseOut,   
    4.         y: -100,   
    5.         points: [0, 200, 50, 150, 100, 200, 50, 200]  
    6.       });  
    7. 鼻子的動畫


JavaScript Code

複製內容到剪貼簿
var
  1.  noseTween = new Kinetic.Tween({    Kinetic.Tween({            node: nose,   
  2.         duration: 1,   
  3.         easing: Kinetic.Easings.ElasticEaseOut,   
  4.         y: -100,   
  5.         points: [220, 280, sw/2, 200, sw-220,280]   
  6.       });  
  7. 嘴巴的動畫

JavaScript Code

複製內容到剪貼簿
var
     mouthTween = 
  1. new Kinetic.Tween({           node: mouth,            duration: 1,   
  2.         easing: Kinetic.Easings.ElasticEaseOut,   
  3.         points: [100, 250, sw/2, 250, sw - 100, 250, sw/2, sh-20]  100, 250, sw/2, sh-20]  
  4.       });  
  5. 這些程式碼非常的簡單,而且變數名能自釋其意。稍微有點經驗的程式設計師想看懂這些程式碼應該不難。基本每段程式碼都是讓你提供一些點,指定動畫動作的衰退模式和持續時間。
  6. 完整的動畫程式碼
  7. JavaScript Code
複製內容到剪貼簿

  1.   
  2.   
  3.      
  4.        
  5.      
  6.      
  7.     
    "container">
      
  8.     <script><span class="string">"/js/lib/kinetic-v5.0.1.min.js"</script>>
  9.     「延遲」>          
  10. var sw = 578;   
  11.       
  12. var sh = 400;   
  13.       
  14. var stage =  
  15.  
  16. (         容器: '容器',  
  17.         寬度:578,  
  18.         高度:400   
  19.       });  
  20.       var 層 =  
  21.         y: -30    
  22.       });  
  23.   
  24.       var leftEye = 
  25.         x:150,  
  26.         積分:[0, 200, 50, 190, 100, 200, 50, 210],  
  27.         張力:0.5,           關閉: 
  28. true
  29. ,           中風: 
  30. '白色'
  31. ,   
  32.         筆畫寬度:10        
  33.       });  
  34.          var rightEye = 
  35.         x: sw - 250,   
  36.         積分:[0, 200, 50, 190, 100, 200, 50, 210],  
  37.         張力:0.5,  
  38.         關閉: true
  39. ,  
  40.         中風: '白色'
  41. ,   
  42.         筆畫寬度:10      
  43.       });   
  44.   
  45.       var 鼻子 =  
  46.         積分:[240, 280, sw/2, 300, sw-240,280],  
  47.         張力:0.5,  
  48.         關閉: true,  
  49.         中風: '白色',   
  50.         筆畫寬度:10   
  51.       });  
  52.   
  53.       var 嘴 =  
  54.  
  55.  
  56.         分:[150, 340, sw/2, 380, sw - 150, 340, sw/2,10],          張力:0.5,  
  57.         關閉: 
  58. true,  
  59.         中風: 
  60. '紅色'
  61. ,  
  62.         筆畫寬度:10   
  63.       });  
  64.   
  65.       layer.add(leftEye)   
  66.            .add(rightEye)   
  67.            .add(鼻子)   
  68.            .add(口);   
  69.   
  70.       stage.add(layer);   
  71.   
  72.       
  73. //補間
  74.   
  75.          var
  76.  leftEyeTween = 
  77.         節點:左眼,  
  78.         持續時間: 1,   
  79.         緩動:Kinetic.Easings.ElasticEaseOut,  
  80.         y: -100,   
  81.         積分:[0, 200, 50, 150, 100, 200, 50, 200]   
  82.       });    
  83.   
  84.       var rightEyeTween =         節點:右眼,  
  85.         持續時間: 1,   
  86.         緩動:Kinetic.Easings.ElasticEaseOut,  
  87.         y: -100,   
  88.         積分:[0, 200, 50, 150, 100, 200, 50, 200]   
  89.       });  
  90.   
  91.       var
  92.  noseTween = 新        節點:鼻子,           持續時間: 1,   
  93.         緩動:Kinetic.Easings.ElasticEaseOut,  
  94.         y: -100,   
  95.         積分:[220, 280, sw/2, 200, sw-220,280]   
  96.       });    
  97.   
  98.       var
  99.  mouthTween = 
  100.         節點:嘴,           持續時間: 1,            緩動:Kinetic.Easings.ElasticEaseOut,  
  101.         分:[100, 250, sw/2, 250, sw - 100, 250, sw/2,sh-20]  100,  
  102.       });    
  103.   
  104.       stage.getContainer().addEventListener(
  105. '滑鼠懸停'
  106. 函數
  107. 函數 >
  108.         leftEyeTween.play();            rightEyeTween.play();            noseTween.play();   
  109.         mouthTween.play();   
  110.       });  
  111.   
  112.       stage.getContainer().addEventListener(
  113. 'mouseout'
  114. 函數
  115.         leftEyeTween.reverse();   
  116.         rightEyeTween.reverse();            noseTween.reverse();            mouthTween.reverse();   
  117.       });  
  118.   
  119.     腳本>   
  120.   

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板