自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HTML 5游戲制作之五彩連珠(動畫)

開發(fā) 前端
另外,我們不光飛入的動作需要重繪,游戲開始后玩家還要點(diǎn)擊移動一個泡泡到另外一個格子,所以這里也要重繪。那繪制的信息這么多,整個重繪工作都要交給game來進(jìn)行,game控制所有的父元素。

上一節(jié)中,我們留下了一個flyin的方法沒有介紹,這里想單獨(dú)寫一篇html5的動畫實現(xiàn)。

在第二節(jié)中我們實現(xiàn)了畫一個泡泡,并且成功的擦除了泡泡,但當(dāng)時也說了別把棋盤的線給擦掉了,所以做了偏移量。所以說html5 Canvas還是低級, 沒有圖層的概念,擦掉再想補(bǔ)回來,怎么補(bǔ)?  答案就是重繪。  沒錯,整個Canvas重繪,這樣就能不用擔(dān)心補(bǔ)哪里了。雖然帶來了性能的損失,但絕對減少的編碼難度。而且計算機(jī)的能力也不差這點(diǎn)損失。那么重繪的話,我們在Canvas是上所有的需要繪制的對象都應(yīng)該有draw方法。這是必須的。另外,所有的元素都有個上下的概念,所以要先繪制下面的,再繪制上面的。 而這個上下就得靠 子元素的概念,這樣在父元素繪制完畢后遍歷其子元素繪制,就不用擔(dān)心掩蓋的問題。

如果想把ready區(qū)的3個泡“飛入”棋盤,就需要讓Canvas在泡移動的時候進(jìn)行重繪,泡泡不動時不需要重繪。泡泡的移動很容易實現(xiàn),只要改變他的x,y坐標(biāo)即可。如果想達(dá)到動畫的效果,就得在改變坐標(biāo)期間,定時重繪,可以使用setInterval來實現(xiàn)。

另外,我們不光飛入的動作需要重繪,游戲開始后玩家還要點(diǎn)擊移動一個泡泡到另外一個格子,所以這里也要重繪。那繪制的信息這么多,整個重繪工作都要交給game來進(jìn)行,game控制所有的父元素。 

  1. start: function () {   
  2.     this.map.init();   
  3.     this.ready.init();   
  4.     this.draw();   
  5.     this.canvas.onclick = this.onclick;   
  6. },   
  7. over: function () {   
  8.     alert("GAME OVER");   
  9. },   
  10. draw: function () {   
  11.     this.ctx.clearRect(0, 0, 400, 600);   
  12.     this.ctx.save();   
  13.     this.map.draw();   
  14.     this.ready.draw();   
  15.     this.ctx.restore();   
  16. },   
  17. play: function (action, interval) {   
  18.     var me = this;   
  19.     play = setInterval(function () {   
  20.         action();   
  21.         me.draw();   
  22.     }, interval || 1);   
  23. },   
  24. stop: function () {   
  25.     clearInterval(play);   
  26.     this.draw();   
  27.     //console.log(this.ready.bubbles.length);   
  28. }, 

game.start就是初始化所有的父元素,

game.over自然不必說,只是這里沒有寫具體代碼,結(jié)束時應(yīng)該無法繼續(xù)操作泡泡。

game.draw 繪制所有的父元素。

game.play 就是重繪方法,需要重繪時掉用此方法。接收2個參數(shù),***個是重繪時需要做的動作,interval是繪制的間隔時間。不同的動作可能間隔不一樣。

可能這種實現(xiàn)是野路子,真正的重繪應(yīng)該是游戲開始后就不聽的調(diào)用重繪方法,而不是具體哪里調(diào)用,只是在具體的精靈(每個元素)Update自己狀態(tài)就像我這里的action。  這里我們暫且這樣實現(xiàn),后面如果達(dá)不到需求再重構(gòu)這個重繪的代碼,畢竟核心的代碼不變,只是改改機(jī)制 不是大問題。

game.stop 停止重繪,又調(diào)用了一次draw,是為了保證***的繪制沒問題。

接下來考慮下flyin飛入的實現(xiàn)。知道起始和結(jié)束的xy坐標(biāo),飛入的路徑不是問題,無非是x y的加加減減,那么動畫方面,我們的game.play的action就是來加減ready.bubbles的xy坐標(biāo)。飛入的邏輯并非這么簡單,首先需要3個沒染色空格,如果不足3個,那就GameOver了,所以map需要提供一個返回3個空格子的方法,另外,飛入之后ready區(qū)要重新生成新的泡泡,而這幾個被飛的泡泡需要刪除,并且map要對3個空格子進(jìn)行染色。 這就完成了整個飛入效果。

其實還有一個邏輯就是 飛入完畢后檢查是否有哪些泡泡可以被消除,這個我們后面再講。

先看獲取3個空格的方法: 

  1. getEmptyBubbles: function () {   
  2.     var empties = [];   
  3.     this.bubbles.forEach(function (row) {   
  4.         row.forEach(function (bubble) {   
  5.             if (!bubble.color) {   
  6.                 empties.push(new Bubble(bubble.x, bubble.y));   
  7.             }   
  8.         });   
  9.     });   
  10.     if (empties.length <= 3) {   
  11.         game.over();   
  12.         return [];   
  13.     }   
  14.    
  15.     var result = [];   
  16.     var useds = [];   
  17.     for (var i = 0; i < empties.length; i++) {   
  18.         if (result.length == 3) {   
  19.             break;   
  20.         }   
  21.         var isUsed = false;   
  22.         var ra = game.getRandom(empties.length);   
  23.         for (var m = 0; m < useds.length; m++) {   
  24.             isUsed = ra === useds[m];   
  25.             if (isUsed) break;   
  26.         }   
  27.         if (!isUsed) {   
  28.             result.push(empties[ra]);   
  29.             useds.push(ra);   
  30.         }   
  31.     }   
  32.     console.log(useds);   
  33.     return result;   
  34. },  

獲取3個隨機(jī)的空格還是挺多代碼的。。。然后就是flyin的實現(xiàn)了。

首先定一個一個status,來存飛入的狀態(tài)。3個都飛完畢才能做后面的邏輯。Bubble對象也為此增加了px和py倆個成員(即Bubble的實際坐標(biāo)),這樣才能控制每個像素的移動。 其實在計算飛入路徑時我寫了很久的代碼,別看現(xiàn)在就這么幾行,開發(fā)過程中還是頗費(fèi)力。各種詭異的飛行。。。開始是按x++ y++遞增飛行的,這樣就是45°角飛行,但顯然飛行線路(起始到結(jié)束的線)的傾斜度不是45°,那就會出現(xiàn)先飛完x或y,再走直線,很傻的。所以要用斜率來計算當(dāng)前的y坐標(biāo)。而x的坐標(biāo)可以固定常熟移動。我畫了一個斜率的公式,忘記的同學(xué)可以看看下。根據(jù)長寬的比率,就能計算當(dāng)前的y值。

  1. flyin: function () {   
  2.     var emptys = game.map.getEmptyBubbles();   
  3.     if (emptys.length < 3) {   
  4.         //GAME OVER   
  5.         game.over();   
  6.         return;   
  7.     }   
  8.     var me = this;   
  9.     var status = [0, 0, 0];   
  10.     game.play(function () {   
  11.         if (status[0] && status[1] && status[2]) {   
  12.             game.stop();   
  13.             status = [0, 0, 0];   
  14.             me.bubbles = [];   
  15.             me.genrate();   
  16.             return;   
  17.         }   
  18.     
  19.         for (var i = 0; i < me.bubbles.length; i++) {   
  20.             if (status[i]) {   
  21.                 continue;   
  22.             }   
  23.             var target = emptys[i];   
  24.             var x2 = target.px + game.map.startX - me.startX;   
  25.             var y2 = target.py + game.map.startY - me.startY;   
  26.     
  27.             var current = me.bubbles[i];   
  28.     
  29.             var tmpWidth = 2;   
  30.             if (current.px < x2) {   
  31.                 current.py = ((y2 - current.py) / (x2 - current.px)) * tmpWidth + current.py;   
  32.                 current.px += tmpWidth;   
  33.             }   
  34.             else if (current.px > x2) {   
  35.                 current.py = ((y2 - current.py) / (current.px - x2)) * tmpWidth + current.py;   
  36.                 current.px -= tmpWidth;   
  37.             }   
  38.             else {   
  39.                 current.py += tmpWidth;   
  40.             }   
  41.             if (current.py > y2) {   
  42.                 current.py = y2;   
  43.             }   
  44.     
  45.             if (current.px > x2) {   
  46.                 current.px = x2;   
  47.             }   
  48.     
  49.     
  50.             if (current.px == x2 && current.py == y2) {   
  51.                 status[i] = 1;   
  52.                 current.x = target.x;   
  53.                 current.y = target.y;   
  54.                 game.map.addBubble(current);   
  55.                 console.log(1);   
  56.             }   
  57.         }   
  58.     });   
  59.     

既然我們已經(jīng)實現(xiàn)了動畫效果,那么接下來順便再實現(xiàn)一個動畫效果,就是點(diǎn)擊泡泡時,泡泡要做出響應(yīng)(就是忽閃忽閃的),要不然用戶都不知道點(diǎn)了沒有。所以Bubble也要增加一個閃動的action。

代碼的意思是讓間隔50毫秒,重繪一次光照的亮度,亮度值(外圓的半徑)10和30之間來回蕩。這樣就亮了暗,暗了再亮。很有意思:)

  1. Bubble.prototype.play = function () {   
  2.     var me = this;   
  3.     var isUp = true;   
  4.     game.play("light_" + this.x + "_" + this.y, function () {   
  5.         if (isUp) {   
  6.             me.light++;   
  7.         }   
  8.     
  9.         if (!isUp) {   
  10.             me.light--;   
  11.         }   
  12.         if (me.light == 30) {   
  13.             isUp = false;   
  14.         }   
  15.         if (me.light == 10) {   
  16.             isUp = true;   
  17.         }   
  18.     }, 50);   
  19. };   
  20.     
  21. Bubble.prototype.stop = function () {   
  22.     //this.light = 10;   
  23.     var me = this;   
  24.     game.stop("light_" + this.x + "_" + this.y);   
  25.     game.play("restore_" + this.x + "_" + this.y, function () {   
  26.         if (me.light > 10) {   
  27.             me.light--;   
  28.         }   
  29.         else {   
  30.             me.light = 10;   
  31.             game.stop("restore_" + me.x + "_" + me.y);   
  32.         }   
  33.     }, 50);   
  34. }; 

細(xì)心的朋友可能會發(fā)現(xiàn),在調(diào)用Game.stop的方法的參數(shù)上增加了一個參數(shù)。 這里我要說明下。如果沒有參數(shù)的情況,game.play和stop會造成問題,因為用的都是一個interval,clear的話會打斷其他的動畫,所以我們把每個action都要傳遞一個name,這樣就能讓game粒度更細(xì)的控制每個action了。game的播放代碼也做了響應(yīng)的調(diào)整,如下:

  1. play: function (name, action, interval) {   
  2.     var me = this;   
  3.     this.actions[name] = setInterval(function () {   
  4.         action();   
  5.         me.draw();   
  6.     }, interval || 1);   
  7. },   
  8. stop: function (name) {   
  9.     clearInterval(this.actions[name]);   
  10.     this.draw();   
  11. }, 

效果演示地址:http://jsfiddle.net/maddemon/VtMSU/embedded/result/

原文鏈接:http://www.cnblogs.com/mad/archive/2012/03/18/2403404.html

【編輯推薦】

  1. HTML 5游戲制作之五彩連珠(預(yù)覽)
  2. HTML 5游戲制作之五彩連珠(畫圖)
  3. HTML 5游戲制作之五彩連珠(設(shè)計)
  4. HTML 5游戲制作之五彩連珠(尋路)
  5. HTML 5游戲制作之五彩連珠(試玩)

 

責(zé)任編輯:張偉 來源: 君之蘭的博客
相關(guān)推薦

2012-05-18 14:05:53

HTML5

2012-05-18 13:07:04

HTML5

2012-05-17 14:45:34

HTML5

2012-05-17 13:45:35

HTML5

2012-05-18 13:59:45

HTML5

2010-08-12 22:35:24

IBM培訓(xùn)

2011-11-30 15:14:32

HTML 5

2019-09-11 15:20:21

華為

2012-06-07 15:29:31

HTML5

2011-07-19 13:07:26

iOS4 HTML5 動畫

2021-03-26 07:06:40

Windows 10Windows操作系統(tǒng)

2012-05-15 13:57:41

HTML5

2017-08-29 10:55:15

AEbodymovinhtml

2012-01-10 16:37:46

樂團(tuán)

2012-11-07 09:43:58

IBMdw

2012-03-29 09:18:47

HTML5WEB

2020-04-22 10:01:26

Vim編輯器代碼

2019-09-12 10:10:10

Vim編輯器代碼

2013-08-27 14:20:09

游戲應(yīng)用圖標(biāo)ASO應(yīng)用商店優(yōu)化

2012-06-04 14:47:42

HTML5
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號