本文章属于原创性文章,珍惜他人劳动成果,转载请注明出处: http://www.pm-road.com/index.php/2014/11/06/169/
前言:最 近闲来无事,而且也是因为刚接触安卓不久,所以萌生了以后在开发web 项目的过程中同样开发安卓手游,因前一段时间项目需要独立完成了一款功能型手机app ,该App比较简单,全是按钮操作,也就是Activity之间的相互传值与过渡,所以对安卓的基本知识有了一定了解,在我的印象当中,感觉安卓手游是比 较困难的,但是有困难就要克服,所以有了开发游戏的念头。
在安卓游戏开发源码(三)中,已经把控制的飞机显示出来,结果如下:
接下来,就要把敌人的战机也开发出来,并可以向下发射子弹。
在上一次的代码中,找到MainActivity.java文件,在其属性中添加:一个新的属性:
// 敌机的图片 private List<ImageButton> enemyPlanes;
在initView()方法中,添加一个新的方法,用来初始化敌机
//初始化敌机 initEnemyPlane();
然后把这个方法声明出来:
/** * 初始化敌机 */ private void initEnemyPlane(){ // 生成敌机数量,这里在Util中新增了一个方法 int enemyCount = CommonUtil.getEnemyPlaneCount(); enemyPlanes = new ArrayList<ImageButton>(); for (int i = 0; i < enemyCount; i++) { ImageButton enemyPlaneImg = new ImageButton(context); enemyPlaneImg.setBackgroundResource(R.drawable.enemyplane); //敌机的横坐标也是随机的 int x = new Random().nextInt(windowWidth); enemyPlaneImg.setX(x); enemyPlaneImg.setY(0); this.addContentView(enemyPlaneImg, new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); enemyPlanes.add(enemyPlaneImg); } }
在commonUtil.java中增加新的属性和方法,用来随机得到敌机数量
/** 出现最大的战机数 */ public static final int MAX_ENEMY_PLANE = 4; /** * 随机得到飞机的数量 * @return */ public static final int getEnemyPlaneCount(){ Random random = new Random(); //随机出现战机的数量 int enemyPlaneCount = random.nextInt(CommonUtil.MAX_ENEMY_PLANE); //如果随机的数量是0 ,则一直循环,直到非0 while(enemyPlaneCount == 0){ enemyPlaneCount = random.nextInt(CommonUtil.MAX_ENEMY_PLANE); } return enemyPlaneCount; }
至此,在页面展示出来之后,敌机也一些展示了出来。接下来我们要做的便是使敌机发射子弹。
在MainActivity.java中找到initBean方法,在方法中添加:如下代码,作用就是把敌机的图片set到surfaceView界面中
// 所有敌机 surfaceView.setEnemyPlanes(enemyPlanes); surfaceView.setWindowHeight(windowHeight); surfaceView.setWindowWidth(windowWidth);
打开MySurfaceView.java类,在其中添加属性: 为其增加get set 方法
// 敌机的图片 private List<ImageButton> enemyPlanes; public List<ImageButton> getEnemyPlanes() { return enemyPlanes; } public void setEnemyPlanes(List<ImageButton> enemyPlanes) { this.enemyPlanes = enemyPlanes; }
在MySurfaceView.java 中的threadRun 方法中新增一个方法:enemyPlaneShot()如:
/** * 执行线程 */ private void threadRun() { // 你控制的飞机发射 planeShot(yourPlane, false,null); Log.i(CommonUtil.VIEW_TAG, “控制的飞机射击”); // 敌人的飞机开火 enemyPlaneShot(); }
增加enemyPlaneShot ()方法
/** * 敌人的战机开始 */ private void enemyPlaneShot() { for (int i = 0,size = enemyPlanes.size(); i < size; i++) { EnemyPlane enemyPlane = new EnemyPlane(); enemyPlane.setShot(true); enemyPlane.setLife(CommonUtil.ENEMY_PLAN_LIFE); // 敌机的位置随机出现横坐标 enemyPlane.setX(enemyPlanes.get(i).getX()); enemyPlane.setY(enemyPlanes.get(i).getY()); // 敌机图片 enemyPlane.setSrcPic(R.drawable.myplane); // 敌人的飞机发射 ,该方法原来不是这样的,已经新增了参数 planeShot(enemyPlane, true,enemyPlanes.get(i)); } }
更改以后的planeShot 方法:
/** * 飞机发射 * * @param plane * @param imageButton 敌机的图片 */ private void planeShot(Plane plane, boolean isEnemyPlane, ImageButton enemyPlanImg) { // 控制飞机线程 planeRunnable = new PlaneRunnable(context, holder); // 将控制的飞机绑定到该线程中 planeRunnable.setPlane(plane); // 屏幕高度 planeRunnable.setWindowHeight(windowHeight); planeRunnable.setWindowWidth(windowWidth); planeRunnable .setPlaneImg(getResources().getDrawable(plane.getSrcPic())); planeRunnable.setEnemyPlanes(enemyPlanImg); planeRunnable.setHandler(handler); // 是否为敌机 planeRunnable.setEnemyPlane(isEnemyPlane); shotThread = new Thread(planeRunnable); // 控制的飞机 开始射击 shotThread.start(); }
到现在,PlaneRunnable 中也要增加其它的方法和变量,否则程序一直是报错状态
打开PlaneRunnable.java,在里面加入新的属性:
private boolean enemyPlane = false;// 是否为敌机 // 窗口的大小 private int windowHeight; private int windowWidth; // 敌机的图片 private ImageButton enemyPlaneImg; private Handler handler;
然后将run方法重新判断,使敌机和你控制的飞机区分开来:
@Override public void run() { Canvas canvas = null; while (plane.isShot()) { canvas = holder.lockCanvas(); canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR); Paint paint = new Paint(); paint.setColor(Color.BLUE); // 如果为敌机,则这架飞机应该往下走,把敌机画出 if (isEnemyPlane()) { canvas.drawText(CommonUtil.BULLET, plane.getX() + planeHalfWidth, plane.getY()+planeImg.getIntrinsicHeight(), paint); plane.setY(plane.getY() + 10); // 这里这么直接写会报错,线程非安全,原因是不能在子线程中直接更新UI // enemyPlaneImg.setY(plane.getY()); Message msg = handler.obtainMessage(); msg.arg1 = 1; msg.obj = enemyPlaneImg; msg.arg2 = (int) plane.getY(); handler.sendMessage(msg); } else { canvas.drawText(CommonUtil.BULLET, plane.getX() + planeHalfWidth, plane.getY(), paint); } holder.unlockCanvasAndPost(canvas); // 发射子弹 shotOneBullet(); // 如果敌机飞到了最下面,那该线程停止射击 if (plane.getY() >= windowHeight) { plane.setShot(false); break; } try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } Log.i(CommonUtil.THREAD_TAG, “plane停止射击”); }
在BulletRunnable.java中,也要增加相应的属性:
private boolean enemyBullet = false; // 窗口的大小 private int windowHeight; private int windowWidth;
然后修改run方法,这样做的目的只是为了方便区分敌机和你控制的飞机,以及它们发射的子弹:
@Override public void run() { Canvas canvas = null; while (bullet.isFly()) { canvas = holder.lockCanvas(); canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR); Paint paint = new Paint(); paint.setColor(Color.BLUE); // 判断是敌机还是我方战机 if (!isEnemyBullet()) { // 我方战机子弹往上走 canvas.drawText(CommonUtil.BULLET, bullet.getX(), bullet.getY() – 70, paint); } else { // 敌方战机子弹往下走 canvas.drawText(CommonUtil.BULLET, bullet.getX(), bullet.getY() + 30, paint); } holder.unlockCanvasAndPost(canvas); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } if (!isEnemyBullet()) { bullet.setY(bullet.getY() – 70); } else { bullet.setY(bullet.getY() + 30); } if (bullet.getY() <= 0) { // 如果当前线程的Y超过了屏幕,则将该线程回收 bullet.setFly(false); // 爆炸效果 boom(); break; } if (bullet.getY() >= windowHeight) { // 如果子弹的Y超过了屏幕底部,则将该线程回收 bullet.setFly(false); break; } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } Log.i(CommonUtil.THREAD_TAG, “子弹飞行中”); } Log.i(CommonUtil.THREAD_TAG, “子弹线程结束”); }
到目前为止,程序已经可以有敌机、你控制的飞机,所有的飞机都在发射子弹(只不过子弹碰到飞机之后,不会爆炸,而且敌机的移动不是很流畅,还有很多问题需要修改,下次游戏代码:《飞机大战》安卓游戏开发源码(终)),现在效果图如下:
本文章属于原创性文章,珍惜他人劳动成果,转载请注明出处: http://www.pm-road.com/index.php/2014/11/06/169/
相关推荐
基于Android Studio游戏开发 飞飞机大战小游戏源码,可暂停、继续游戏、开关背景音乐等功能。 成功运行
Android游戏源码 简单的飞机大战游戏源码 Android 游戏开发
基于java的飞机大战小游戏
飞机战斗游戏源码,这是某书籍的源码,包含了一个游戏的完整流程, 相比更容易看懂和上手。 建议开发童鞋使用统一开发环境UDE来进行查看、调试、开发~~~统一开发环境是一款HTML5跨平台一站式应用开发、调试和部署...
本项目是一个基于Cocos2dx开发的飞机大战安卓小游戏项目源码,图片素材取自微信飞机大战。本游戏的玩法与微信飞机大战相同。项目有简单的英文注释需要的朋友可以自己下载研究一下。
这是一款简单的类似全民飞机大战的安卓游戏,有兴趣可以下载看看!
java版飞机大战源码 Android 学习资料收集 收集整理这份资料灵感来自于 , 征得同意引用了该资料的开头描述 收集整理这份资料主要帮助初学者学习 Android 开发, 希望能快速帮助到他们快速入门, 找到适合自己学习资料,...
egret白鹭游戏引擎的飞机大战源码,基于TYPESCRIPT开发,属于H5游戏,可以跨平台发布到安卓、IOS等,是个比较简单的DEMO,运行时注意保持引擎版本与游戏版本一致2.5.x的,egret兼容性比较差,编辑器我用的也是2.5的...
安卓飞机大战源码,面向对象思想,多线程,包含注释. 最近闲来无事看看安卓的api做一个飞机大战. 如有转发需声明作者:吴年和. 本代码无偿开源. 图片与声音我就不提供了. package com.example.planebigwar.entity; ...
本源码为基于Java的安卓飞机大战游戏设计,共包含135个文件,其中png文件43个,class文件30个,xml文件18个,java文件18个,mp3文件5个,gif文件4个,jar文件3个,apk文件2个,jpg文件2个,classpath文件1个。...
借用雷霆战机素材开发,有2种主机,3种副武器,3种僚机,副武器为机关枪,跟踪弹,定向离子炮,僚机为穿甲弹,爆破弹,散弹,3种装甲(影响生命值),关卡模式为3关,无限模式未开放,源码仅供参考,开发环境为eclipse+安卓5.0,基于...
本项目是一个基于Cocos2dx开发的飞机大战安卓小游戏项目源码,图片素材取自微信飞机大战。本站之前也介绍过一个飞机大战的源码http://www./source/5059.html,不过那个没有使用任何第三方的东西,本游戏的玩法与微信...
Android 飞机大战
本人刚学习Android游戏开发,自己做了个非常简单的小游戏(注:不是打飞机,而是飞机躲避子弹),由于本人刚学习,所以画面做的有些粗糙,希望大家见谅。 本资源包括源码,PPT,APK,安装部署文件
看上去资源文件完整,代码写于2016年7月,里面有大量游戏编写的技巧,代码中都有丰富注释,可为由Java转向Android开发的新手提供有力的参考范例,本代码是达内课堂的一个源代码,有环境的可顺利编译运行。
本项目是一个基于Cocos2dx开发的飞机大战安卓小游戏项目源码,图片素材取自微信飞机大战。
飞机大战游戏java源码 PlaneGame 飞机大战游戏:主要演示Kotlin语言环境下的SurfaceView+多线程并发操作 现在手机上的游戏无论大小都用游戏引擎开发了,毕竟游戏开发和应用开发是两个领域,所涉及的技术栈和专业知识...
飞机大战游戏java源码 使用 Android Stduio 3.5 开发的,安卓打飞机游戏 素材来源于网上,算法原创 由于本人不喜欢用 java Bean 那种方式,所以属性全定义为 public ,代码别具一格。重用性,逻辑性强。 更新说明 1...
Unity游戏项目源码太空银河飞机大战Space Squadron - Galaxy Shooter 支持Unity5.6及以上 你是太空射击游戏的粉丝吗?看看《太空中队: 银河射手》吧,终极的天空之力游戏。你们的任务是在银河系中令人震惊的地方进行...
这是一款刺激的类似宇宙大战的游戏,发炮弹攻击的游戏,android飞机飞行躲避攻击、并攻击敌机的一种游戏,控制方法:通过上下左右键控制飞机的移动、通过手机的A键发射炮弹。这个游戏代码写的相当不错,特别是对于...