成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HTML 5游戲制作之五彩連珠(設計)

開發 前端
分析一下游戲所需的元素:1、棋盤(地圖)2、泡泡 3、等待區域(新的3個即將進入棋盤的泡泡)4、獎勵區域(白搭星、超級百搭星、炸彈)5、統計信息 6、按鈕

在看了幾篇Canvas相關的文章后,發現前兩節的代碼實現還是有問題,因為知道的少,所以只能在自己已知的知識上做實現。不過還好,這是一個發現的過程,也是一個糾錯和完善的過程。我第一次嘗試一邊學習一遍寫博客,我想這也有助我的學習,可以把知識掌握的牢固些,起碼忘的慢一些吧:)。

前兩節學習了幾個基本繪制的方法,lineTo moveTo和arc,也了解坐標的情況,但寫的比較傻,只是單純的實現。 比如棋盤的起始坐標如果有偏移量,我們還要計算他的具體開始坐標和結束坐標,實際上Canvas有現有的方法提供偏移的功能。 他叫 translate,另外還有縮放scale、旋轉rotate,他們都可以用transform代替。所以,在代碼方面還會有些調整。不過這個的學習恰巧也讓我知道如何實現動畫效果。如果多個元素在一個Canvas上,實現動畫,必然會需要擦除重繪的情況,如果元素之間有覆蓋的情況,擦除就需要多考慮了。當然,簡單的辦法就是把整個畫布根據當然所有元素的位置重新繪制一遍。所以在代碼設計方面,需要把不同的元素獨立出來,每個元素都有自己的draw方法,并且要依照次序繪制Canvas。

分析一下游戲所需的元素:1、棋盤(地圖)2、泡泡 3、等待區域(新的3個即將進入棋盤的泡泡)4、獎勵區域(白搭星、超級百搭星、炸彈)5、統計信息 6、按鈕

所以在對象的設計方面起碼要有幾類 棋盤(map)、新泡泡區(ready)、獎勵區(awards)、泡泡(bubble)、星星1(star1) 、星星2(star2) 、炸彈(boom)、統計積分(score),還要包括游戲背后的數據(data)。 OK,先這么規劃,挨個的去實現。先把map和bubble重寫了。 

之前把map寫成了類,顯然是不合適的,因為這個游戲不可能會有多個map,所以直接定義為對象更方便。而泡泡顯然需要很多,所以需要寫成類比較方便。游戲里面所有對象需要訪問的全局變量和常量需要定義在一個game對象里,游戲開始則是調用game.start()的方法。所以先看下game的定義:

  1. var game = {   
  2.     canvas: document.getElementById("canvas"),   
  3.     ctx: this.canvas.getContext("2d"),   
  4.     cellCount: 9,   
  5.     cellWidth: 30,   
  6.     lineCount: 5,   
  7.     mode: 7,   
  8.     colors: ["red""#039518""#ff00dc""#ff6a00""gray""#0094ff""#d2ce00"],   
  9.     over: function () {   
  10.         alert("GAME OVER");   
  11.     },   
  12.     getRandom: function (max) {   
  13.         return parseInt(Math.random() * 1000000 % (max));   
  14.     },   
  15. }; 

cellCount就是格子的總數,cellwidth是每個格子的寬度,因為不光map里需要這個,所以就定義在了這里,mode 是游戲模式 5是簡單 7是困難。
 再看下map的代碼:

  1. game.map = {   
  2.     startX: 40.5,   
  3.     startY: 60.5,   
  4.     width: game.cellCount * game.cellWidth,   
  5.     height: game.cellCount * game.cellWidth,   
  6.     bubbles: [],   
  7.     init: function () {   
  8.         for (var i = 0; i < game.cellCount; i++) {   
  9.             var row = [];   
  10.             for (var j = 0; j < game.cellCount; j++) {   
  11.                 row.push(new Bubble(i, j, null));   
  12.             }   
  13.             this.bubbles.push(row);   
  14.         }   
  15.     },   
  16.     draw: function () {   
  17.         var ctx = game.ctx;   
  18.         ctx.save();   
  19.         ctx.translate(this.startX, this.startY);   
  20.         ctx.beginPath();   
  21.         for (var i = 0; i <= 9; i++) {   
  22.     
  23.             var p1 = i * game.cellWidth;;   
  24.             ctx.moveTo(p1, 0);   
  25.             ctx.lineTo(p1, this.height);   
  26.     
  27.             var p2 = i * game.cellWidth;   
  28.             ctx.moveTo(0, p2);   
  29.             ctx.lineTo(this.width, p2);   
  30.         }   
  31.         ctx.strokeStyle = "#555";   
  32.         ctx.stroke();   
  33.     
  34.         //繪制子元素(所有在棋盤上的泡)   
  35.         this.bubbles.forEach(function (row) {   
  36.             row.forEach(function (bubble) {   
  37.                 bubble.draw();   
  38.             });   
  39.         });   
  40.         ctx.restore();   
  41.     },   
  42.     addBubble: function (bubble) {   
  43.         var thisBubble = this.bubbles[bubble.x][bubble.y];   
  44.         thisBubble.color = bubble.color;   
  45.     },   
  46.     getBubble: function (x, y) {   
  47.         var thisBubble = this.bubbles[x][y];   
  48.         if (!thisBubble.color) {   
  49.             return null;   
  50.         }   
  51.         else {   
  52.             return thisBubble;   
  53.         }   
  54.     }   
  55. }; 

map的init初始化方法里我先把所有的泡泡部署好了,但是都沒有染色,我并沒有在ui的背后維護一個數組,因為我覺得泡泡有沒有顏色就代表 0,1了,所以就這樣也行。

draw方法不再想之前那樣把起始坐標計算進去了,而是使用了translate方法,這樣就很方便寫代碼了。
addBubble其實就是染色而已,接收參數是一個泡泡對象,這個對象來自ready區域的泡泡。

Ready區域其實就像俄羅斯方塊那樣,有三個預備的泡泡即將進入map區域。

  1. game.ready = {   
  2.     startX: 40.5,   
  3.     startY: 20.5,   
  4.     width: game.cellWidth * 3,   
  5.     height: game.cellWidth,   
  6.     bubbles: [],   
  7.     init: function () {   
  8.         this.genrate();   
  9.         var me = this;   
  10.         me.flyin();   
  11.     },   
  12.     genrate: function () {   
  13.         for (var i = 0; i < 3; i++) {   
  14.             var color = game.colors[game.getRandom(game.mode)];   
  15.             this.bubbles.push(new Bubble(i, 0, color));   
  16.         }   
  17.     },   
  18.     draw: function () {   
  19.         var ctx = game.ctx;   
  20.         ctx.save();   
  21.         ctx.translate(this.startX, this.startY);   
  22.         ctx.beginPath();   
  23.         ctx.strokeStyle = "#555";   
  24.         ctx.strokeRect(0, 0, this.width, this.height);   
  25.         ctx.stroke();   
  26.         //繪制準備的泡   
  27.         this.bubbles.forEach(function (bubble) {   
  28.             bubble.draw();   
  29.         });   
  30.     
  31.         ctx.restore();   
  32.     },   
  33. }; 

ready.init 初始化3個泡泡,并且把這3個泡泡“飛入”到map里,ready.draw很簡單就是繪制一個小矩形和3個泡泡。

哦,對了,我們的泡泡的繪制代碼也稍作了修改,現在的樣子不是之前的純色了,有了水晶效果。。。不妨看看: 

  1. Bubble.prototype.draw = function () {   
  2.     if (!this.color) {   
  3.         return;   
  4.     }   
  5.     var ctx = game.ctx;   
  6.     ctx.beginPath();   
  7.     //console.log("x:" + px + "y:" + py);   
  8.     var gradient = ctx.createRadialGradient(this.px - 5, this.py - 5, 0, this.px, this.py, this.light);   
  9.     gradient.addColorStop(0, "white");   
  10.     gradient.addColorStop(1, this.color);   
  11.     ctx.arc(this.px, this.py, 11, 0, Math.PI * 2);   
  12.     ctx.strokeStyle = this.color;   
  13.     ctx.fillStyle = gradient;   
  14.     ctx.fill();   
  15.     ctx.stroke();   
  16. }; 

createRadialGradient方法是畫一個放射性的圓,起始在左上角,這樣就有個光照效果,還是不錯的。 看下效果圖吧

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

【編輯推薦】

  1. HTML 5游戲制作之五彩連珠(預覽)
  2. HTML 5游戲制作之五彩連珠(畫圖)
  3. HTML 5游戲制作之五彩連珠(動畫)
  4. HTML 5游戲制作之五彩連珠(尋路)
  5. HTML 5游戲制作之五彩連珠(試玩)

 

責任編輯:張偉 來源: 君之蘭的博客
相關推薦

2012-05-17 14:45:34

HTML5

2012-05-17 13:45:35

HTML5

2012-05-18 14:05:53

HTML5

2012-05-18 13:11:09

HTML5

2012-05-18 13:59:45

HTML5

2010-08-12 22:35:24

IBM培訓

2011-11-30 15:14:32

HTML 5

2019-09-11 15:20:21

華為

2021-03-26 07:06:40

Windows 10Windows操作系統

2012-06-07 15:29:31

HTML5

2012-05-15 13:57:41

HTML5

2012-01-10 16:37:46

樂團

2019-09-12 10:10:10

Vim編輯器代碼

2012-03-29 09:18:47

HTML5WEB

2020-04-22 10:01:26

Vim編輯器代碼

2013-08-27 14:20:09

游戲應用圖標ASO應用商店優化

2012-05-30 13:49:52

HTML5

2014-12-30 17:13:51

HTML5

2021-03-29 15:07:19

AI 數據人工智能

2011-12-16 11:11:36

HTML 5
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜a v电影 | 韩国av一区二区 | 欧美日韩黄色一级片 | 91影院在线观看 | 亚洲天堂av一区 | 国产精品一区二区三区久久 | 亚洲黄色一区二区三区 | 毛片黄片 | 青青草这里只有精品 | 久久亚洲天堂 | 在线高清免费观看视频 | 欧美日韩亚洲在线 | 国产成在线观看免费视频 | 中文字幕亚洲免费 | 国产精品成人在线播放 | 久久国产精品-国产精品 | 精品一区二区三区在线视频 | 欧美一区二区另类 | 欧美另类视频 | 日本免费小视频 | 9porny九色视频自拍 | 午夜码电影 | 日本中文字幕日韩精品免费 | 色五月激情五月 | 日本一区高清 | 亚洲一区 | 亚洲一区二区三区在线视频 | 精品视频一区二区三区在线观看 | 亚洲精品电影网在线观看 | 国产精品久久国产精品 | 蜜桃av一区二区三区 | 国产精品海角社区在线观看 | 久久99网| 久久99精品久久久久蜜桃tv | av日韩在线播放 | 欧美日韩国产一区二区 | 北条麻妃国产九九九精品小说 | 视频1区2区 | 一区二区三区四区毛片 | 日韩乱码一二三 | 久久久亚洲一区 |