本文章属于原创性文章,珍惜他人劳动成果,转载请注明出处:http://www.pm-road.com/index.php/2014/11/06/161/
前言:最 近闲来无事,而且也是因为刚接触安卓不久,所以萌生了以后在开发web 项目的过程中同样开发安卓手游,因前一段时间项目需要独立完成了一款功能型手机app ,该App比较简单,全是按钮操作,也就是Activity之间的相互传值与过渡,所以对安卓的基本知识有了一定了解,在我的印象当中,感觉安卓手游是比 较困难的,但是有困难就要克服,所以有了开发游戏的念头。
接着上一篇文章,把实体类和线程实体类创建之后,我们把代码和安卓的xml进行整合一下:目前涉及的只有一个MainActivity.java和一个MySurfaceView类,layout 中的xml 目前只一个activity_main.xml 文件
按照安卓开发流程,先把MainActivity.java中的代码补充一下,首先在这个activity中应该有你控制的飞机实体类,还有 MySurfaceView这个类,考虑到可能需要屏幕的高度和宽度,所以还应该有两个属性,一个宽度,一个高度:,以下是代码:但是此activity 继承了一个BaseActivity(该类没有做一些具体操作,只是在创建activity的时候,把屏幕全屏化)
package com.pm_road.fireair.base; import android.app.Activity; import android.os.Bundle; import android.view.Window; import android.view.WindowManager.LayoutParams; /** * * @ClassName: BaseActivity * @Description: 基类 * @author lipeng * @date 2014-11-4 上午10:46:01 * */ public class BaseActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 将游戏界面设置为全屏 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(LayoutParams.FLAG_FULLSCREEN, LayoutParams.FLAG_FULLSCREEN); } }
以下是主界面代码:
package com.pm_road.fireair; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup.LayoutParams; import android.widget.ImageButton; import com.pm_road.fireair.base.BaseActivity; import com.pm_road.fireair.bean.YourPlane; import com.pm_road.fireair.common.CommonUtil; import com.pm_road.fireair.view.MySurfaceView; /** * * @ClassName: MainActivity * @Description: 空中大战进口页面 * @author lipeng * @date 2014-11-4 上午10:42:51 * */ public class MainActivity extends BaseActivity { // private WelcomeView welcomeView;// 欢迎页面 //这里要解释一下原因:这里定义了一个飞机图片,和一个飞机实体类,目的是把飞机的图片和实体类进行了分离,在界面上移动飞机的时候//只是移动 了该图片,并未移动飞机,只是在移动图片的过程中,会把飞机图片的xY坐标赋值给飞机实体类,(这里的飞机实体类是不可见///的,只是和图片进行绑定, 获取坐标而已) // 飞机图片 private ImageButton yourPlanImg; // 控制的飞机实体 private YourPlane yourPlane; private MySurfaceView surfaceView; // 上下文 private Context context; private int windowHeight; private int windowWidth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); context = this; setContentView(R.layout.activity_main); /** 初始化页面 */ initView(); /** 初始化实体类 */ initBean(); /** 增加事件 */ initListener(); /** 初始化子视图类 */ initSubView(); } /** * 初始化子视图 */ private void initSubView() { this.addContentView(surfaceView, new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); Log.i(CommonUtil.TAG, “初始化子视图”); } /** * 初始化实体类 */ private void initBean() { yourPlane = new YourPlane(); yourPlane.setLife(CommonUtil.YOUR_PLAN_LIFE); yourPlane.setShot(true); /** 将飞机的位置设置和图标相同 */ setPlanPosition(yourPlanImg); // 初始化surfaceView surfaceView = new MySurfaceView(context); // 将其置顶 surfaceView.setZOrderOnTop(true); // 控制的飞机 surfaceView.setYourPlane(yourPlane); surfaceView.setYourPlaneImg(yourPlanImg); Log.i(CommonUtil.TAG, “初始化实体类”); } /** * 设置飞机的位置 * * @param view */ private void setPlanPosition(View view) { yourPlane.setX(view.getX()); yourPlane.setY(view.getY()); Log.i(CommonUtil.TAG, “控制的飞机坐标X:” + view.getX() + “;Y:” + view.getY()); } /** * 初始化绑定事件 */ private void initListener() { // 飞机绑定事件 yourPlanImg.setOnTouchListener(new YourPlaneTouch()); Log.i(CommonUtil.TAG, “控制的飞机绑定移动事件”); } /** * 初始化View */ private void initView() { // 初始化飞机图片,这里涉及一个飞机图片,这个图片随便在网上找一个类似的小飞机就可以,这里我就不上传了。 yourPlanImg = (ImageButton) findViewById(R.id.yourplane); // 得到屏幕高度 windowHeight = getResources().getDisplayMetrics().heightPixels; windowWidth = getResources().getDisplayMetrics().widthPixels; Log.i(CommonUtil.TAG, “初始化view”); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //退出按钮 if ((keyCode == KeyEvent.KEYCODE_BACK)) { Dialog alert = new AlertDialog.Builder(context).setTitle(R.string.exit) .setMessage(R.string.sureexit).setPositiveButton(R.string.sure,new ExitListener()) .setNeutralButton(R.string.cancel, null).create(); // 点击周边,不关闭提示框 alert.setCanceledOnTouchOutside(false); alert.show(); } return super.onKeyDown(keyCode, event); } class ExitListener implements OnClickListener{ @Override public void onClick(DialogInterface dialog, int which) { //退出程序之前,将飞机停止射击 yourPlane.setShot(false); finish(); } } /** * * @ClassName: YourPlaneTouch * @Description: 飞机绑定事件 * @author liPeng * @date 2014-11-5 上午11:23:25 * */ class YourPlaneTouch implements OnTouchListener { int lastX, lastY; @Override public boolean onTouch(View v, MotionEvent event) { int eventAction = event.getAction(); switch (eventAction) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; case MotionEvent.ACTION_MOVE: int dx = (int) event.getRawX() – lastX; int dy = (int) event.getRawY() – lastY; int left = v.getLeft() + dx; int top = v.getTop() + dy; int right = v.getRight() + dx; int bottom = v.getBottom() + dy; //在这里进行判断是防止飞机在托动过程中超出屏幕的范围 if (left < 0) { left = 0; right = left + v.getWidth(); } if (right > windowWidth) { right = windowWidth; left = right – v.getWidth(); } if (top < 0) { top = 0; bottom = top + v.getHeight(); } if (bottom > windowHeight) { bottom = windowHeight; top = bottom – v.getHeight(); } v.layout(left, top, right, bottom); lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); /** 将飞机的位置设置和图标相同 */ setPlanPosition(v); v.postInvalidate(); break; case MotionEvent.ACTION_UP: break; } return false; } } }
以下是surfaceView 的代码:该代码做了一个桥梁的作用,用来搭建xml 和线程之间的功能 。
package com.pm_road.fireair.view; import android.content.Context; import android.graphics.PixelFormat; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; import android.widget.ImageButton; import com.pm_road.fireair.bean.YourPlane; import com.pm_road.fireair.common.CommonUtil; import com.pm_road.fireair.thread.PlaneRunnable; public class MySurfaceView extends SurfaceView implements Callback { // 上下文 private Context context; // 控制的飞机 private YourPlane yourPlane; private ImageButton yourPlaneImg; // 飞机Runnable private PlaneRunnable planeRunnable; // 飞机线程 private Thread shotThread; private SurfaceHolder holder; public MySurfaceView(Context context) { super(context); this.context = context; holder = getHolder(); holder.addCallback(this); // 设置透明度 holder.setFormat(PixelFormat.TRANSLUCENT); } /** * 执行线程 */ private void threadRun() { // 控制飞机线程 planeRunnable = new PlaneRunnable(context,holder); //将控制的飞机绑定到该线程中 planeRunnable.setPlane(yourPlane); planeRunnable.setPlaneImg(yourPlaneImg); shotThread = new Thread(planeRunnable); //控制的飞机 开始射击 shotThread.start(); Log.i(CommonUtil.VIEW_TAG, “控制的飞机射击”); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceCreated(SurfaceHolder holder) { /** 启动线程 */ threadRun(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (shotThread != null && shotThread.isAlive()) { try { // 当绘图线程结束后自动销毁 shotThread.join(); Log.i(CommonUtil.VIEW_TAG, “射击线程destroy”); } catch (InterruptedException e) { e.printStackTrace(); } } } public YourPlane getYourPlane() { return yourPlane; } public void setYourPlane(YourPlane yourPlane) { this.yourPlane = yourPlane; } public ImageButton getYourPlaneImg() { return yourPlaneImg; } public void setYourPlaneImg(ImageButton yourPlaneImg) { this.yourPlaneImg = yourPlaneImg; } } 在activity中涉及了一个Util工具类:代码如下:主要用来定义一些常量 package com.pm_road.fireair.common; public class CommonUtil { /** 飞机生命 */ public static final int YOUR_PLAN_LIFE = 5; /** 敌机生命 */ public static final int ENEMY_PLAN_LIFE = 5; public static final String TAG = “com.pm_road.fireair.mainActivity”; public static final String VIEW_TAG = “com.pm_road.fireair.view”; public static final String THREAD_TAG = “com.pm_road.fireair.thread”; public static final String BULLET = “o”; }
完成以上代码之后:大概的工作也就差不多了,可以使用真机或ADT运行一下:
接下来我们就是写敌机和敌机发射子弹了 《飞机大战》安卓游戏开发源码(四)
在这里我的运行效果如下:
本文章属于原创性文章,珍惜他人劳动成果,转载请注明出处:http://www.pm-road.com/index.php/2014/11/06/161/
相关推荐
基于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键发射炮弹。这个游戏代码写的相当不错,特别是对于...