`
makeapp628
  • 浏览: 45025 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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

阅读更多

背景:

   本来打算下一个游戏是涂鸦跳跃的,因为图片资源没准备好,暂时往后推迟。刚好笔者手头上有部分水果忍者的游戏素材,于是上周末花了一些时间把水果忍者实现了;以前读大学的时候这款游戏就风靡大街小巷,记得当时同学间也比赛谁得的分数高,乐趣无穷;笔者在那会还没学过编程,很难理解切西瓜是怎么做出来,现在此一时彼一时了。 

   因为素材有限,实现的效果可能和原版有差距,例外很多童鞋反映flappy,popstar和原版不同,笔者在此说明:因为是学习demo,差距肯定是有的,好的游戏需要读者精雕细琢,把握好每一个参数和细节,都是需要花时间的。

   本系列共有上中下三篇,源码基本完成,分析分为三篇;

ps:

1  CocosEditor已发布新版本,现在提供6个实战demo学习,包括flappy ,popstar ,fruitninja,moonwarroris,fruitattack,testjavascript;

2  运行demo需要配置好CocosEditor,暂不支持其他工具。demo是跨平台的,可移植运行android,ios,html5网页等,代码是基于javascript语言,cocos2d-x游戏引擎,CocosEditor手游开发工具完成的。

 

 

源代码下载:

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

 

 

不同平台下的效果图:

 

windows




html5网页


 

android平台

 

 

       

 

 

代码分析:

实战项目里面ccbx场景都是略过的,主要放在代码这块,水果忍者主要有两个场景,一个开始场景StarLayer和主场景MainLayer;

1 StartLayer.js里面有三个按钮,道场,开始,退出。道场功能未去实现,点击开始进入主场景MainLayer;StarLayer里面主要处理三个选项的旋转动画,如下直接无限循环旋转cc.RepeatForever.create(cc.RotateBy.create());圆环顺时针,水果逆时针;

 

[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. StartLayer.prototype.onEnter = function ()  
  2. {  
  3.     this.rings = [this.dojoRing, this.newGameRing, this.quitRing];  
  4.     for (var i = 0; i < this.rings.length; i++) {  
  5.         this.rings[i].runAction(cc.RepeatForever.create(cc.RotateBy.create(1, -90)));  
  6.     }  
  7.   
  8.     this.fruits = [this.dojoFruit, this.newGameFruit, this.quitFruit];  
  9.     for (var j = 0; j < this.fruits.length; j++) {  
  10.         this.fruits[j].runAction(cc.RepeatForever.create(cc.RotateBy.create(5, 90)));  
  11.     }  
  12.   
  13.     cc.AudioEngine.getInstance().playEffect(FRUIT_SOUNDS.menu, true);  
  14.     this.isFlash = false;  
  15. };  

 

2 切掉绿色西瓜进入主场景;

#西瓜包括两个西瓜碎片,触摸的瞬间,西瓜消失,两个碎片san0,san1产生;并各自执行不同的移动动画,并动画结束后cleanup;

#触摸的瞬间也产生刀锋的效果 cc.MySprite.createFlash(this.rootNode, "flash.png", this.pBegin, loc);

#0.5s执行延迟函数进入主场景this.rootNode.scheduleOnce;

 

[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. StartLayer.prototype.onTouchesMoved = function (touches, event)  
  2. {  
  3.     var loc = touches[0].getLocation();  
  4.     if (cc.rectContainsPoint(this.newGameFruit.getBoundingBox(), loc)) {  
  5.         var sandiaImages = ["sandia-1.png""sandia-2.png"];  
  6.         var fruitPosition = this.newGameFruit.getPosition();  
  7.   
  8.         var san0 = cc.MySprite.create(this.rootNode, sandiaImages[0], fruitPosition, 100);  
  9.         var san1 = cc.MySprite.create(this.rootNode, sandiaImages[1], fruitPosition, 100);  
  10.         this.newGameFruit.runAction(cc.ScaleTo.create(0, 0));  
  11.         var rotation = this.newGameFruit.getRotation();  
  12.         cc.log("rotation==" + rotation);  
  13.         san0.setRotation(rotation);  
  14.         san1.setRotation(rotation);  
  15.         cc.AudioEngine.getInstance().playEffect(FRUIT_SOUNDS.splatter, false);  
  16.   
  17.         var upSprite = san0;  
  18.         var downSprite = san1;  
  19.         var fruitX = fruitPosition.x;  
  20.         var fruitY = fruitPosition.y;  
  21.         upSprite.runAction(cc.Sequence.create(  
  22.                 cc.MoveTo.create(0.2, cc.p(fruitX - 50, fruitY + 50)),  
  23.                 cc.CleanUp.create(upSprite)  
  24.         ));  
  25.         downSprite.runAction(cc.Sequence.create(  
  26.                 cc.MoveTo.create(0.2, cc.p(fruitX + 50, fruitY - 50)),  
  27.                 cc.CleanUp.create(downSprite)  
  28.         ));  
  29.   
  30.         if (this.isFlash == false) {  
  31.             this.isFlash = true;  
  32.             cc.MySprite.createFlash(this.rootNode, "flash.png"this.pBegin, loc);  
  33.         }  
  34.   
  35.         this.rootNode.scheduleOnce(function ()  
  36.         {  
  37.             cc.AudioEngine.getInstance().stopAllEffects();  
  38.             cc.BuilderReader.runScene("""MainLayer");  
  39.         }, 0.5);  
  40.     }  
  41. }  

 

3  产生刀锋函数,主要是根据pBegin和pEnd两个点计算旋转角度,简单的数学应用;以前不知道学数学干嘛,现在知道了;

 

[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. cc.MySprite.createFlash = function (node, name, pBegin, pEnd)  
  2. {  
  3.     var flash = cc.MySprite.create(node, name, pEnd, 3000);  
  4.     var ratio = (pEnd.y - pBegin.y) / (pEnd.x - pBegin.x);  
  5.     var angle = (Math.atan(ratio) / (Math.PI)) * 180;  
  6.     flash.setRotation(-angle);  
  7.     flash.setScale(0.5);  
  8.     flash.runAction(cc.Sequence.create(cc.DelayTime.create(0.2), cc.CleanUp.create(flash)));  
  9.     return flash;  
  10. };  



 

 

4 进入主场景MainLayer,需要每隔一段时间产生向上抛的水果newFruit;

#从水果数组里面随机取一个水果getRandom(FRUIT_DATA.length)

#创建水果精灵,初识位置 x随机取,y的话在屏幕下方-100,fruit.setPosition(cc.p(x, -100));;

#设置水果的各种属性zorder,num等;

#创建一个贝塞尔曲线控制数组,有三个点,决定一条曲线var controlPoints = [
        cc.p(x, -100),
        cc.p(x - offSetX, topY),
        cc.p(x - offSetX * 2, -100)
    ]; 又是数学的应用;

#让水果同时实现贝塞尔曲线动画和旋转动画

#水果数组添加该水果,主要用于后面的水果切除检测 this.fruitList.push(fruit);

#播放抛出音效;

 

[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. MainLayer.prototype.newFruit = function ()  
  2. {  
  3.     //create new fruit per 0.5s  
  4.     var random = getRandom(FRUIT_DATA.length);  
  5.     var data = FRUIT_DATA[random];  
  6.     var fruit = cc.Sprite.createWithSpriteFrameName(data.fruitImage);  
  7.     var x = 300 + getRandomOffset(200);  
  8.     fruit.setPosition(cc.p(x, -100));  
  9.     fruit.setAnchorPoint(cc.p(0.5, 0.5));  
  10.     this.fruitZOrder -= 1;  
  11.     fruit.setZOrder(this.fruitZOrder);  
  12.     fruit.cleanuped = false;  
  13.     fruit.num = data.num;  
  14.     var offSetX = getRandomOffset(100);  
  15.     var topY = 900 + getRandom(100);  
  16.     var controlPoints = [  
  17.         cc.p(x, -100),  
  18.         cc.p(x - offSetX, topY),  
  19.         cc.p(x - offSetX * 2, -100)  
  20.     ];  
  21.     var fruitTime = 3;  
  22.     var bezier = cc.BezierTo.create(fruitTime, controlPoints);  
  23.     var action2 = cc.RotateBy.create(fruitTime, getRandom(360));  
  24.     var upActions = cc.Spawn.create(cc.Sequence.create(bezier, cc.CleanUp.create(fruit)), action2);  
  25.     fruit.runAction(upActions);  
  26.     this.rootNode.addChild(fruit);  
  27.     this.fruitList.push(fruit);  
  28.     cc.AudioEngine.getInstance().playEffect(FRUIT_SOUNDS.throwfalse);  
  29. };  

 

5 每隔一段时间抛出一个newFruit,只要在update更新函数里面编写就行;

如果当前时间距离上一个水果产生时间为0.5s,就又产生一个,周次循环,不断产生水果

 

[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. if (this.currentTime - this.lastFruitTime > 0.5) {  
  2.         this.newFruit();  
  3.         this.lastFruitTime = this.currentTime;  
  4.     }  


上篇就这些,over;

 

 

 

 

 
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/

分享到:
评论

相关推荐

    Fruit Ninja水果忍者VR.apk(oculus quest 游戏)

    Fruit Ninja水果忍者VR.apk(oculus quest 游戏) 这个就不用多介绍了吧,喜欢玩的自然就喜欢,在VR的世界里挥动双刀切水果。 送给正在研究安卓开发的朋友们做参考。

    水果忍者-Fruit Ninja.zipscratch2.0 3.0编程项目源文件源码经典游戏案例素材源代码

    水果忍者-Fruit Ninja.zipscratch2.0 3.0编程项目源文件源码经典游戏案例素材源代码水果忍者-Fruit Ninja.zipscratch2.0 3.0编程项目源文件源码经典游戏案例素材源代码水果忍者-Fruit Ninja.zipscratch2.0 3.0编程...

    国外的fruit ninja 水果忍者 项目

    “水果忍者”(Fruit Ninja)是一款在全球范围内广受欢迎的休闲游戏,以其独特的切割水果的游戏玩法和精美的视觉效果吸引了无数玩家。在这个项目中,我们关注的是由Unity引擎开发的国外版本。Unity是一款强大的跨...

    fruit ninja代码仿水果忍者代码

    《水果忍者代码详解:基于Cocos2d的编程实践》 "水果忍者"是一款深受全球玩家喜爱的休闲游戏,其独特的切水果玩法和精美的画面设计,使其成为移动平台上的经典之作。本篇文章将深入探讨如何使用Cocos2d引擎来仿制...

    html5 水果忍者 源代码

    在这个"html5 水果忍者 源代码"项目中,我们可以深入理解HTML5在游戏开发中的应用。 首先,让我们谈谈HTML5的核心优势。HTML5引入了许多新元素,如`&lt;canvas&gt;`,它为动态图形和交互式内容提供了画布。在水果忍者这样...

    fruit-ninja-master

    标题中的"fruit-ninja-master"指的是一个开源项目,它可能是《水果忍者》游戏的源代码仓库。《水果忍者》是一款在全球范围内广受欢迎的休闲切水果游戏,由Halfbrick Studios开发。通过分析这个项目的源码,我们可以...

    scratch编程项目源代码文件案例素材-水果忍者-Fruit Ninja.zip

    《Scratch编程项目:深入解析“水果忍者”游戏源代码》 Scratch,这款由麻省理工学院(MIT)的“终身幼儿园团队”开发的图形化编程工具,以其直观易懂的界面和丰富的创意潜力,深受全球少儿编程教育者的喜爱。本案例...

    水果忍者HTML5代码,可进行二次开发

    总结来说,“水果忍者HTML5代码”为开发者提供了一个可直接使用的框架,通过深入学习和二次开发,我们可以创建出更多有趣的HTML5游戏,进一步拓展游戏的边界。无论是对新手学习游戏开发,还是对资深开发者寻找灵感,...

    水果忍者游戏JQ代码

    【压缩包子文件的文件名称列表】"html5-fruit-ninja"可能是一个包含所有游戏源代码和资源文件的文件夹,比如HTML文件、CSS样式表、JavaScript脚本、图片资源等。这些文件共同构成了一个完整的HTML5游戏项目。 接...

    HTML5水果忍者源代码 v1.0

    在"HTML5水果忍者源代码 v1.0"这个项目中,开发者使用HTML5技术构建了一个流行的移动游戏——水果忍者的网页版。这款游戏以其简单易玩、刺激的切割体验深受玩家喜爱。 HTML5的核心优势在于其对多媒体的支持,它内置...

    水果忍者HTML5简易版

    《水果忍者HTML5简易版》是一款基于HTML5技术开发的轻量级游戏,它以其小巧的体积(仅几MB)和对多种浏览器的良好兼容...通过分析和研究这款游戏的源代码,我们可以深入理解HTML5的实战应用,提升自己的前端开发技能。

    水果忍者HTML5

    关于文件"ChineseDron-fruit-ninja-7d1960f",这很可能是游戏源代码的版本控制标识。"ChineseDron"可能是开发团队的名字或者是项目代号,"fruit-ninja"揭示了游戏的主题,而"7d1960f"则可能是一个Git或SVN的版本哈希...

    水果忍者网页版源代码

    【水果忍者网页版源代码】是一个开源项目,旨在提供一个与知名手机游戏"水果忍者"相似的在线体验。这个项目的源代码分享是出于学习和交流的目的,让更多的人能够了解游戏开发的基本流程和技术。 首先,我们要理解的...

    scratch Fruit Ninja 游戏

    scratch Fruit Ninja 游戏,用scratch图形化平台编辑。

    fruit-ninja-master_ninja_fruit_planthw6_

    《水果忍者(Fruit Ninja)游戏源代码解析》 在IT行业中,游戏开发一直是一项充满挑战和趣味性的任务,而《水果忍者》作为一款备受欢迎的休闲游戏,其背后的编程逻辑和技术实现自然引起了众多开发者的好奇。本文将...

    水果忍者 Fruit Ninja for Windows Phone 7

    Windows Phone 7上的水果忍者。 XAP包。部署到手机上即可使用。

    fruit_ninja

    水果忍者 风靡iphone android版

    【RAR】水果忍者源码

    通过分析“水果忍者”的源码,我们可以了解到游戏是如何实现动态水果生成、刀片轨迹计算、分数统计等关键功能的。源代码中的每一行都可能隐藏着开发者的心血与智慧,它们构成了游戏的灵魂,让玩家在指尖舞动间体验到...

    HTML5水果忍者源码压缩包.zip

    "HTML5水果忍者源码压缩包.zip"是一个包含HTML5版本的“水果忍者”游戏源代码的压缩文件,这对于学习和理解HTML5游戏开发的开发者来说是一个宝贵的学习资源。 "水果忍者"是一款广受欢迎的休闲游戏,玩家通过滑动...

    水果忍者网页版,js+css+html

    水果忍者网页版,js+css+html 《水果忍者》当人们打开游戏的时候,看到水果图标很自然就会去点击,但是会看到手指划过的提示,于是就会很自然的采用划过的手势去点击图标,并且会把这种交互方式延续到游戏中。

Global site tag (gtag.js) - Google Analytics