HTML5游戏制作之五彩连珠(试玩)

上节中讲了如何寻路,在和朋友们讨论时都反应有时走的不太对,绕远路了,其实代码主要是大方向的判断  比如目标在右上,那应该是先右还是先上 这个并没有做处理,如果这个做了处理,效果会更好一些,但也难免会走弯路。  贪心就是这样,不是最优,接近最优。也希望其他的同学有意见的可以讨论下。我这也只是个人想法。

我们提供的服务有:网站制作、做网站、微信公众号开发、网站优化、网站认证、古交ssl等。为上千余家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的古交网站制作公司

既然可以走动了,那就可以判断是否可以消除同样颜色的行、列或斜线了。只要>=5个同样的色球,就清除他们,并且可以继续移动。如果不可以清除,那就再增加3个球。

 
 
 
 
  1. clearLine: function (x1, y1, color, isClick) {   
  2.     if (this.isEmpty(x1, y1)) {   
  3.         if (isClick) game.ready.flyin();   
  4.         return;   
  5.     };   
  6.     //给定一个坐标,看是否有满足的line可以被消除   
  7.     //4根线 一  | / \   
  8.         
  9.     var current = this.getBubble(x1, y1);   
  10.     if (!current.color) {   
  11.         console.log(current);   
  12.     }   
  13.     var arr1, arr2, arr3, arr4;   
  14.     arr1 = this.bubbles[y1];//横线很简单,就是数组的一项,现成的   
  15.    
  16.     arr2 = [];   
  17.     for (var y = 0; y < game.cellCount; y++)   
  18.         arr2.push(this.getBubble(x1, y));//竖线就是一列。   
  19.    
  20.     arr3 = [current];   
  21.     arr4 = [current];   
  22.     for (var i = 1; i < game.cellCount ; i++) {   
  23.         if (x1 - i >= 0 && y1 - i >= 0)//\斜线的上半部分...   
  24.             arr3.unshift(this.getBubble(x1 - i, y1 - i));   
  25.         if (x1 + i < game.cellCount && y1 + i < game.cellCount)//\斜线的下半部分   
  26.             arr3.push(this.getBubble(x1 + i, y1 + i));   
  27.    
  28.         if (x1 - i >= 0 && y1 + i < game.cellCount)// /斜线的下半部分   
  29.             arr4.push(this.getBubble(x1 - i, y1 + i));   
  30.         if (x1 + i < game.cellCount && y1 - i >= 0)// /斜线的上班部分   
  31.             arr4.unshift(this.getBubble(x1 + i, y1 - i));   
  32.     }   
  33.    
  34.     var line1 = getLine(arr1);   
  35.     var line2 = getLine(arr2);   
  36.     var line3 = getLine(arr3);   
  37.     var line4 = getLine(arr4);   
  38.    
  39.     var line = line1.concat(line2).concat(line3).concat(line4);   
  40.     if (line.length < 5) {   
  41.         if (isClick) game.ready.flyin();   
  42.         return;   
  43.     }   
  44.     else {   
  45.         var me = this;   
  46.         var i = 0;   
  47.    
  48.         game.play("clearline", function () {   
  49.             if (i == line.length) {   
  50.                 game.score.addScore(line.length);   
  51.                 game.stop("clearline");   
  52.                 me.isMoving = false;   
  53.                 //game.ready.flyin();   
  54.                 return;   
  55.             }   
  56.             me.isMoving = true;   
  57.             var p = line[i];   
  58.             me.setBubble(p.x, p.y, null);   
  59.             i++;   
  60.         }, 100);   
  61.     }   
  62.    
  63.    
  64.     function getLine(bubbles) {   
  65.    
  66.         var line = [];   
  67.         for (var i = 0; i < bubbles.length; i++) {   
  68.             var b = bubbles[i];   
  69.             if (b.color == color) {   
  70.                 line.push({ "x": b.x, "y": b.y });   
  71.             }   
  72.             else {   
  73.                 if (line.length < 5)   
  74.                     line = [];   
  75.                 else 
  76.                     return line;   
  77.             }   
  78.         }   
  79.         if (line.length < 5)   
  80.             return [];   
  81.         return line;   
  82.     }   
  83. }, 

大家可以看看代码,主要有两点 1、或许需要处理的 横竖斜线 4个数组,然后看这4个数组是否有连续的。判断是否连续只需要一个状态数组来维持就可以了。

由于考虑到同时消除多行的情况,所以要把连续的line 连接在一起,并在结算得分时考虑奖励。

isClick参数主要用于判断是否是用户点击进行消行的还是新泡泡飞入产生的。  如果达不到消行条件并且是飞入的,那就不能再调用飞入了,否则死循环了.

满足的消行代码也比较简单,就是播放一个消行动画,其实这个动画真心没劲,要想设计好些可以做个渐变偏移消除。  现在我发现起初没有设计一个数组来维护状态有些不太明智,因为还有奖励的星星和炸弹要绘制,挺麻烦的。。 那么,把积分显示出来吧。 这样就可以先试玩起来了:

 
 
 
 
  1. game.score = {   
  2.     basic: 0,   
  3.     operate: 0,   
  4.     star1: 0,   
  5.     star2: 0,   
  6.     boom: 0,   
  7.     draw: function () {   
  8.         var startX = game.cellWidth * 10 + game.map.startX;   
  9.         var startY = game.map.startY;   
  10.         var ctx = game.ctx;   
  11.         ctx.save();   
  12.         ctx.translate(startX, startY);   
  13.         ctx.clearRect(0, 0, 150, 400);   
  14.         ctx.strokeStyle = "#456";   
  15.         //ctx.strokeRect(0, 0, 150, 200);   
  16.         ctx.font = "24px 微软雅黑";   
  17.         ctx.fillStyle = "#fefefe";   
  18.         ctx.fillText("score:" + (this.basic * 5 + this.star1 * 8 + this.star2 * 10 + this.boom * 20), 0, 30);   
  19.         ctx.stroke();   
  20.         ctx.restore();   
  21.     },   
  22.     addScore: function (length) {   
  23.         switch (length) {   
  24.             case 5:   
  25.                 this.basic++;   
  26.                 break;   
  27.             case 6:   
  28.                 this.star1++;   
  29.                 break;   
  30.             case 7:   
  31.                 this.star2++;   
  32.                 break;   
  33.             default:   
  34.                 this.boom++;   
  35.                 break;   
  36.         }   
  37.         this.draw();   
  38.         console.log(this.score);   
  39.     },   
  40. }; 

第三节在设计里谈到了 百搭星和炸弹,我太懒了,不打算讲了,因为这些处理也没有什么复杂的,HTML5 Canvas的的基础学习也算可以了。后面应该学一些更深入的东西,比如如何处理性能、物体碰撞、运动学神马的。。。

现在游戏应该还有bug,大家可以看看代码发现吧,这个系列就到这了,谢谢大家。

试玩地址:http://zhengliangjun.sinaapp.com/colorline.html

源码下载:http://download.csdn.net/download/maddemon/4154990

原文链接:http://www.cnblogs.com/mad/archive/2012/03/19/2407107.html

新闻标题:HTML5游戏制作之五彩连珠(试玩)
网站链接:http://www.gawzjz.com/qtweb2/news34/14434.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联