美高梅4688.com打支付的2D手游工具 (转)

前言:
近闲来无事,而且为是以巧接触安卓不久,所以萌生了今后当出web
项目的长河中相同开发安卓手游,因眼前一段时间项目用单独完成了同等暂缓功能型手机app
,该App比较简单,全是按钮操作,也便是Activity之间的并行传值与对接,所以针对安卓的基本知识有了定了解,在自我之记忆当中,感觉安卓手游是比
较困难的,但是来紧且克服,所以有了付出娱乐的意念。

打开发之2D手游工具   

 

 

        全球手游行业层面以突破250亿美元,越来越多之开发者开始进入手游研发领域,而作一如既往号称菜鸟,很多时分,如果没其他开发者的提议,会移动多转。独立工作室Sheado.net公司的Chad
Ata在博客中享受了她们由平开始进入手游研发到现在季年差不多吧积攒之经历,希望可以叫新入行者提供有增援。

  以下为译文:

  同开始进入游戏研发领域的上,你大为难掌握该选择什么工具、什么程序语言以及哪些框架,你晤面面临巨额之选和建议,我同本人之团队总能够觉察另外娱乐公司的更是行之,所以这边提供一些咱们的涉,希望吃做手游的新手们有的协助。

  初入手游行业

  虽然于其它行当发生过10大多年的编程和策划经验,但当我开始做手游研发的时,依然觉得好是同等只菜鸟。我们的率先独游戏Furdiburb(宠物冒险游戏)最初是以2009年开研发的,当时凡是特意为Android而召开的。对于毫无游戏研发经验的我们来说,Java是绝无仅有可用到编程语言。作为一个2D玩耍,我们大不明智之没有下OpenGL就开始进行不硬件加速图形开发。随着Furdi受到了又多人之迎,我们的打项目为取重新多之顾,最终我们遇到了性能及移植问题。如果我们以前上学了其他开发者的更,很多题目都是可完全避免的。

  找到更好之法子

  于就了Furdiburb的研发,并且使用playn缓慢的把打移植到了iOS平台之后,我们决定开始第二舒缓游戏(Eras
of
Alchemy)的研发。我们当即盼摆脱Java语言,找到可以普遍应用的跨平台研发工具,最好是未来还足以支持主机游戏平台。

  随后我们开始了追寻,我于是了濒临一个月的光阴对框架、工具及发动机进行对比,最后,我同本人之集团十分惬意新的研发方式,直到现在也甚不错。这里我未会见说胡而选这些,框架是经常变化之,一年前选择其的理由或许到今就是已不复是考虑的重大元素了。所以,这首稿子的其余部分只会针对咱摘有工具的原因展开简要的描述。以下就是我们那时挑选并对照了一个月份后的结果:

  编程

  我们所列举的且是于研发我们娱乐的当儿下的,而且只是我们做打之措施而已,很多家伙及框架的整合呢是甚健全的,需要开发者们自行发现。

  框架

  我们选择的拥有架构,要么是开源的,要么就是来开之代码。这是殊好的,因为我们于必要之时光可开展紧急修改和优化。

  Cocos2d-x:我们具有的跨平台研发都是下开源Cocos2d-x框架形成,在Eras
Of
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来说慢的可怕,但自我看来也大好用。我们之所以Eclipse做了颇具的Java和Android研发,包括适配和修复bug。Android目前当推Android
Studio而非是Eclipse,但咱从未那多的时日,也未曾呀特别之理由去更换到新的工具。

  Visual
Studio:也是单非常好之IDE,我们就此她来开左右和微软系的编程、Bug修复以及适配。

  版本控制

  即便你的集团仅仅发一个人,你吧应使本控制。所有人都见面犯错,而且其他一样不成大改都可能造成游戏神秘之凋谢。我们的社就出3单人,因此自第一龙举行手游开始,版本控制就是杀必要的。目前产生酷多之方案可以选取,但我们下的发以下几只:

  SVN:我个人爱好SVN,因为可以得有自要之功能,比如合并、同步、恢复等等,但学起来较紧。

  Git:我们下的诸多上马源框架还利用Git。我们采取Git就是为着保和框架同步,当用的当儿可以进行高效修复。

  电脑

  很显然,你做打是亟需用电脑的。最初有的研发都是以Linux机器上做到的。但我们开始了iOS平台的研发之后,用两三台电脑变得效率很低,所以我们购买了有的iMac,而且我们还大喜爱用它来开游戏研发。幸运的是,OSX的众发令和Linux相同,所以我们的博脚论都并未做变更。

  图形工具

  Adobe
CS:相信此没有人当意外,我们的美术师最常使用的是Illustrator和Photoshop。

  Spine:非常推荐者家伙制造骨骼动画,和风俗的帧到帧动画相比,骨骼动画可以节省硬盘空间,还可节约大量底研发时间,提供有力的作用,比如卡通混合、蒙皮技术同网格变形。

  Texture
Packer:你恐怕会怀念使拿图纸展开打包获得重新怪的图像为得到更好的游玩表现。我们选择Texture
Packer来就这项工作,而且我们还下它们的通令功能拓展自动化打包处理。

  关卡编辑器

  我们利用的关卡编辑工具包括:

  没有编辑器:如果得以不用吧,我们毫不会使编辑器。我们得以就此代码解决,这任起十分疯狂,而且有些浪费时间,但如果您的组织十分小的话,有时候为省时间得不要为了一次性的职责特别用代码写一个编辑器。

  定制化编辑器:有时候我们刻画了一个老大勿好用的玩内编辑器来做图形或者关卡,我的意是未经优化的,恐怕也只有我们见面这么做。

  R.U.B.E:对于咱们的产一个游乐,我们当利用R.U.B.E(Really Useful
Box2D
Editor)之前,几乎自己研发了一个玩耍内编辑器,这个深大胆的家伙节约了咱大量的时光,但万一我们决定使做关卡编辑器的话,我们亟须自己研发。

  音乐与视频

  Ffmpeg:我个人死喜爱ffmpeg,这个家伙十分好用,我们便用脚本用她将咱的视频成为各个平台要的格式。

  Cakewalk
Sonar:这是单可怜勇敢的音乐打造软件,一开始之读会较不方便。

  GArritan Personal
Orchestra:如果你想让自己的戏加盟管弦乐,Garritan可以带十分高质量的音乐,我们司空见惯与Sonar混合使用。

  Audacity:一个老大正确的视频编辑和录制工具。

  以下2独是我们早就不复行使的工具,但也许对于新手来说还是拥有推荐意义:

  Anvil
Studio:如果您熟悉乐器而且乐意学有音乐文化,并且想要召开MIDI格式的乐,这是独雅不利的软件。

  Linux Multaimedia
Studio:这是单特别不错而且简单的软件,可以打造好不错的音乐,而且未待你读书很多的乐文化。

  结论

  时做打之家伙十分多,以上的这些家伙只是我们于召开2D戏耍的时选择的工具,目前为止,我们本着这些家伙十分令人满意,我们最新的游戏发布到了iOS、Android和Windows
Phone平台。我们尚打算当生一致迟迟游戏发布的时节,用同的家伙将玩扩大至PC、Mac以及Linux平台。

 

及同样篇稿子中描绘及了飞机的发出子弹,在本文中,将持续完善代码,该代码也是最后的代码,本游戏至此开发了,游戏界面很粗,毕竟不是正经开发游
戏,而且打很多效应尚未就,比如说:随机出现一个”能量球”等等,这几天完成这小游戏,纯属炼手操作,只是达到了内部的逻辑(部分逻辑)开发,接下
来把子弹攻击飞机的代码贴上来。

 

第一修改代码:BulletRunnable.java中之run方法,增加代码:

 

这边的职能就是是判在放子弹的时光,判断该子弹的职位和飞机的位置是不是同样,相同则闹planeBoom();

Java代码  美高梅4688.com 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代码  美高梅4688.com 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代码  美高梅4688.com 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代码  美高梅4688.com 4

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

 

 

将马上点儿个特性为一致上加到PlaneRunnable.java 和MySurfaceView.java
中,同样要加入get set方法 ,

 

以PlaneRunnable.java的run方法中补充加如下代码:该代码表示,如果您决定的机让爆之后,其它飞机为要住。

 

Java代码  美高梅4688.com 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代码  美高梅4688.com 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代码  美高梅4688.com 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.    

 

 

 

从那之后,所有的代码结束,时间周期比较缺少,总共下来大概三天左右,其它力量暂时不会见展开支付,现在之达成的功能也:随机出现几乎劫持敌机,敌机会垂直下
行,并隔一段时间不鸣金收兵发射子弹,你说了算一样劫持飞机也会见笔直方向发展发射子弹,打丁敌机后,敌机会冒出BOOM字样,该架敌机消失,如果你控制的机于敌机打
中5次等,则弹有提示GAME OVER 。

发表评论

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