《飞机大战》安卓游戏开发源码(终)

前言:近日闲来无事,而且也是因为刚接触安卓不久,所以萌生了随后在开发web
项目标过程中一致开发安卓手游,因前一段时间项目必要独自完结了一款功效型手提式有线电话机app
,该App比较容易,全是按钮操作,也正是Activity之间的相互传值与对接,所以对安卓的基本知识有了迟早精通,在自家的回忆个中,感觉安卓手游是相比较困难的,然而有不便就要制服,所以有了开发娱乐的动机。

娱乐支付之2D手游工具   

 

 

        全世界手游行业层面将突破250亿美金,更加多的开发者发轫进动手游研究开发领域,而作为一名菜鸟,很多时候,假设没有任何开发者的建议,会走很多弯。独立工作室Sheado.net企业的ChadAta在博客中享受了他们从一初叶进入手游研究开发到后天四年多来说积攒的阅历,希望能够给新入行者提供部分增派。

  以下为译文:

  一初步进入娱乐研究开发领域的时候,你很难了然该选择怎样工具、什么程序语言以及怎样框架,你会见临巨大的选取和提出,作者和自笔者的团伙总能发现别的娱乐集团的经历是行得通的,所以那里提供部分大家的经验,希望给做手游的新手们有的协理。

  初动手游行业

  尽管在任何行业有过10多年的编制程序和谋划经验,但当自家起来做手游研究开发的时候,依旧认为自个儿是壹只菜鸟。大家的率先个游戏Furdiburb(宠物冒险游戏)最初是在二〇〇九年开头研究开发的,当时是专门为Android而做的。对于毫无游戏剧商量发经验的我们来说,Java是唯一可用到编制程序语言。作为八个2D娱乐,大家那个不明智的远非采取OpenGL就从头实行非硬件加速图形开发。随着Furdi受到了更三个人的欢迎,大家的游玩项目也取得更多的瞩目,最终我们相见了品质和移植难题。倘诺大家在此以前读书了其余开发者的经验,很多难点都以足以完全幸免的。

  找到更好的措施

  在成功了Furdiburb的研究开发,并且利用playn缓慢的把嬉戏移植到了iOS平台之后,大家决定先导第贰款游戏(伊拉斯of
Alchemy)的研究开发。大家立即可望摆脱Java语言,找到能够广泛使用的跨平台研究开发工具,最佳是鹏程还足以支撑主机游戏平台。

  随后大家初阶了追寻,作者用了靠近贰个月的光阴对框架、工具以及内燃机举行自己检查自纠,最终,小编和本身的团体非凡好听新的研发格局,直到将来也格外不利。那里作者不会说怎么要选取这几个,框架是日常转移的,一年前选取它的说辞大概到方今就曾经不再是考虑的重点成分了。所以,这篇文章的别的部分只会对大家挑选有些工具的缘故进行不难的叙说。以下正是大家那时候增选并相比了一个月现在的结果:

  编程

  我们所列举的都以在研究开发大家娱乐的时候利用的,而且只是大家做游戏的方法而已,很多工具和框架的组合也是可怜完美的,必要开发者们自行发现。

  框架

  大家挑选的享有架构,要么是开源的,要么正是有开放的代码。那是充裕好的,因为大家在供给的时候能够展开火急修改和优化。

  Cocos2d-x:大家拥有的跨平台研究开发都是利用开源Cocos2d-x框架形成,在ErasOf
Alchemy的研究开发进度中,大家应用了本子2,大家的下三个玩耍正在接纳的是本子3,举行了大开间的API以及质量提高。全体来说,Cocos2d-x的2D表现不行好,而且文件管理拾叁分有利。

  Spine:大家选拔Spine做了动画片,所以咱们进入了C语言为根基的Cocos2d-x插件。

  Box2D:大家还尚无发布一款利用该引擎的游乐,但大家的下一款游戏A
Quiver Of Crows将会动用,大家当下研究开发就动用了这些工具。

  SQLite:Cocos2d-x本人也提供数据存款和储蓄方案,但咱们更欣赏使用SQLite,因为它的读写速度和表现更好。

  编制程序语言

  C++:Cocos2d-x支持二种语言编制程序,但大家挑选了C++,因为大家以为日前该语言是最合适做跨平台研究开发的。

  C:你常常会想要参预一些开源的API,当中有部分正是C语言编制程序的。

  Java:大家还是亟待利用Java,但也只是在Android平台做游戏内IAP、广告以及格外系统作用的时候。语言之间的切换可以因此JNI来成功。

  Objective-C:选用它的说辞和Java一样,我们应用Objective-C是为着利用iOS系统的特定效能。

  Scripting:那包罗程序化脚本和其他脚本语言,全部的开发者们都要时时的写剧本,但我们却很少会谈论这几个标题。这些标题是相当简单的,但假使您和小编一样同时由于不常使用而不记得有些语法的话,那些工作有是这一个耗费时间间的,大家要给保卫安全代码、自动音频转换以及纹理打包写剧本。

  开发条件

  Xcode:全数人都告诉大家说Xcode十分好,所以小编进行了尝试,而且自身只好说的是,那是时下自家最欢娱的支出条件。那里小编并不想说太多具体的缘由,因为自个儿不想吸引集成开发条件(IDE)争论,大家运用Xcode做跨平台研究开发,也为苹果平台做特其余编程。

  Eclipse:对于IDE来说慢的积毁销骨,但作者看来却10分好用。大家用Eclipse做了富有的Java和Android研究开发,包罗适配和修复bug。Android近日在推Android
Studio而不是Eclipse,但我们一向不那么多的年华,也未曾怎么尤其的说辞去转换成新的工具。

  Visual
Studio:也是个要命可观的IDE,我们用它来做左右和微软有关的编制程序、Bug修复以及适配。

  版本控制

  即使你的公司唯有壹个人,你也应当采纳版本控制。全数人都会犯错,而且别的一回大改都大概导致游戏神秘的寿终正寝。我们的组织唯有三位,因而从第壹天做手游发轫,版本控制正是非凡供给的。最近有相当多的方案得以挑选,但大家运用的有以下多少个:

  SVN:作者个人喜欢SVN,因为可以成功全部笔者索要的成效,比如合并、同步、复苏等等,但上学起来相比不方便。

  Git:大家采纳的累累开源框架都施用Git。大家运用Git便是为着维持与框架同步,当要求的时候能够展开快捷修复。

  电脑

  很明显,你做游戏是亟需使用计算机的。最初全数的研究开发都以在Linux机器上完成的。但我们最先了iOS平台的研究开发之后,用两三台电脑变得功效相当低,所以大家买了有些iMac,而且大家都万分喜爱用它来做游戏研究开发。幸运的是,OSX的广大发令与Linux相同,所以我们的广大脚本都并未做变更。

  图形工具

  Adobe
CS:相信这几个从未人以为奇怪,我们的美术大师最常使用的是Illustrator和Photoshop。

  Spine:卓殊推荐那几个工具创建骨骼动画,和历史观的帧到帧动画相比较,骨骼动画能够省去硬盘空间,还是能省去多量的研究开发时间,提供强劲的效率,比如卡通混合、蒙皮技术以及网格变形。

  Texture
Packer:你恐怕会想要把图纸展开打包得到更大的图像以博得更好的游玩表现。大家选取Texture
Packer来形成那项工作,而且大家还使用它的吩咐作用举办自动化打包处理。

  关卡编辑器

  大家选拔的关卡编辑工具包含:

  没有编辑器:假使能够毫无的话,我们绝不会使用编辑器。我们得以用代码化解,那听起来特别疯狂,而且有点浪费时间,但万一你的团伙十分小的话,有时候为了节约时间能够不必为了三遍性的职责尤其用代码写八个编辑器。

  定制化编辑器:有时候大家写了1个尤其倒霉用的玩耍内编辑器来做图形恐怕关卡,小编的意趣是未经优化的,也许也唯有大家会这么做。

  帕杰罗.U.B.E:对于大家的下2个玩耍,大家在利用CRUISER.U.B.E(Really Useful
Box2D
艾德itor)从前,大概自身研究开发了二个嬉戏内编辑器,这么些特别勇敢的工具节约了我们大量的大运,但一旦咱们决定要做关卡编辑器的话,大家无法不自个儿研究开发。

  音乐和录像

  Ffmpeg:笔者个人格外欣赏ffmpeg,那么些工具12分好用,大家平时使用脚本用它把我们的录像成为各样平台必要的格式。

  Cakewalk
Sonar:那是个尤其勇敢的音乐营造软件,一开首的学习会比较不方便。

  GArritan Personal
Orchestra:假设你想给协调的嬉戏加盟管弦乐,Garritan能够带来十二分高品质的音乐,大家常见和Sonar混合使用。

  Audacity:两个十一分正确的录制编辑和摄像工具。

  以下3个是我们早就不复行使的工具,但大概对于新手来说还是具有推荐意义:

  Anvil
Studio:假使您熟练乐器而且乐意学一些音乐文化,并且想要做MIDI格式的音乐,那是个很是正确的软件。

  Linux Multaimedia
Studio:那是个可怜不错而且不难的软件,能够营造格外正确的音乐,而且不需求您读书很多的音乐文化。

  结论

  最近做游戏的工具十三分多,以上的那些工具只是大家在做2D玩耍的时候选用的工具,近来截止,大家对那一个工具拾叁分令人满足,大家最新的游戏宣布到了iOS、Android和Windows
Phone平台。大家还打算在下一款游戏公布的时候,用同一的工具把嬉戏扩大到PC、Mac以及Linux平台。

 

上一篇文章中写到了飞机的发射子弹,在本文中,将一连完善代码,该代码也是最终的代码,本游戏至此开发结束,游戏界面不会细小劣,究竟不是规范开发游
戏,而且游玩很多功能没有做到,比如说:随机出现三个”能量球”等等,这几天成功那一个小游戏,纯属炼手操作,只是达到了中间的逻辑(部分逻辑)开发,接下
来把子弹攻击飞机的代码贴上来。

 

第三修改代码:BulletRunnable.java中的run方法,扩大代码:

 

这边的成效正是判断在发出子弹的时候,判断其子弹的职务和飞机的职位是还是不是相同,相同则发出planeBoom();

Java代码  图片 1

  1. holder.unlockCanvasAndPost(canvas);  
  2.   
  3.             if (!isEnemyBullet()) {  
  4.                 bullet.setY(bullet.getY() – 70);  
  5.                 // 从全体的敌机中判断  
  6.   
  7.                 if (enemyPlanes != null && enemyPlanes.size() > 0) {  
  8.                     for (int i = 0, size = enemyPlanes.size(); i < size; i++) {  
  9.                         ImageButton enemyPlan = enemyPlanes.get(i);  
  10.   
  11.                         if (bullet.getX() > enemyPlan.getX()  
  12.                                 && bullet.getX() < (enemyPlan.getX() + planeHalfWidth * 2)  
  13.                                 && bullet.getY() > enemyPlan.getY()  
  14.                                 && bullet.getY() < (enemyPlan.getY() + planeHalfWidth * 2)) {  
  15.   
  16.                             if (emPlanes != null && emPlanes.size() > 0) {  
  17.                                 EnemyPlane plane = emPlanes.get(i);  
  18.                                 if(plane != null){  
  19.                                     plane.setLife(plane.getLife() – 1);  
  20.                                     if (emPlanes.get(i).getLife() <= 0) {  
  21.                                         planeBoom(plane,true);  
  22.                                     }  
  23.                                 }  
  24.   
  25.                             }  
  26.                             bullet.setFly(false);  
  27.                             // 子弹消失  
  28.                         }  
  29.                     }  
  30.                 }  
  31.             } else {  
  32.                 bullet.setY(bullet.getY() + 30);  
  33.                 // 此时是枪弹击中了你说了算的飞机  
  34.                 if (bullet.getX() > yourPlane.getX()  
  35.                         && bullet.getX() < (yourPlane.getX() + planeHalfWidth * 2)  
  36.                         && bullet.getY() > yourPlane.getY()  
  37.                         && bullet.getY() < (yourPlane.getY() + planeHalfWidth * 2)) {  
  38.   
  39.                       
  40.                     yourPlane.setLife(yourPlane.getLife() – 1);  
  41.   
  42.                     if (yourPlane.getLife() <= 0) {  
  43.                         // 此时您的飞行器不能够再展开发射  
  44.                         planeBoom(yourPlane,false);  
  45.                         // 发生爆炸  
  46.   
  47.                     }  
  48.                     // 子弹消失  
  49.                     bullet.setFly(false);  
  50.                     // 立马跳出  
  51.                     break;  
  52.                 }  
  53.             }  
  54.   
  55.    

 

发生planeBoom()代码:

 

 

Java代码  图片 2

  1. /** 
  2.     * 飞机爆炸效果 
  3.     */  
  4.    private void planeBoom(Plane plane,boolean isEnemy) {  
  5.   
  6.        // 证明爆炸效果  
  7.        PlaneBoomRunnable boomRunnable = new PlaneBoomRunnable(context, holder);  
  8.        boomRunnable.setPlane(plane);  
  9.        boomRunnable.setIsenemy(isEnemy);  
  10.        // 爆炸  
  11.        new Thread(boomRunnable).start();  
  12.    }  

 

 

此处新建了一个PlaneBoomRunnable .java 类,具体代码如下:

Java代码  图片 3

  1. package com.pm_road.fireair.thread;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.graphics.PorterDuff.Mode;  
  8. import android.view.SurfaceHolder;  
  9.   
  10. import com.pm_road.fireair.bean.Plane;  
  11.   
  12. /** 
  13.  * 飞机爆炸 
  14.  * @ClassName: PlaneBoomRunnable 
  15.  * @Description: 飞机爆炸效果 
  16.  * @author lipeng 
  17.  * @date 2014-11-11 上午11:27:01 
  18.  * 
  19.  */  
  20. public class PlaneBoomRunnable implements Runnable{  
  21.       
  22.     //飞机爆炸中的plane  
  23.     private Plane plane;  
  24.     //上下文  
  25.     private Context context;  
  26.     //  
  27.     private SurfaceHolder holder;  
  28.       
  29.     private Boolean isenemy;  
  30.     public PlaneBoomRunnable(Context context, SurfaceHolder holder) {  
  31.         super();  
  32.           
  33.         this.context = context;  
  34.         this.holder = holder;  
  35.     }  
  36.   
  37.     @Override  
  38.     public void run() {  
  39.           
  40.         Canvas canvas = holder.lockCanvas();  
  41.         canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);  
  42.   
  43.         Paint paint = new Paint();  
  44.         paint.setColor(Color.BLUE);  
  45.         canvas.drawText(“BOOM”, plane.getX(), plane.getY(), paint);  
  46.         canvas.drawText(“BOOM”, plane.getX()+5, plane.getY()+5, paint);  
  47.         canvas.drawText(“BOOM”, plane.getX()+10, plane.getY()+10, paint);  
  48.         canvas.drawText(“BOOM”, plane.getX()+15, plane.getY()+15, paint);  
  49.         holder.unlockCanvasAndPost(canvas);  
  50.         plane.setShot(false);  
  51.           
  52.     }  
  53.   
  54.     public Plane getPlane() {  
  55.         return plane;  
  56.     }  
  57.   
  58.     public void setPlane(Plane plane) {  
  59.         this.plane = plane;  
  60.     }  
  61.   
  62.     public Boolean getIsenemy() {  
  63.         return isenemy;  
  64.     }  
  65.   
  66.     public void setIsenemy(Boolean isenemy) {  
  67.         this.isenemy = isenemy;  
  68.     }  
  69.       
  70. }  

 

 

 

此时,在BulletRunnable.java中不够八个天性:

 

Java代码  图片 4

  1. private List<ImageButton> enemyPlanes;  
  2. private List<EnemyPlane> emPlanes;  

 

 

将那七个属性也一律添加至PlaneRunnable.java 和MySurfaceView.java
中,同样要进入get set方法 ,

 

在PlaneRunnable.java的run方法中添加如下代码:该代码表示,就算您说了算的飞行器被炸掉之后,其它飞机也要结束。

 

Java代码  图片 5

  1. // 发射子弹  
  2.             if(yourPlane.isShot()){  
  3.                 shotOneBullet();  
  4.             }else{  
  5.                 //假设你说了算的飞行器,结束射击了,全数的飞机也要停止  
  6.                 plane.setShot(false);  
  7.                 Message msg = handler.obtainMessage();  
  8.                 msg.arg1 = 2;  
  9.                 handler.sendMessage(msg);  
  10.             }  

 
在该办法的最上边加上,通告主UI,更新飞机爆炸

 

Java代码  图片 6

  1. if (isEnemyPlane()) {  
  2.             Message msg = handler.obtainMessage();  
  3.             msg.arg1 = 3;  
  4.             msg.obj = enemyPlaneImg;  
  5.             msg.arg2 = (int) plane.getY();  
  6.             handler.sendMessage(msg);  
  7.             plane = null;  
  8.         }     

 

 

在MainActivity.java,的handler中增添判断方法:

 

Java代码  图片 7

  1. case 3:  
  2.                 ImageButton enemyImg = (ImageButton) msg.obj;  
  3.                 enemyImg.setVisibility(View.GONE);  
  4.                 enemyImg.setX(0);  
  5.                 enemyImg.setY(0);  
  6.                 break;  
  7.   
  8.    

 

 

 

迄今甘休,全数的代码截至,时间周期比较短,总共下来大概1日左右,其余功用最近不会进行支付,未来的高达的效果为:随机出现几架敌机,敌机会垂直运行,并隔一段时间不停发射子弹,你说了算一架飞机也会笔直方向提升发射子弹,打中敌机后,敌机会晤世BOOM字样,该架敌机消失,即使你说了算的飞机让敌机打
中五次,则弹出提醒GAME OVE库罗德 。

发表评论

电子邮件地址不会被公开。 必填项已用*标注