




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android游戏开发的入门实例在Android中,SurfaceView是一个重要的绘图容器,它可以可以直接从内存或 者DMA等硬件接口取得图像数据。通常情况程序的View和用户响应都是在同一个线程中处理的,这也是为什么处理长时间事件(例如访问网络)需要放到另外 的线程中去(防止阻塞当前UI线程的操作和绘制)。但是在其他线程中却不能修改UI元素,例如用后台线程更新自定义View(调用View的在自定义 View中的onDraw函数)是不允许的。在Android系统上开发游戏是Android开发学习者所向往的,有成就感也有乐趣,还能取得经济上的报酬。那怎样开发Android游戏呢?下面介绍一个简单的入门实例。一、创建新工程首先,我们在Eclipse中新建一个名为Movement的工程,并且选择合适的Android SDK,在这里,我们选用的API是比较低的1.5版本,这样可以让其适应性更强。接下来,我们新建两个类,一个是UpdateThread类,一个是 SurfaceView类,它们在项目中分别是负责处理线程和画面的两个类,在接下来会有详细介绍,如下图,分别建立这两个类,注意选择正确它们继承的父类:在建立完成后,系统的项目结构看上去应该象如下的样子:二、编写Movment.java启动程序任何一个Android应用都必须有一个主启动程序来启动,我们这里把这个启动程序命名为Movment,代码很简单如下:1 public class Movement extends Activity 2 Override 3 public void onCreate(Bundle savedInstanceState) 4 5 super.onCreate(savedInstanceState); 6 setContentView(new MovementView(this); 7 注意的是,我们这个启动程序不象其他程序一样,在启动的时候,在setContentView中传入界面布局文件,而是直接将MovementView的实例传递进来,也就是说,直接启动了MovementView这个类,在这个类中,我们将绘画我们的小球。三、什么是SurfaceView在Android中,SurfaceView是一个重要的绘图容器,它可以可以直接从内存或 者DMA等硬件接口取得图像数据。通常情况程序的View和用户响应都是在同一个线程中处理的,这也是为什么处理长时间事件(例如访问网络)需要放到另外 的线程中去(防止阻塞当前UI线程的操作和绘制)。但是在其他线程中却不能修改UI元素,例如用后台线程更新自定义View(调用View的在自定义 View中的onDraw函数)是不允许的。如果需要在另外的线程绘制界面、需要迅速的更新界面或则渲染UI界面需要较长的时间,这种情况就要使用SurfaceView了。SurfaceView中包含一个Surface对象,而Surface是可以在后台线程中绘制的。在本文中,我们将使用它,直接通过代码创建一个小球,并且随着UpdateThread线程的更新,不断改变小球的位置,下面我们开始学习MovementView的编写,先看下如何运用SurfaceView。首先导入SurfaceView及绘图的相关库文件,如下所示:8 package example.movement; 9 import android.content.Context; 10 import android.graphics.Canvas; 11 import android.graphics.Color; 12 import android.graphics.Paint; 13 import android.graphics.Rect; 14 import android.view.SurfaceHolder; 15 import android.view.SurfaceView; 接着,我们要继承SurfaceView并且实现SurfaceHolder.Callback接口,这是一个SurfaceHolder的内部接口,可以实现该接口获得界面改变的信息,代码如下,并且我们声明了一些成员变量:16 public class MovementView extends SurfaceView implements SurfaceHolder.Callback 17 private int xPos; 18 private int yPos; 19 private int xVel; 20 private int yVel; 21 private int width; 22 private int height; 23 private int circleRadius; 24 private Paint circlePaint; 25 UpdateThread updateThread; 26 而在MovementView的构造函数中,我们设置了小球的大小和在X,Y方向上的初始坐标,如下:27 public MovementView(Context context) 28 super(context); 29 getHolder().addCallback(this); 30 circleRadius = 10; 31 circlePaint = new Paint(); 32 circlePaint.setColor(Color.BLUE); 33 xVel = 2; 34 yVel = 2; 35 接着我们来看下ondraw方法的编写,在这里,我们将绘画小球,并且每次都把画布Canvas的背景色设置为白色,以重新覆盖之前一帧,代码如下:36 protected void onDraw(Canvas canvas) 37 38 canvas.drawColor(Color.WHITE); 39 40 canvas.drawCircle(xPos, yPos, circleRadius, circlePaint); 41 下页将为您带来UpdateThread线程程序 和 启动并运行程序我们再来看下updatePhysics这个方法如何编写。这个方法的作用有两个:一是处理小球的运动,二是更新小球的实时位置,因为小球在屏幕中不断地运动,因此当小球到达比如屏幕绘画区域的顶端后,要被弹回,88娱乐城因此代码如下:1 public void updatePhysics() 2 /更新当前的x,y坐标 3 xPos += xVel; 4 yPos += yVel; 5 if (yPos - circleRadius height) 6 if (yPos - circleRadius 0) 7 /如果小球到达画布区域的上顶端,则弹回 8 yPos = circleRadius; 9 else 10 /如果小球到达了画布的下端边界,则弹回 11 yPos = height - circleRadius; 12 13 / 将Y坐标设置为相反方向 14 yVel *= -1; 15 16 if (xPos - circleRadius width) 17 if (xPos - circleRadius 0) 18 / 如果小球到达左边缘 19 xPos = circleRadius; 20 else 21 / 如果小球到达右边缘 22 xPos = width - circleRadius; 23 24 / 重新设置x轴坐标 25 xVel *= -1; 26 27 最后我们看下surfaceCreated这个方法的代码,在这个方法中,主要是取得了可用的SurfaceView的区域的高度和宽度,然后设置了小球的起始坐标(将其设置在屏幕的正中央位置),并且启动了UpdateThread线程,代码如下:28 public void surfaceCreated(SurfaceHolder holder) 29 Rect surfaceFrame = holder.getSurfaceFrame(); 30 width = surfaceFrame.width(); 31 height = surfaceFrame.height(); 32 xPos = width / 2; 33 yPos = circleRadius; 34 updateThread = new UpdateThread(this); 35 updateThread.setRunning(true); 36 updateThread.start(); 37 此外,我们要补上surfaceChanged这个方法,这个方法意思是界面尺寸改变时才调用,在我们这个应用中并没用到,所以我们保留为空的方法实现:38 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 39 40 41 而surfaceDestroyed方法中,主要实现的是界面被销毁时才调用,这里我们停止了当前的线程所处理的任务,88娱乐城 http:/www.998877.cc/这里使用了线程的join方法:42 public void surfaceDestroyed(SurfaceHolder holder) 43 boolean retry = true; 44 updateThread.setRunning(false); 45 while (retry) 46 try 47 updateThread.join(); 48 retry = false; 49 catch (InterruptedException e) 50 51 52 归纳下,完整的MovementView代码如下:53 package example.movement; 54 import android.content.Context; 55 import android.graphics.Canvas; 56 import android.graphics.Color; 57 import android.graphics.Paint; 58 import android.graphics.Rect; 59 import android.view.SurfaceHolder; 60 import android.view.SurfaceView; 61 public class MovementView extends SurfaceView implements SurfaceHolder.Callback 62 private int xPos; 63 private int yPos; 64 private int xVel; 65 private int yVel; 66 private int width; 67 private int height; 68 private int circleRadius; 69 private Paint circlePaint; 70 UpdateThread updateThread; 71 public MovementView(Context context) 72 super(context); 73 getHolder().addCallback(this); 74 circleRadius = 10; 75 circlePaint = new Paint(); 76 circlePaint.setColor(Color.BLUE); 77 xVel = 2; 78 yVel = 2; 79 80 Override 81 protected void onDraw(Canvas canvas) 82 canvas.drawColor(Color.WHITE); 83 canvas.drawCircle(xPos, yPos, circleRadius, circlePaint); 84 85 public void updatePhysics() 86 xPos += xVel; 87 yPos += yVel; 88 if (yPos - circleRadius height) 89 if (yPos - circleRadius 0) 90 yPos = circleRadius; 91 else 92 yPos = height - circleRadius; 93 94 yVel *= -1; 95 96 if (xPos - circleRadius width) 97 if (xPos - circleRadius 0) 98 xPos = circleRadius; 99 else 100 xPos = width - circleRadius; 101 102 xVel *= -1; 103 104 105 public void surfaceCreated(SurfaceHolder holder) 106 Rect surfaceFrame = holder.getSurfaceFrame(); 107 width = surfaceFrame.width(); 108 height = surfaceFrame.height(); 109 xPos = width / 2; 110 yPos = circleRadius; 111 updateThread = new UpdateThread(this); 112 updateThread.setRunning(true); 113 updateThread.start(); 114 115 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 116 117 public void surfaceDestroyed(SurfaceHolder holder) 118 boolean retry = true; 119 updateThread.setRunning(false); 120 while (retry) 121 try 122 updateThread.join(); 123 retry = false; 124 catch (InterruptedException e) 125 126 127 128 四、UpdateThread线程程序下面,我们开始着手编写UpdateThread线程程序。这个程序主要是启动一个线程去不断更新当前小球的位置。先看声明及构造函数部分:129 package licksquid.movement; 130 import android.graphics.Canvas; 131 import android.view.SurfaceHolder; 132 public class UpdateThread extends Thread 133 private long time; 134 private final int fps = 20; 135 private boolean toRun = false; 136 private MovementView movementView; 137 private SurfaceHolder surfaceHolder; 138 139 public UpdateThread(MovementView rMovementView) 140 movementView = rMovementView; 141 surfaceHolder = movementView.getHolder(); 142 143 public void setRunning(boolean run) 144 toRun = run; 145 注意这里的setRunning方法中设置了线程是否应该停止的标记,下面来看重要的方法run:146 publ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年电子商务师职业资格考试题库:电子商务法律法规在电子商务活动中的应用试题
- 2025年一建《机电工程管理与实务》考试施工现场安全管理案例分析题库
- 2025年一建《机电工程管理与实务》考试合同管理与索赔题库高频考点解析
- 病理学考试试题库带答案解析
- 2025年个人之间的购房合同
- 病理生理题库及答案详解
- 2025年从张某诉某融资租赁公司案看租赁合同效力的认定
- 2024年五月出租车报废残值评估算法专利使用协议
- 2025销售代表合同
- 2024年12月量子等离激元环签名佣金验证协议
- 高中化学基础知识超级判断300题
- 邮政储蓄银行的2024年度借款合同范本
- 汽车吊起重吊装方案
- 从0到1开播指导抖音本地生活商家直播培训
- 产房助产士进修汇报
- 大型综合楼新建工程技术方案、施工方案投标文件(投标方案)
- GB/T 16439-2024交流伺服系统通用技术规范
- 2024义务教育《英语课程标准》(2022版)
- 闽教版小学英语四年级 (下)Unit 6 Weather Part A 教学设计
- 铁粉销售合同
- 初中语文修改病句市公开课一等奖省赛课获奖课件
评论
0/150
提交评论