Fruit Ninja(水果忍者)游戏源代码下载、分析(中)---可运行Android,Ios,Window,Mac,Html5平台

背景:

   上一篇,已经实现了水果不断向上抛的效果和开始界面,这一篇我们将分析如何切水果,获得分数;运行demo需要配置好CocosEditor,暂不支持其他工具。demo是跨平台的,可移植运行android,ios,html5网页等,代码是基于javascript语言,cocos2d-x游戏引擎,CocosEditor手游开发工具完成的。

 

 

源代码下载:

请到代码集中营下载(水果忍者 cocos2d-JS 源代码):http://blog.makeapp.co/?p=319

 

不同平台下的效果图:

 

windows




html5网页


 

android平台

 

 

       

 

 

代码分析:

 

1 创建水果静态数组,每一个水果都有四个参数,编号,分数,本身的图片,切除后的碎片;这里定义好了,下面直接用;

 

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. FRUIT_DATA = [  
  2.     {  
  3.         num: 0,  
  4.         score: 1,  
  5.         fruitImage: "apple.png",  
  6.         cutImage: ["apple-1.png""apple-2.png"]  
  7.     },  
  8.     {  
  9.         num: 1,  
  10.         score: 2,  
  11.         fruitImage: "banana.png",  
  12.         cutImage: ["banana-1.png""banana-2.png"]  
  13.     },  
  14.     {  
  15.         num: 2,  
  16.         score: 2,  
  17.         fruitImage: "basaha.png",  
  18.         cutImage: ["basaha-1.png""basaha-2.png"]  
  19.     },  
  20.     {  
  21.         num: 3,  
  22.         score: 3,  
  23.         fruitImage: "peach.png",  
  24.         cutImage: ["peach-1.png""peach-2.png"]  
  25.     },  
  26.     {  
  27.         num: 4,  
  28.         score: 5,  
  29.         fruitImage: "sandia.png",  
  30.         cutImage: ["sandia-1.png""sandia-2.png"]  
  31.     },  
  32.     {  
  33.         num: 5,  
  34.         score: 0,  
  35.         fruitImage: "boom.png",  
  36.         cutImage: "boomlight1.png"  
  37.     }  
  38. ];  



 

 

2 检测碰撞事件;

# 触摸有onTouchBegan和onTouchMoved,这是两个点,可以确定刀锋的方向,上一节已讲过;var flash = cc.MySprite.createFlash(this.rootNode, "flash.png", this.pBegin, loc);

# 首先检查碰撞,水果和移动点发生碰撞cc.rectContainsPoint(fruit.getBoundingBox(), loc)

#如果碰撞,播放音效;playEffect;

#创建flash

#水果消失,并产生切成两半 fruit slice

#根据水果的数据获得分数提示 scoretip

 

 

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. MainLayer.prototype.onTouchesMoved = function (touches, event)  
  2. {  
  3.     if (this.gameStatus == OVER) {  
  4.         return;  
  5.     }  
  6.   
  7.     var loc = touches[0].getLocation();  
  8.     for (var i = 0; i < this.fruitList.length; i++) {  
  9.         var fruit = this.fruitList[i];  
  10.         if (fruit && fruit.cleanuped == false) {  
  11.             if (cc.rectContainsPoint(fruit.getBoundingBox(), loc)) {  
  12.   
  13.   
  14.                 //splatter audio  
  15.                 cc.AudioEngine.getInstance().playEffect(FRUIT_SOUNDS.splatter, false);  
  16.   
  17.   
  18.                 //flash  
  19.                 var flash = cc.MySprite.createFlash(this.rootNode, "flash.png"this.pBegin, loc);  
  20.   
  21.                 //Fruit Slice  
  22.                 this.newSliceFruit(fruit.num, fruit.getPosition(), flash.getRotation());  
  23.                 fruit.runAction(cc.ScaleTo.create(0, 0));  
  24.                 fruit.cleanuped = true;  
  25.   
  26.                 //scoreTip  
  27.                 var fruitScore = FRUIT_DATA[fruit.num].score;  
  28.                 this.scoreTip(fruit.getPosition(), fruitScore + "");  
  29.   
  30.                 this.totalScore += Number(fruitScore);  
  31.                 this.totalScoreFont.setString(this.totalScore);  
  32.             }  
  33.         }  
  34.         else {  
  35.             this.fruitList.splice(i, 1);  
  36.         }  
  37.     }  
  38. };  



 

3 水果切成两半的方法

#三个参数 水果编号num,切除的位置fruitPosition ,旋转角度rotation;

#从数组取出水果两个碎片图片,并创建两个cut1 cut2精灵

#创建两个cut的贝塞尔动作bezier1 bezier2,方向是相反的

#两个cut 分别runAction();

#本来切除的瞬间有一个果汁溅在墙上的效果shadow,因为没找到合适的图片 代码注释掉了

 

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. MainLayer.prototype.newSliceFruit = function (num, fruitPosition, rotation)  
  2. {  
  3.     //one fruit sliced two piece,cut1 and cut2  
  4.     var data = FRUIT_DATA[num];  
  5.     var cutImages = data.cutImage;  
  6.     var cut1 = cc.MySprite.create(this.rootNode, cutImages[0], fruitPosition, 100);  
  7.     var cut2 = cc.MySprite.create(this.rootNode, cutImages[1], fruitPosition, 100);  
  8.     cut1.setRotation(rotation);  
  9.     cut2.setRotation(rotation);  
  10.   
  11.     var controlPoints1 = [  
  12.         fruitPosition,  
  13.         fruitPosition,  
  14.         cc.p(fruitPosition.x - 200, -100)  
  15.     ];  
  16.     var bezier1 = cc.BezierTo.create(1, controlPoints1);  
  17.   
  18.     var controlPoints2 = [  
  19.         fruitPosition,  
  20.         fruitPosition,  
  21.         cc.p(fruitPosition.x + 200, -100)  
  22.     ];  
  23.     var bezier2 = cc.BezierTo.create(1, controlPoints2);  
  24.   
  25.     var action2 = cc.RotateBy.create(1, getRandom(360));  
  26.     cut1.runAction(cc.Spawn.create(cc.Sequence.create(bezier1, cc.CleanUp.create(cut1)), action2));  
  27.     cut2.runAction(cc.Spawn.create(cc.Sequence.create(bezier2, cc.CleanUp.create(cut2)), action2.clone()));  
  28.   
  29.   
  30.     //fruit shadow  
  31.     /*var shadowImages = ["shadow2.png"]; 
  32.      var colors = [cc.c4b(200, 0, 0, 20), cc.c4b(0, 200, 0, 20), cc.c4b(0, 0, 200, 20), cc.c4b(200, 200, 0, 20)]; 
  33.      var shadow = cc.MySprite.create(this.rootNode, shadowImages[getRandom(shadowImages.length)], fruitPosition, 10); 
  34.      shadow.setColor(colors[getRandom(colors.length)]); 
  35.      shadow.setScale(0.5); 
  36.      shadow.runAction(cc.Sequence.create(cc.DelayTime.create(2), cc.CleanUp.create(shadow)));*/  
  37.   
  38. };  



 

 

4 提示分数,这个很简单,只是一个创建文字标签的方法

 

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. MainLayer.prototype.scoreTip = function (p, message)  
  2. {  
  3.     var director = cc.Director.getInstance();  
  4.     var size = director.getWinSize();  
  5.     var label = cc.LabelTTF.create(message, "Arial", 30);  
  6.     label.setPosition(cc.p(p.x, p.y + 50));  
  7.     label.setColor(cc.c3b(0, 255, 0));  
  8.     label.setZOrder(10000);  
  9.     this.rootNode.addChild(label);  
  10.     label.runAction(cc.Sequence.create(cc.DelayTime.create(0.8), cc.CleanUp.create(label)));  
  11.     return label;  
  12. };  


这一篇就到这里;

 

 

 
cocos2d-x跨平台游戏引擎
 
cocos2d-x是全球知名的游戏引擎 ,引擎在全球范围内拥有众多开发者,涵盖国内外各知名游戏开发商。目前Cocos2d-x引擎已经实现横跨ios、Android、Bada、MeeGo、BlackBerry、Marmalade、Windows、Linux等平台。编写一次,到处运行,分为两个版本 cocos2d-c++和cocos2d-html5 本文使用了后者;
cocos2d-x 官网: http://cocos2d-x.org/
cocos2d-x 资料下载   http://cocos2d-x.org/download

 

 

CocosEditor开发工具:

CocosEditor,它是开发跨平台的手机游戏工具,运行window/mac系统上,javascript脚本语言,基于cocos2d-x跨平台游戏引擎, 集合代码编辑,场景设计,动画制作,字体设计,还有粒子,物理系统,地图等等的,而且调试方便,和实时模拟;

CocosEditor 下载,介绍和教程:http://blog.csdn.net/touchsnow/article/details/19070665

CocosEditor官方博客:http://blog.makeapp.co/

猜你喜欢

转载自makeapp628.iteye.com/blog/2049175