1. 前言

Android游戏在App Market上是最火的一类应用,但是和iPhone游戏相比,Android游戏还有很大差距,除了与Android手机的市场占有率不高有关以外,Android游戏开发的资料较少也是制约因素之一。本系列教程将从实现Android SDK带的lunarLander游戏的实现为主轴,实现一个完整的Android游戏引擎。当然这个游戏引擎没有使用OpenGL ES 2.0中的功能,也不能处理3D游戏,但是对于一个小型Android游戏开发应该已经足够了。

在本集中,我将介绍Android中的图像绘制技术,这个是Android游戏的基础。

  • 游戏视图

首先需要设计游戏的显示界面类A2dGameView(由于我们要实现一个完整的Android游戏引擎,A2d前缀代表使用Android本身图形类的游戏引擎,Egl2d是OpenGL ES 2D游戏引擎,Egl3d是OpenGL ES 3D游戏引擎),具体代码如下所示:

package com.bjcic.fage.a2d;

import com.bjcic.fage.game.R;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class A2dGameView extends SurfaceView implements SurfaceHolder.Callback {

public A2dGameView(Context context) {
super(context);
// TODO Auto-generated constructor stub
getHolder().addCallback(this);
renderThd = new A2dRenderThd(getHolder(), this);
}

@Override
public void onDraw(Canvas canvas) {
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(bmp, 10, 10, null);
}

@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub

}

@Override
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
renderThd.setIsRunning(true);
renderThdWrapper = new Thread(renderThd);
renderThdWrapper.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
boolean retry = true;
renderThd.setIsRunning(false);
while (retry) {
try {
renderThdWrapper.join();
retry = false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

private A2dRenderThd renderThd = null;
private Thread renderThdWrapper = null;
}
其中需要指出的该类的onDraw函数,该函数在屏幕(10,10)坐标出绘制一个bmp图片。

在public void surfaceCreated(SurfaceHolder arg0) 函数中,初始化并启动界面渲染类,界面渲染类启动界面渲染线程,完成界面的绘制工作。

在surfaceDestroyed(SurfaceHolder arg0)函数中停止界面渲染线程。

  • 渲染线程

package com.bjcic.fage.a2d;

import android.graphics.Canvas;
import android.view.SurfaceHolder;

public class A2dRenderThd implements Runnable {
public A2dRenderThd(SurfaceHolder surfHolder, A2dGameView gameView) {
this.surfHolder = surfHolder;
this.gameView = gameView;
}

@Override
public void run() {
// TODO Auto-generated method stub
Canvas canvas = null;
while (isRunning) {
canvas = null;
try {
canvas = surfHolder.lockCanvas();
synchronized (surfHolder) {
gameView.onDraw(canvas);
}
} finally {
if (canvas != null) {
surfHolder.unlockCanvasAndPost(canvas);
}
}
}
}

public void setIsRunning(boolean isRunning) {
this.isRunning = isRunning;
}

private SurfaceHolder surfHolder = null;
private A2dGameView gameView = null;
private boolean isRunning = true;
}
由上面代码可以看出,渲染线程是一个无形循环,每次循环中调用GameView来实现界面的绘制。

最后是在启动类中加载游戏视图,代码如下所示:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
//setContentView(R.layout.main);
setContentView(new A2dGameView(this));
}

  • 总结

在本集中,我描述了游戏视图的绘制方法,以及游戏主循环的雏形。

Android 2D游戏引擎相关推荐

  1. Android 2D游戏引擎AndEngine配置环境

    Android 2D游戏引擎AndEngine配置环境 1.2  配置环境 在任何编程中,都需要一些软件或者硬件的支持.否则,没有硬件软件是不可能存在的,而想要编写对应语言的的程序,这需要对应语言库和 ...

  2. 认识AndEngine选自Android 2D游戏引擎AndEngine快速入门教程

    认识AndEngine什么是AndEngine 随着Android手机.平板的盛行,Android下的游戏也不断的变得火热.而对于游戏开发有兴趣的同学们,应该也想要学习开发游戏.虽说游戏开发的引擎较多 ...

  3. Android 2D游戏引擎AndEngine快速入门教程

    Android 2D游戏引擎AndEngine快速入门教程 介绍:AndEngine是一款知名的Android 2D游戏引擎.该引擎代码开源,并且可以免费使用.本书详细讲解如何使用AndEngine引 ...

  4. Android 2D游戏引擎1

    前言 Android游戏在App Market上是最火的一类应用,但是和iPhone游戏相比,Android游戏还有很大差距,除了与Android手机的市场占有率不高有关以外,Android游戏开发的 ...

  5. 十五开源的Andr​​oid(2D或3D)Android开发游戏引擎

    Android游戏开发Android游戏引擎是非常有用的,这里是10个开源的Andr​​oid(2D或3D)Android开发的游戏引擎. 1.  Rokon:Android的开源2D游戏引擎 Rok ...

  6. Android安卓游戏引擎大搜罗

    2019独角兽企业重金招聘Python工程师标准>>> 1.AndEngine 简介: AndEngine基于libGDX框架开发,使用OpenGL ES进行图形绘制.同时继承了BO ...

  7. 配置JDKAndroid 2D游戏引擎AndEngine

    配置JDKAndroid 2D游戏引擎AndEngine JDK全称为Java Development Kit(也即Java开发包),是用于支持Java 编程的基础.无论是什么编程,只要用到了Java ...

  8. 2d游戏引擎_8年,从2D到3D,我的学习之路

    Mickey 写了一篇 <一个本科毕业生创业两年的感悟>,从他的视角,总结了我们合作的两年经历. 我也来写一篇,介绍我的学习之路,希望对大家有所帮助,谢谢大家- 我的学习方法 1.直接从0 ...

  9. 开发2d游戏要用什么引擎_下一个游戏要使用什么2D游戏引擎

    开发2d游戏要用什么引擎 A few weeks ago, I posted about my experience attempting to make a prototype in a bunch ...

最新文章

  1. Python面向对象编程:类继承和其衍生术语
  2. CF982 C Cut 'em all!【树/DFS/思维】
  3. 基于深度学习的脑电图识别 综述篇(二)数据采样及处理
  4. 百度面试题:求数组最大值
  5. 算法--微软面试:指定数字在数组中出现的次数
  6. Android的消息处理机制——Looper,Handler和Message浅析
  7. Android 获取WebView的内容宽度高度
  8. Oracle redo
  9. 谈新手对CString的使用
  10. JavaFX加载界面报错:fxcontroller can only be applied to root element?
  11. 跟我学SpringMVC目录汇总贴、PDF下载、源码下载
  12. uniapp ios时间戳获取不到_uni-app打包编译成安卓及ios包并上传发布测试版
  13. AS数据库自动备份的DOS语句
  14. lato字体可以商用吗_Google Fonts最受欢迎25款,免版权字体
  15. 阿里云ACE北京同城会-景山活动
  16. CTF比赛的简单了解
  17. C#通过调用WinApi打印PDF文档类,服务器PDF打印、IIS PDF打印
  18. 网上买包包首选的3个网站(必看的3个包包网站)
  19. 农夫过河问题的c语言实现
  20. PARSEC benchmark下载

热门文章

  1. 从新认识redis总结
  2. RAPID常用数据类型
  3. 关于日期和时间的解析
  4. 采购管理软件最好的哪个?采购查询功能详解
  5. ParameterizedType类型设置默认值
  6. 凤凰教育商学院成立 致力于为教育机构提供运营方案
  7. node.js安装后输入“node -v”提示'node' 不是内部或外部命令,也不是可运行的程序的解决方法
  8. taglib指令作用以及属性
  9. Angular4_获取当前Url地址和获取Url传递的参数
  10. Ping工具ICMP报文学习