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

为什么80%的码农都做不了架构师?>>>   hot3.png

本文章属于原创性文章,珍惜他人劳动成果,转载请注明出处: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 {@Overrideprotected 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;@Overrideprotected 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);// 初始化surfaceViewsurfaceView = 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”);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic 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{@Overridepublic 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;@Overridepublic 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;// 飞机Runnableprivate 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, “控制的飞机射击”);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}@Overridepublic void surfaceCreated(SurfaceHolder holder) {/** 启动线程 */threadRun();}@Overridepublic 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/

 

飞机大战源码

飞机大战源码

转载于:https://my.oschina.net/pmroad/blog/357078

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抽屉远离在计算机的应用,抽屉原理的应用及其推广优秀毕业论文

抽屉原理的应用及其推广优秀毕业论文 抽屉原理的应用及其推广 数学与计算机科学学院 数学与应用数学 指导老师&#xff1a; 王美能 摘要&#xff1a;抽屉原理也叫鸽巢原理&#xff0c;是研究如何将元素分类的一个原理&#xff0c;也是组合数学里最简单、最基本的原理。本文简述…

马斯克脑机接口_马斯克的脑机接口,让我倍感担忧

前段时间&#xff0c;特斯拉创始人马斯克展示了一项研究成果——把芯片装在人脑袋里。按照他的说法&#xff0c;植入的芯片不仅不会对人脑造成任何伤害&#xff0c;相反的&#xff0c;可以解决很多神经系统问题&#xff0c;比如注意力不集中、上瘾、焦虑等。不仅如此&#xff0…

kivy中文手册python_K-Meleon

K-Meleon K-Meleon - 一手掌控你的瀏覽體驗 K-Meleon 是一個速度超快、高度自訂、輕量化的網路瀏覽器&#xff0c;採用 Mozilla 開發、用於 Firefox 的 Gecko 佈局引擎。K-Meleon 完全免費、使用 GNU General Public License 授權的開放源碼軟體&#xff0c;專為 Microsoft Win…

男孩子也是要护肤的!!!

1 如果让一个黑人在黑暗中穿一件白色的衣服会是什么样的画面&#xff1f;2 自己做蛋糕翻车现场别人的▼你的▼3 单生狗的你4 在家健身翻车现场5 小朋友为了吃有多拼6 男孩子也是要护肤的你点的每个赞&#xff0c;我都认真当成了喜欢

JS对数据分页的封装方法

为什么80%的码农都做不了架构师&#xff1f;>>> 该文章属于原创&#xff1a;更多详细说明查看&#xff1a;http://www.pm-road.com/index.php/2014/07/24/26/ 因为web端经常会展示很多数据&#xff0c;如果一页下来&#xff0c;肯定会看的眼花缭乱&#xff0c;所以…

xftp6设置默认打开文件的程序_修改文件默认打开方式,不改变原图标

由于经常需要看pdf文件&#xff0c;一直以来都是用的Microsoft Edge阅读pdf文件&#xff0c;但是Microsoft Edge打开pdf文件字体的清晰度不高&#xff0c;而且使用ctrlf进行查找时&#xff0c;高亮部分不够明显&#xff0c;所以决定用Chrome来打开pdf文件&#xff0c;于是就将p…

名片管理系统python详解_名的解释|名的意思|汉典“名”字的基本解释

【丑集上】【口】 名康熙筆画&#xff1a;6 部外筆画&#xff1a;3【唐韻】武幷切【集韻】【韻會】彌幷切【正韻】眉兵切&#xff0c; &#x20024;音詺。【說文】自命也。从口从夕。夕者&#xff0c;冥也。冥不相見&#xff0c;故以口自名。【玉篇】號也。【廣韻】名字也。【…

简单三分钟,本地搭建k8s

使用 minikube 在本地搭建 k8s 已经比以前要简单很多了。本文&#xff0c;我们通过简短的三分钟来重现一下在本地搭建 k8s 实验环境的步骤。下载 Minikube 首先&#xff0c;你可能会考虑从官网下载 minikube 然后进行安装&#xff0c;但是这样实际上可以预知的是&#xff0c;在…

作为史上最疯狂的科学家,特斯拉提出过哪些惊世骇俗的设想

全世界只有3.14 % 的人关注了爆炸吧知识尼古拉特斯拉是有史以来最疯狂的科学家之一&#xff0c;不管你认为他是天才还是疯子&#xff0c;都无法否认他的才华和想象力。特斯拉在他的时代提出了许多天才的发明和想法&#xff0c;其中一些直到今天都被认为是不切实际或极其危险的。…

新电脑怎么测试软件,鲁大师如何测试新电脑 鲁大师测新机方法

核心提示&#xff1a;鲁大师如何测试新电脑呢&#xff1f;快来看看吧。1、首先需要先打开鲁大师这款软件&#xff0c;进入到主界面&#xff0c;在看新机之前有需要注意的几点&#xff0c;如果电脑的拥有者之前本来就是通过二手的渠道购买的电脑&#xff0c;那电脑本身就是二手的…

机器人等级考试一级教具_全国青少年机器人技术等级考试(一级):基本结构...

​机器人技术&#xff0c;是衡量一个国家科技创新和高端制造业水平的重要标志。大力推动机器人技术创新与行业发展&#xff0c;关键在于人才的培养。少年强&#xff0c;则国强。机器人作为信息化教育的新载体&#xff0c;不仅要让更多中国青少年了解机器人的发展&#xff0c;掌…

react dispatch_React测试的那些事(三) React Hook 测试实例

useReducer测试 useReducer 首先需要在组件中用 actions 和 reducers &#xff0c;代码如下。Reducerimport * as ACTIONS from ./actionsexport const initialState {stateprop1: false, }export const Reducer1 (state initialState, action) > {switch(action.type) {…

Blazor 组件库开发指南

翻译自 Waqas Anwar 2021年5月21日的文章 《A Developer’s Guide To Blazor Component Libraries》 [1]Blazor 的核心是组件&#xff0c;我们创建不同类型的组件并在整个项目中重用它们。没有人想重复造轮子&#xff0c;因此创建一个可重用的 Blazor 组件库始终是一个好主意&a…

今年大学毕业照画风太清奇.....我忍不住笑出了声!

全世界只有3.14 % 的人关注了爆炸吧知识转眼又到毕业季&#xff0c;今年毕业季因疫情有些不一样。PS云毕业照、云答辩、云面试&#xff0c;不少毕业生调侃自己是“云毕业”。最近不少大学生在网上哀嚎&#xff0c;原因是学校要他们上交照片&#xff0c;以便制作毕业照&#xff…

vc 控制台添加托盘显示_开源:ESP8266读DHT11温湿度,小程序实时显示

第一、原理讲解原理简述&#xff1a;利用发布订阅模式。第一步&#xff0c;先读取DHT11温湿度数值&#xff0c;第二步&#xff0c;新建主题&#xff0c;然后esp8266往这个主题发送消息&#xff0c;第三步。小程序通过http API接口获取数据。小程序控制原理&#xff1a;esp8266订…

python if elif else_python:通讯录(字典+while+if/else)

Hello,World.我是很久很久很久都没有更新的土土[看]但是即便如此呢我这个人也不喜欢拖拖拉拉的东扯西扯一上来咱们就来讲讲正题勿怪[笑哭]1.使用字典构建通讯录mydic{}//定义一个字典2.使用whlie循环判断是否继续进行while True://循环开始break//循环结束3.使用if/elif/else语…

有BUG!!!慎用default文本

前言下面这段代码&#xff0c;你能发现什么问题吗&#xff1f;public static int? Test1(string str) {return str switch{"A" > 1,"B" > 2,"C" > 3,_ > default,}; } public static int? Test2(string str) {switch (str){case &…

老师看完都吐血的五道题

全世界只有3.14 % 的人关注了 爆炸吧知识 老师看完都要吐血的五道题哈哈哈哈哈虽然小编觉得最后一答完全没问题哈哈哈图片来源于网络&#xff0c;如有侵权请联系删除。你点的每个在看&#xff0c;我都认真当成了喜欢

JDK5.0新特性--可变参数

2019独角兽企业重金招聘Python工程师标准>>> /*** 可变参数*/ public class VariableParamater {/*** 统计2个或多个数的和*/public static void main(String[] args) {//计算2个数的和sum(10,15);/** 问题&#xff1a;如果要计算3个数、4个数、5个数或n个数的和&am…

欧几里得距离网络_使用Tensorflow对象检测模型和OpenCV的社交距离和遮罩检测器...

将深度学习和计算机视觉相结合的隔离项目社会距离化这个术语已席卷全球&#xff0c;正在改变着我们的生活方式。社交距离也称为“物理距离”&#xff0c;是指在您自己与其他并非来自家庭的人之间保持安全的空间。随着该国开始在激增的COVID-19案件中发挥作用&#xff0c;保持社…