本文章属于原创性文章,珍惜他人劳动成果,转载请注明出处: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/
相关推荐
在这个案例中,“飞飞机大战”游戏可能是用Java或Kotlin编写的,这两种语言在Android开发中都非常常见。 游戏的核心功能包括游戏逻辑、用户交互和多媒体元素。"飞飞机大战"游戏包含以下关键组件: 1. 游戏循环:...
【描述】提到"JAVA飞机大战源码,自己初学Android时候写的",这暗示了这个项目可能是由一个初学者为了学习Android开发而创建的。初学者通常会从简单的游戏项目开始,因为它们可以提供对基本游戏循环、图形绘制、用户...
【Android 飞机大战游戏源码】是一个用于学习Android游戏开发的实例项目,它包含了一个简单的飞机大战游戏的所有源代码。这个项目是为初学者和有经验的开发者设计的,旨在帮助他们理解和掌握Android平台上游戏开发的...
【基于Android的飞机大战游戏】是一款使用Java编程语言开发的移动平台游戏,它展示了Java在构建安卓应用,尤其是游戏方面的强大能力。在这个项目中,我们将深入探讨几个关键的知识点: 1. **Android开发环境**:...
微信小游戏“飞机大战”是一款基于微信平台开发的轻量级休闲游戏,它的源码对于学习游戏开发、尤其是微信小游戏开发的开发者来说具有重要的参考价值。本文将深入探讨这款游戏的源码结构、技术栈以及实现原理。 首先...
通过对"android飞机大战雷电源码"的深入分析,我们可以了解到Android游戏开发的基本流程和核心技术,这对于进一步提升Android应用开发能力,特别是游戏开发方向,具有极大的实践价值。通过学习和理解这些源码,...
【安卓仿微信飞机大战源码】是一个非常适合初学者学习的项目,它可以帮助开发者了解安卓应用的基本构建、游戏编程原理以及如何实现简单的交互功能。在这个项目中,你可以深入学习以下几个重要的知识点: 1. 安卓...
通过分析微信飞机大战的Android源码,我们可以学习到如何使用Cocos2d-android进行游戏开发,了解游戏架构设计、资源管理、事件处理等核心知识点,对于提升自己的Android游戏开发能力大有裨益。同时,这也为我们提供...
《飞机大战游戏源码》是一款基于Cocos2D引擎开发的基础飞行射击游戏,它涵盖了游戏设计、编程和UI定制等多个方面。在这个项目中,开发者利用C/C++语言编写代码,展示了对游戏逻辑、图形渲染以及用户交互的深入理解。...
总结来说,微信飞机大战游戏是学习面向对象编程和安卓游戏开发的绝佳案例。通过分析其源码,你可以了解到游戏对象的抽象和设计,游戏循环的实现,以及在安卓平台上的运行和调试技巧。对于初学者来说,这是一个很好的...
Java飞机大战是一款基于Java SE平台开发的经典射击游戏,它展示了Java语言在游戏开发中的应用能力。通过分析这款游戏的源代码,我们可以深入理解Java编程的基本原理,以及如何利用Java进行图形界面设计、事件处理、...
本源码为基于Java的安卓飞机大战游戏设计,共包含135个文件,其中png文件43个,class文件30个,xml文件18个,java文件18个,mp3文件5个,gif文件4个,jar文件3个,apk文件2个,jpg文件2个,classpath文件1个。...
【Android打飞机类游戏源码】是一款基于Android平台开发的简单飞行射击游戏,与流行的"全民飞机大战"具有相似的游戏机制。源代码的提供对于学习Android游戏开发的开发者或者对游戏编程感兴趣的爱好者来说,是一份...
《深入解析:基于Cocos2dx的Android飞机大战游戏源码》 在移动游戏开发领域,Cocos2dx是一款广受欢迎的游戏开发框架,它提供了跨平台的2D游戏开发能力,支持包括Android在内的多种操作系统。本篇文章将围绕...
《Unity游戏开发:深入解析“全民飞机大战”源码》 Unity是一款强大的跨平台游戏开发引擎,被广泛应用于各类游戏的制作,从简单的2D小游戏到复杂的3D大作,无所不能。本篇文章将深入剖析“全民飞机大战”这款游戏的...
【Android游戏大战飞机源码】是一款适合初学者的Android游戏开发项目,旨在帮助开发者了解基本的游戏编程概念。这个游戏是基于经典的“打飞机”玩法,玩家通过控制飞机来击落来袭的敌机,同时躲避敌方的攻击。在这个...
【经典Android游戏源码9】仿微信飞机大战Cocos2dx版是一款基于Cocos2dx框架开发的Android游戏,这款游戏的源代码对于学习Android游戏开发,尤其是Cocos2dx引擎的使用具有很高的参考价值。Cocos2dx是一个跨平台的游戏...
总结,“android飞机大战毕设源码.zip”项目涵盖了Android游戏开发的多个核心知识点,通过学习和分析源码,你可以深入理解Android游戏的架构设计,提升你的编程技能,为今后的项目开发打下坚实基础。
"飞机大战Android版源代码"就是一个典型的移动游戏开发实例,它展示了如何在Android环境中实现一个简单的飞行射击游戏。下面,我们将深入探讨这个项目中的关键知识点。 首先,我们要理解的是Android应用程序的基础...
总的来说,这个"经典飞机大战资源源码"涵盖了游戏开发的基本要素,包括游戏对象的创建、动画实现、碰撞检测以及对象销毁等。通过分析和理解这些代码,开发者可以学习到游戏开发的核心技巧,并将其应用到自己的项目中...