Android游戏开发之旅

Android游戏开发之旅
Android游戏开发之旅

Android游戏开发之旅一长按Button原理

今天Android123开始新的Android游戏开发之旅系列,主要从控制方法(按键、轨迹球、触屏、重力感应、摄像头、话筒气流、光线亮度)、图形View(高效绘图技术如双缓冲)、音效(游戏音乐)以及最后的OpenGL ES(Java层)和NDK的OpenGL和J2ME游戏移植到Android方法,当然还有一些游戏实现惯用方法,比如地图编辑器,在Android OpenGL如何使用MD2文件,个部分讲述下Android游戏开发的过程最终实现一个比较完整的游戏引擎。相信大家都清楚Android Market下载量比较好的都是游戏,未来手机网游的发展相信Android使用的Java在这方面有比iPhone有更低的入门门槛。

对于很多游戏使用屏幕控制一般需要考虑长按事件,比如在动作类的游戏中需要长按发射武器,结合Android Button模型,我们实现一个带图片的Button的长按,为了更清晰的显示原理,Android开发网这里使用ImageButton作为基类

public class RepeatingImageButton extends ImageButton {

private long mStartTime; //记录长按开始

private int mRepeatCount; //重复次数计数

private RepeatListener mListener;

private long mInterval = 500; //Timer触发间隔,即每0.5秒算一次按下

public RepeatingImageButton(Context context) {

this(context, null);

}

public RepeatingImageButton(Context context, AttributeSet attrs) {

this(context, attrs, android.R.attr.imageButtonStyle);

}

public RepeatingImageButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle);

setFocusable(true); //允许获得焦点

setLongClickable(true); //启用长按事件

}

public void setRepeatListener(RepeatListener l, long interval) { //实现重复按下事件listener mListener = l;

mInterval = interval;

}

@Override

public boolean performLongClick() {

mStartTime = SystemClock.elapsedRealtime();

mRepeatCount = 0;

post(mRepeater);

return true;

}

@Override

public boolean onTouchEvent(MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_UP) { // 本方法原理同onKeyUp的一样,这里处理屏幕事件,下面的onKeyUp处理Android手机上的物理按键事件

removeCallbacks(mRepeater);

if (mStartTime != 0) {

doRepeat(true);

mStartTime = 0;

}

}

return super.onTouchEvent(event);

}

//处理导航键事件的中键或轨迹球按下事件

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

switch (keyCode) {

case KeyEvent.KEYCODE_DPAD_CENTER:

case KeyEvent.KEYCODE_ENTER:

super.onKeyDown(keyCode, event);

return true;

}

return super.onKeyDown(keyCode, event);

}

//当按键弹起通知长按结束

@Override

public boolean onKeyUp(int keyCode, KeyEvent event) {

switch (keyCode) {

case KeyEvent.KEYCODE_DPAD_CENTER:

case KeyEvent.KEYCODE_ENTER:

removeCallbacks(mRepeater); //取消重复listener捕获

if (mStartTime != 0) {

doRepeat(true); //如果长按事件累计时间不为0则说明长按了

mStartTime = 0; //重置长按计时器

}

}

return super.onKeyUp(keyCode, event);

}

private Runnable mRepeater = new Runnable() { //在线程中判断重复

public void run() {

doRepeat(false);

if (isPressed()) {

postDelayed(this, mInterval); //计算长按后延迟下一次累加

}

}

};

private void doRepeat(boolean last) {

long now = SystemClock.elapsedRealtime();

if (mListener != null) {

mListener.onRepeat(this, now - mStartTime, last ? -1 : mRepeatCount++);

}

}

下面是重复Button Listener接口的定义,调用时在Button中先使用setRepeatListener()方法实现RepeatListener接口

public interface RepeatListener {

void onRepeat(View v, long duration, int repeatcount); //参数一为用户传入的Button

对象,参数二为延迟的毫秒数,第三位重复次数回调。

}

}

Android游戏开发之旅二View和SurfaceView

在Android游戏当中充当主要的除了控制类外就是显示类,在J2ME中我们用Display和Canvas 来实现这些,而Google Android中涉及到显示的为view类,Android游戏开发中比较重要和复杂的就是显示和游戏逻辑的处理。这里我们说下android.view.View和android.view.SurfaceView。SurfaceView是从View基类中派生出来的显示类,直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及Camera摄像头一般均使用SurfaceView,到底有哪些优势呢? SurfaceView可以控制表面的格式,比如大小,显示在屏幕中的位置,最关键是的提供了SurfaceHolder类,使用getHolder方法获取,相关的有Canvas lockCanvas()

Canvas lockCanvas(Rect dirty) 、void removeCallback(SurfaceHolder.Callback callback)、void unlockCanvasAndPost(Canvas canvas) 控制图形以及绘制,而在

SurfaceHolder.Callback 接口回调中可以通过下面三个抽象类可以自己定义具体的实现,比如第一个更改格式和显示画面。

abstract void surfaceChanged(SurfaceHolder holder, int format, int width, int height)

abstract void surfaceCreated(SurfaceHolder holder)

abstract void surfaceDestroyed(SurfaceHolder holder)

对于Surface相关的,Android底层还提供了GPU加速功能,所以一般实时性很强的应用中主要使用SurfaceView而不是直接从View构建,同时Android123未来后面说到的OpenGL中的GLSurfaceView也是从该类实现。

Android游戏开发之旅三View类详解

在Android游戏开发之旅二中我们讲到了View和SurfaceView的区别,今天Android123从View 类开始着重的介绍Android图形显示基类的相关方法和注意点。

自定义View的常用方法:

onFinishInflate() 当View中所有的子控件均被映射成xml后触发

onMeasure(int, int) 确定所有子元素的大小

onLayout(boolean, int, int, int, int) 当View分配所有的子元素的大小和位置时触发onSizeChanged(int, int, int, int) 当view的大小发生变化时触发

onDraw(Canvas) view渲染内容的细节

onKeyDown(int, KeyEvent) 有按键按下后触发

onKeyUp(int, KeyEvent) 有按键按下后弹起时触发

onTrackballEvent(MotionEvent) 轨迹球事件

onTouchEvent(MotionEvent) 触屏事件

onFocusChanged(boolean, int, Rect) 当View获取或失去焦点时触发onWindowFocusChanged(boolean) 当窗口包含的view获取或失去焦点时触发onAttachedToWindow() 当view被附着到一个窗口时触发

onDetachedFromWindow() 当view离开附着的窗口时触发,Android123提示该方法

和onAttachedToWindow() 是相反的。

onWindowVisibilityChanged(int) 当窗口中包含的可见的view发生变化时触发

以上是View实现的一些基本接口的回调方法,一般我们需要处理画布的显示时,重写onDraw(Canvas)用的的是最多的:

@Override

protected void onDraw(Canvas canvas) {

//这里我们直接使用canvas对象处理当前的画布,比如说使用Paint来选择要填充的颜色

Paint paintBackground = new Paint();

paintBackground.setColor(getResources().getColor(R.color.xxx)); //从Res中找到名为xxx 的color颜色定义

canvas.drawRect(0, 0, getWidth(), getHeight(), paintBackground); //设置当前画布的背景颜

色为paintBackground中定义的颜色,以0,0作为为起点,以当前画布的宽度和高度为重点即整块画布来填充。

具体的请查看Android123未来讲到的Canvas和Paint,在Canvas中我们可以实现画路径,图形,区域,线。而Paint作为绘画方式的对象可以设置颜色,大小,甚至字体的类型等等。

}

当然还有就是处理窗口还原状态问题(一般用于横竖屏切换),除了在Activity中可以调用外,开发游戏时我们尽量在View中使用类似

@Override

protected Parcelable onSaveInstanceState() {

Parcelable p = super.onSaveInstanceState();

Bundle bundle = new Bundle();

bundle.putInt("x", pX);

bundle.putInt("y", pY);

bundle.putParcelable("android123_state", p);

return bundle;

}

@Override

protected void onRestoreInstanceState(Parcelable state) {

Bundle bundle = (Bundle) state;

dosomething(bundle.getInt("x"), bundle.getInt("y")); //获取刚才存储的x和y信息

super.onRestoreInstanceState(bundle.getParcelable("android123_state"));

return;

}

在View中如果需要强制调用绘制方法onDraw,可以使用invalidate()方法,它有很多重载版本,同时在线程中的postInvailidate()方法将在Android游戏开发之旅六中的自定义View完整篇讲到。

Android游戏开发之旅四Canvas和Paint实例

昨天我们在Android游戏开发之旅三View详解中提到了onDraw方法,有关详细的实现我们今天主要说下Android的Canvas和Paint对象的使用实例。

Canvas类主要实现了屏幕的绘制过程,其中包含了很多实用的方法,比如绘制一条路径、区域、贴图、画点、画线、渲染文本,下面是Canvas类常用的方法,当然Android开发网提示大家很多方法有不同的重载版本,参数更灵活。

void drawRect(RectF rect, Paint paint) //绘制区域,参数一为RectF一个区域

void drawPath(Path path, Paint paint) //绘制一个路径,参数一为Path路径对象

void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) //贴图,参数一就是我们常规的Bitmap对象,参数二是源区域(Android123提示这里是bitmap),参数三是目标区域(应该在canvas的位置和大小),参数四是Paint画刷对象,因为用到了缩放和拉伸的可能,当原始Rect不等于目标Rect时性能将会有大幅损失。

void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) //画线,参数一起始点的x轴位置,参数二起始点的y轴位置,参数三终点的x轴水平位置,参数四y轴垂直位置,最后一个参数为Paint画刷对象。

void drawPoint(float x, float y, Paint paint) //画点,参数一水平x轴,参数二垂直y轴,第三个参数为Paint对象。

void drawText(String text, float x, float y, Paint paint) //渲染文本,Canvas类除了上面的还可以描绘文字,参数一是String类型的文本,参数二x轴,参数三y轴,参数四是Paint对象。

void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) //在路

径上绘制文本,相对于上面第二个参数是Path路径对象

从上面来看我们可以看出Canvas绘制类比较简单同时很灵活,实现一般的方法通常没有问题,同时可以叠加的处理设计出一些效果,不过细心的网友可能发现最后一个参数均为Paint对象。如果我们把Canvas当做绘画师来看,那么Paint就是我们绘画的工具,比如画笔、画刷、颜料等等。

Paint类常用方法:

void setARGB(int a, int r, int g, int b) 设置Paint对象颜色,参数一为alpha透明通道

void setAlpha(int a) 设置alpha不透明度,范围为0~255

void setAntiAlias(boolean aa) //是否抗锯齿

void setColor(int color) //设置颜色,这里Android内部定义的有Color类包含了一些常见颜色定义

.

void setFakeBoldText(boolean fakeBoldText) //设置伪粗体文本

void setLinearText(boolean linearText) //设置线性文本

PathEffect setPathEffect(PathEffect effect) //设置路径效果

Rasterizer setRasterizer(Rasterizer rasterizer) //设置光栅化

Shader setShader(Shader shader) //设置阴影

void setTextAlign(Paint.Align align) //设置文本对齐

void setTextScaleX(float scaleX) //设置文本缩放倍数,1.0f为原始

void setTextSize(float textSize) //设置字体大小

Typeface setTypeface(Typeface typeface) //设置字体,Typeface包含了字体的类型,粗细,还有倾斜、颜色等。

void setUnderlineText(boolean underlineText) //设置下划线

最终Canvas和Paint在onDraw中直接使用

@Override

protected void onDraw(Canvas canvas) {

Paint paintRed=new Paint();

paintRed.setColor(Color.Red);

canvas.drawPoint(11,3,paintRed); //在坐标11,3上画一个红点

}

下一次Android123将会具体讲到强大的Path路径,和字体Typeface相关的使用。

Android游戏开发之旅(五)Path和Typeface

今天我们继续处理上次Android游戏开发之旅(四)Canvas和Paint实例中提到的Path路径和Typeface字体两个类。对于Android游戏开发或者说2D绘图中来讲Path 路径可以用强大这个词来形容。在Photoshop中我们可能还记得使用钢笔工具绘制路径的方法。Path路径类在位于android.graphics.Path中,Path的构造方法比较简单,如下

Path cwj=new Path(); //构造方法

复制代码

下面我们画一个封闭的原型路径,我们使用Path类的addCircle方法

cwj.addCircle(10,10,50,Direction.CW); //参数一为x轴水平位置,参数二为y轴垂直位置,第三个参数为圆形的半径,最后是绘制的方向,CW为顺时针方向,而CCW是逆时针方向

复制代码

结合Android上次提到的Canvas类中的绘制方法drawPath和drawTextOnPath,我们继续可以在onDraw中加入。

canvas.drawPath(cwj,paintPath); //Android123提示大家这里paintPath为路径的画刷颜色,可以见下文完整的源代码。

canvas.drawTextOnPath("Android123 - CWJ",cwj,0,15,paintText); //将文字绘制到路径中去,

复制代码

有关drawTextOnPath的参数如下:

方法原型

public void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint)

复制代码

参数列表

text 为需要在路径上绘制的文字内容。

path 将文字绘制到哪个路径。

hOffset 距离路径开始的距离

vOffset 离路径的上下高度,这里Android开发网提示大家,该参数类型为float浮点型,除了精度为8位小数外,可以为正或负,当为正时文字在路径的圈里面,为负时在路径的圈外面。paint 最后仍然是一个Paint对象用于制定Text本文的颜色、字体、大小等属性。

下面是我们的onDraw方法中如何绘制路径的演示代码为:

@Override

protected void onDraw(Canvas canvas) {

Paint paintPath=new Paint();

Paint paintText=new Paint();

paintPath.setColor(Color.Red); //路径的画刷为红色

paintText.setColor(Color.Blue); //路径上的文字为蓝色

Path pathCWJ=new Path();

pathCWJ.addCircle(10,10,50,Direction.CW); // 半径为50px,绘制的方向CW为顺时针

canvas.drawPath(pathCWJ,paintPath);

canvas.drawTextOnPath("Android123 - CWJ",pathCWJ,0,15,paintText); //在路径上绘制文字

}

复制代码

有关路径类常用的方法如下:

void addArc(RectF oval, float startAngle, float sweepAngle) //为路径添加一个多边形

void addCircle(float x, float y, float radius, Path.Direction dir) //给path添加圆圈

void addOval(RectF oval, Path.Direction dir) //添加椭圆形

void addRect(RectF rect, Path.Direction dir) //添加一个区域

void addRoundRect(RectF rect, float[] radii, Path.Direction dir) //添加一个圆角区域

boolean isEmpty() //判断路径是否为空

void transform(Matrix matrix) //应用矩阵变换

void transform(Matrix matrix, Path dst) //应用矩阵变换并将结果放到新的路径中,即第二个参数。

复制代码

有关路径的高级效果大家可以使用PathEffect类,有关路径的更多实例Android123将在今后的游戏开发实战中讲解道。

Typeface字体类

平时我们在TextView中需要设置显示的字体可以通过TextView中的setTypeface方法来指定一个Typeface对象,因为Android的字体类比较简单,我们列出所有成员方法

static Typeface create(Typeface family, int style) //静态方法,参数一为字体类型这里是Typeface的静态定义,如宋体,参数二风格,如粗体,斜体

static Typeface create(String familyName, int style) //静态方法,参数一为字体名的字符串,参数二为风格同上,这里我们推荐使用上面的方法。

static Typeface createFromAsset(AssetManager mgr, String path) //静态方法,参数一为AssetManager对象,主要用于从APK的assets文件夹中取出字体,参数二为相对于Android 工程下的assets文件夹中的外挂字体文件的路径。

static Typeface createFromFile(File path) //静态方法,从文件系统构造一个字体,这里参数可以是sdcard中的某个字体文件

static Typeface createFromFile(String path) //静态方法,从指定路径中构造字体

static Typeface defaultFromStyle(int style) //静态方法,返回默认的字体风格

int getStyle() //获取当前字体风格

final boolean isBold() //判断当前是否为粗体

final boolean isItalic() //判断当前风格是否为斜体

复制代码

本类的常量静态定义,首先为字体类型名称

Typeface DEFAULT

Typeface DEFAULT_BOLD

Typeface MONOSPACE

Typeface SANS_SERIF

Typeface SERIF

字体风格名称

int BOLD

int BOLD_ITALIC

int ITALIC

int NORMAL

明天我们将在Android游戏开发之旅六自定义View 一文中具体讲解onDraw以及什么时候会触发绘制方法,来实现我们自定义或子类化控件。

Android游戏开发之旅六自定义View

有关Android的自定义View的框架今天我们一起讨论下,对于常规的游戏,我们在View中需要处理以下几种问题: 1.控制事件 2.刷新View 3. 绘制View

1. 对于控制事件今天我们只处理按键事件onKeyDown,以后的文章中将会讲到屏幕触控的具体处理onTouchEvent以及Sensor重力感应等方法。

2. 刷新view的方法这里主要有invalidate(int l, int t, int r, int b) 刷新局部,四个参数分别为左、上、右、下。整个view刷新invalidate(),刷新一个矩形区域invalidate(Rect dirty) ,刷新一个特性Drawable,invalidateDrawable(Drawable drawable) ,执行invalidate类的方法将会设置view为无效,最终导致onDraw方法被重新调用。由于今天的view比较简单,Android123提示大家如果在线程中刷新,除了使用handler方式外,可以在Thread中直接使用postInvalidate 方法来实现。

3. 绘制View主要是onDraw()中通过形参canvas来处理,相关的绘制主要有drawRect、drawLine、drawPath等等。view方法内部还重写了很多接口,其回调方法可以帮助我们判断出view的位置和大小,比如onMeasure(int, int) Called to determine the size requirements for this view and all of its children. 、onLayout(boolean, int, int, int, int) Called when this view should assign a size and position to all of its children 和onSizeChanged(int, int, int, int) Called when the size of this view has changed. 具体的作用,大家可以用Logcat获取当view变化时每个形参的变动。

下面cwjView是我们为今后游戏设计的一个简单自定义View框架,我们可以看到在Android 平台自定义view还是很简单的,同时Java支持多继承可以帮助我们不断的完善复杂的问题。

public class cwjView extends View {

public cwjView(Context context) {

super(context);

setFocusable(true); //允许获得焦点

setFocusableInTouchMode(true); //获取焦点时允许触控

}

@Override

protected Parcelable onSaveInstanceState() { //处理窗口保存事件

Parcelable pSaved = super.onSaveInstanceState();

Bundle bundle = new Bundle();

//dosomething

return bundle;

}

@Override

protected void onRestoreInstanceState(Parcelable state) { //处理窗口还原事件

Bundle bundle = (Bundle) state;

//dosomething

super.onRestoreInstanceState(bundle.getParcelable("cwj"));

return;

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) //处理窗口大小变化事件

{

super.onSizeChanged(w, h, oldw, oldh);

}

@Override

protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)

{

super.onMeasure(widthMeasureSpec, heightMeasureSpec); //如果不让父类处理记住调用setMeasuredDimension

}

@Override

protected void onLayout (boolean changed, int left, int top, int right, int bottom)

{

super.onLayout (changed,left,top, ight,bottom) ;

}

@Override

protected void onDraw(Canvas canvas) {

Paint bg = new Paint();

bg.setColor(Color.Red);

canvas.drawRect(0, 0, getWidth()/2, getHeight()/2, bg); //将view的左上角四分之一填充为红色

}

@Override

public boolean onTouchEvent(MotionEvent event) {

return super.onTouchEvent(event); //让父类处理屏幕触控事件

}

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) { //处理按键事件,响应的轨迹球事件为public boolean onTrackballEvent (MotionEvent event)

switch (keyCode) {

case KeyEvent.KEYCODE_DPAD_UP:

break;

case KeyEvent.KEYCODE_DPAD_DOWN:

break;

case KeyEvent.KEYCODE_DPAD_LEFT:

break;

case KeyEvent.KEYCODE_DPAD_RIGHT:

break;

case KeyEvent.KEYCODE_DPAD_CENTER: //处理中键按下

break;

default:

return super.onKeyDown(keyCode, event);

}

return true;

}

}

上面我们可以看到onMeasure使用的是父类的处理方法,如果我们需要解决自定义View的大小,可以尝试下面的方法

@Override

protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)

{

height = View.MeasureSpec.getSize(heightMeasureSpec);

width = View.MeasureSpec.getSize(widthMeasureSpec);

setMeasuredDimension(width,height); //这里面是原始的大小,需要重新计算可以修改本行

//dosomething

}

Android游戏开发之旅七自定义SurfaceView

今天我们说下未来的Android游戏引擎模板架构问题,对于游戏我们还是选择SurfaceView,相关的原因Android123已经在Android游戏开发之旅二View和SurfaceView中说的很清楚了,这里我们直接继承SurfaceView,实现SurfaceHolder.Callback接口,处理surfaceCreated、surfaceChanged以及surfaceDestroyed方法,这里我们并没有把按键控制传入,最终游戏的控制方面仍然由View内部类处理比较好,有关SurfaceView的具体我们可以参见Android开源项目的Camera中有关画面捕捉以及VideoView的控件实现大家可以清晰了解最终的用意。

public class cwjView extends SurfaceView implements SurfaceHolder.Callback {

public cwjView(Context context, AttributeSet attrs) {

super(context, attrs);

SurfaceHolder holder=getHolder();

holder.addCallback(this);

setFocusable(true);

}

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

public void surfaceCreated(SurfaceHolder holder) {

}

public void surfaceDestroyed(SurfaceHolder holder) {

}

@Override

public void onWindowFocusChanged(boolean hasWindowFocus) {

}

}

Android游戏开发之旅八SurfaceView类实例

有关SurfaceView我们将通过三个系统自带的例子来深入掌握Android绘图必会的SurfaceView,今天我们以SDK中的Sample游戏lunarlander中的LunarView具体实现,Android123建议大家导入该游戏工程到你的Eclipse然后自己编译先玩一下这个游戏,然后再看代码比较好理解。

class LunarView extends SurfaceView implements SurfaceHolder.Callback { class LunarThread extends Thread {

/*

* Difficulty setting constants

*/

public static final int DIFFICULTY_EASY = 0;

public static final int DIFFICULTY_HARD = 1;

public static final int DIFFICULTY_MEDIUM = 2;

/*

* Physics constants

*/

public static final int PHYS_DOWN_ACCEL_SEC = 35;

public static final int PHYS_FIRE_ACCEL_SEC = 80;

public static final int PHYS_FUEL_INIT = 60;

public static final int PHYS_FUEL_MAX = 100;

public static final int PHYS_FUEL_SEC = 10;

public static final int PHYS_SLEW_SEC = 120; // degrees/second rotate

public static final int PHYS_SPEED_HYPERSPACE = 180;

public static final int PHYS_SPEED_INIT = 30;

public static final int PHYS_SPEED_MAX = 120;

/*

* State-tracking constants

*/

public static final int STATE_LOSE = 1;

public static final int STATE_PAUSE = 2;

public static final int STATE_READY = 3;

public static final int STATE_RUNNING = 4;

public static final int STATE_WIN = 5;

/*

* Goal condition constants

*/

public static final int TARGET_ANGLE = 18; // > this angle means crash

public static final int TARGET_BOTTOM_PADDING = 17; // px below gear

public static final int TARGET_PAD_HEIGHT = 8; // how high above ground

public static final int TARGET_SPEED = 28; // > this speed means crash

public static final double TARGET_WIDTH = 1.6; // width of target

/*

* UI constants (i.e. the speed & fuel bars)

*/

public static final int UI_BAR = 100; // width of the bar(s)

public static final int UI_BAR_HEIGHT = 10; // height of the bar(s) private static final String KEY_DIFFICULTY = "mDifficulty";

private static final String KEY_DX = "mDX";

private static final String KEY_DY = "mDY";

private static final String KEY_FUEL = "mFuel";

private static final String KEY_GOAL_ANGLE = "mGoalAngle"; private static final String KEY_GOAL_SPEED = "mGoalSpeed"; private static final String KEY_GOAL_WIDTH = "mGoalWidth";

private static final String KEY_GOAL_X = "mGoalX";

private static final String KEY_HEADING = "mHeading";

private static final String KEY_LANDER_HEIGHT = "mLanderHeight"; private static final String KEY_LANDER_WIDTH = "mLanderWidth"; private static final String KEY_WINS = "mWinsInARow";

private static final String KEY_X = "mX";

private static final String KEY_Y = "mY";

/*

* Member (state) fields

*/

/** The drawable to use as the background of the animation canvas */ private Bitmap mBackgroundImage;

/**

* Current height of the surface/canvas.

*

* @see #setSurfaceSize

*/

private int mCanvasHeight = 1;

/**

* Current width of the surface/canvas.

*

* @see #setSurfaceSize

*/

private int mCanvasWidth = 1;

/** What to draw for the Lander when it has crashed */

private Drawable mCrashedImage;

/**

* Current difficulty -- amount of fuel, allowed angle, etc. Default is * MEDIUM.

*/

private int mDifficulty;

/** Velocity dx. */

private double mDX;

/** Velocity dy. */

private double mDY;

/** Is the engine burning? */

private boolean mEngineFiring;

/** What to draw for the Lander when the engine is firing */

private Drawable mFiringImage;

/** Fuel remaining */

private double mFuel;

/** Allowed angle. */

private int mGoalAngle;

/** Allowed speed. */

private int mGoalSpeed;

/** Width of the landing pad. */

private int mGoalWidth;

/** X of the landing pad. */

private int mGoalX;

/** Message handler used by thread to interact with TextView */ private Handler mHandler;

/**

* Lander heading in degrees, with 0 up, 90 right. Kept in the range * 0..360.

*/

private double mHeading;

/** Pixel height of lander image. */

private int mLanderHeight;

/** What to draw for the Lander in its normal state */

private Drawable mLanderImage;

/** Pixel width of lander image. */

private int mLanderWidth;

/** Used to figure out elapsed time between frames */

private long mLastTime;

/** Paint to draw the lines on screen. */

private Paint mLinePaint;

/** "Bad" speed-too-high variant of the line color. */

private Paint mLinePaintBad;

/** The state of the game. One of READY, RUNNING, PAUSE, LOSE, or WIN */ private int mMode;

/** Currently rotating, -1 left, 0 none, 1 right. */

private int mRotating;

/** Indicate whether the surface has been created & is ready to draw */

private boolean mRun = false;

/** Scratch rect object. */

private RectF mScratchRect;

/** Handle to the surface manager object we interact with */

private SurfaceHolder mSurfaceHolder;

/** Number of wins in a row. */

private int mWinsInARow;

/** X of lander center. */

private double mX;

/** Y of lander center. */

private double mY;

public LunarThread(SurfaceHolder surfaceHolder, Context context, Handler handler) {

// get handles to some important objects

mSurfaceHolder = surfaceHolder;

mHandler = handler;

mContext = context;

Resources res = context.getResources();

// cache handles to our key sprites & other drawables

mLanderImage = context.getResources().getDrawable( https://www.360docs.net/doc/211392348.html,nder_plain);

mFiringImage = context.getResources().getDrawable(

https://www.360docs.net/doc/211392348.html,nder_firing);

mCrashedImage = context.getResources().getDrawable( https://www.360docs.net/doc/211392348.html,nder_crashed);

// load background image as a Bitmap instead of a Drawable b/c // we don't need to transform it and it's faster to draw this way mBackgroundImage = BitmapFactory.decodeResource(res, R.drawable.earthrise);

// Use the regular lander image as the model size for all sprites mLanderWidth = mLanderImage.getIntrinsicWidth();

mLanderHeight = mLanderImage.getIntrinsicHeight();

// Initialize paints for speedometer

mLinePaint = new Paint();

mLinePaint.setAntiAlias(true);

mLinePaint.setARGB(255, 0, 255, 0);

mLinePaintBad = new Paint();

mLinePaintBad.setAntiAlias(true);

mLinePaintBad.setARGB(255, 120, 180, 0);

mScratchRect = new RectF(0, 0, 0, 0);

mWinsInARow = 0;

mDifficulty = DIFFICULTY_MEDIUM;

// initial show-up of lander (not yet playing)

mX = mLanderWidth;

mY = mLanderHeight * 2;

mFuel = PHYS_FUEL_INIT;

mDX = 0;

mDY = 0;

mHeading = 0;

mEngineFiring = true;

}

/**

* Starts the game, setting parameters for the current difficulty.

*/

public void doStart() {

synchronized (mSurfaceHolder) {

// First set the game for Medium difficulty

mFuel = PHYS_FUEL_INIT;

mEngineFiring = false;

mGoalWidth = (int) (mLanderWidth * TARGET_WIDTH);

mGoalSpeed = TARGET_SPEED;

mGoalAngle = TARGET_ANGLE;

int speedInit = PHYS_SPEED_INIT;

// Adjust difficulty params for EASY/HARD

if (mDifficulty == DIFFICULTY_EASY) {

mFuel = mFuel * 3 / 2;

mGoalWidth = mGoalWidth * 4 / 3;

mGoalSpeed = mGoalSpeed * 3 / 2;

mGoalAngle = mGoalAngle * 4 / 3;

speedInit = speedInit * 3 / 4;

} else if (mDifficulty == DIFFICULTY_HARD) {

mFuel = mFuel * 7 / 8;

mGoalWidth = mGoalWidth * 3 / 4;

mGoalSpeed = mGoalSpeed * 7 / 8;

speedInit = speedInit * 4 / 3;

}

// pick a convenient initial location for the lander sprite

mX = mCanvasWidth / 2;

mY = mCanvasHeight - mLanderHeight / 2;

// start with a little random motion

mDY = Math.random() * -speedInit;

mDX = Math.random() * 2 * speedInit - speedInit;

mHeading = 0;

// Figure initial spot for landing, not too near center

while (true) {

mGoalX = (int) (Math.random() * (mCanvasWidth - mGoalWidth));

if (Math.abs(mGoalX - (mX - mLanderWidth / 2)) > mCanvasHeight / 6) break;

}

mLastTime = System.currentTimeMillis() + 100;

setState(STATE_RUNNING);

}

}

安卓开发环境搭建教程及个人经验

安卓入门教程及环境搭建(附笔记) ------By 仙人张 需要的软件包有三个,截止到2012年7月这些软件都是最新版本的:分别是JDK、SDK、Eclipse(版本4.2 Juno)他们的名字和大小如下 一、软件包的下载 1、JDK的下载(jdk-7u5-windows-i586) https://www.360docs.net/doc/211392348.html,/technetwork/java/javase/downloads/index.html

2、SDK的下载(installer_r20-windows)https://www.360docs.net/doc/211392348.html,/sdk/index.html 3、Eclipse的下载(eclipse-jee-juno-win32)https://www.360docs.net/doc/211392348.html,/downloads/

二、软件安装 说说我的文件夹是怎么安排的,软件安装前先在自己安装软件的那个盘新建一个文件夹名字可以取为Android,然后这三个软件分别安装到里面的三个文件夹里就可以了,然后在Android文件夹里新建一个文件夹专门放自己的工程文件。 1、JDK的安装 上面下载的jdk-7u5-windows-i586是一个安装包,直接双击就可以安装了,记得路径选择Android文件夹里的Java 文件夹。 2、Eclipse的安装 上面下载的eclipse-jee-juno-win32是一个压缩包,解压后就可以直接用了,将解压后的文件夹eclipse-jee-juno-win32也放在Android文件夹下。 3、SDK的安装 上面下载的installer_r20-windows是一个安装包,将它安装到Android文件夹里的android-sdk文件夹。 装好以后像我的文件夹就是这样了

基于android的游戏开发开题报告总结.doc

开题报告 (1)研究的目的和意义 Android 操作系统最初是由 Andy Rubin 制作,最初主要支持手机,在2005 年被搜索巨头 Google 收购注资,并组建开放手机联盟开发改良随后,逐渐扩展到平板电脑及 其他领域上,2008年全球第一步安卓智能手机问世,标志着安卓的重生。而在2011 年 11 月份的调查, android 智能机一跃超过苹果,以全球市场占有率76%,中国 90% 遥遥领先。在安卓手机中以三星的GALAXY III系列为领头羊,领跑安卓手机最新科技。 当人类步入 21 世纪,随着科技的日趋发展,智能手机 ,平板电脑等高端电子产品进 入了我们的日常生活,随着 3G 时代已经慢慢的融入了我们的日常生活,随着社会的进 步和科技的发展手机已经从单纯的通讯工具转变为集娱乐,学习,通讯为一体的高端电子 产品,随着诺基亚塞班系统的没落,安卓系统迎来了春天。据市场调查,智能手 机市场已经形成了二足鼎力的态势,安卓和苹果的 IOS作为领军者遥遥领先于 windows phone 系统。同时各种 android 应用程序已经有了比较明朗的发展前景,尤其以手机游 戏这个亮点受到广泛的关注和喜爱,正是由于android 拥有广大的用户群, android 手 机游戏拥有巨大的潜力,它也主宰者手机游戏的未来,此次毕业设计顺应时代发展潮 流,依托现在硬件上的优势,以 android 为平台,旨在玩家打造一款优秀的安卓小游戏, 使玩家身临其境,爱不释手。在安卓游戏的市场上,使得 android 手机游戏种类更加丰 富多彩,为安卓手机游戏的发展做出贡献。 (2)国外同类研究的概况 手机游戏种类和资源日益丰富,游戏界面越来越华丽,游戏规则日益复杂,已经 具备了很强的娱乐性和交互性的复杂形态。 2003 年 10 月,Andy Rubin 等人创建了 Android 公司,google 公司于 2005 年 8 月 17 日低调收购 android 以及其团队,Andy Rubin 成为 Google 公司 android 项目工程部

android课程设计报告(数独游戏)讲解

河南科技学院 《物联网移动应用开发》课程设计报告 设计题目:基于android的数独游戏设计 班级:物联网131 学号:2013156555 姓名:胡建刚 指导教师:许睿 成绩:

信息工程学院 课程设计报告说明 一、写报告前,请认真阅读《课程设计报告说明》。 二、打印装订要求 1、一律用A4纸,双面打印,并左侧装订。报告正文部分均 采用宋体小四。《课程设计报告说明》页也打印。 2、课程设计概述部分占一页;课程设计内容长度根据实际需要填写;结论和指导教师评语及成绩单独占一页。保证打印格式工整。 3、指导教师评语及成绩部分由指导教师填写。 三、报告内容要求 1、课程设计目的结合实际自己写,不要雷同。 2、课程设计原理简要说明所完成课程设计项目所涉及的理论 知识。 3、课程设计内容这是课程设计报告极其重要的内容。概括整个课程设计过程。(最好在上述内容基础上画出相应的流图、 设计思路和设计方法,再配以相应的文字进行说明。)

一、课程设计概述 1、课程设计目的 通过对android的学习,编写除了这个数独游戏,掌握android的控件知识的使用,和界面的制作。对java知识的应用。这样不仅对自身android的学习可以更上一层楼,而且这个游戏可以锻炼智力,游戏简单,适合多人群游戏,健康,益智的 游戏。 2、课程设计要求 1. 熟悉eclipse开发软件,熟练使用java和xml。 2. 学习和掌握android的四大组件的使用。 3. 熟练掌握Android 游戏开发多线程技术、Android 游戏开发的图形处理技术等。 4. 完成程序的编写工作。 5. 完成程序在模拟器上的实现,以及在安卓手机上的功能实现,并完成优化。 3、课程设计原理 基于数独游戏规则,通过java建立一系列的算法。然后利用android的控件知识建立一系列的界面。包括背景的制作。

学习android的心得体会

学习android的心得体会 【篇一:android实训心得体会】 项目总结 时间过的好快,为期三个月的实训生活即将结束了,每一次的实训我们都受益匪浅,我 们学到的不仅仅是课内还有课外,实训让我们的课内知识得到了巩固,专业知识、编程水平 都有很大的提高,我们非常感谢这次实训。刚开始二周的高强度的课程安排让我们受益匪浅;接下来的项目实训又让我们可以巩固 了课程。这让我觉得实习生活充实而有意义。乐淘购物项目和android优化大师,我更好的学习了ui的设计,如何使界面漂亮,美观, 巩固了listview,gridview,的使用,学会了动画进入界面的,和会移动的画廊等等。在这 两个项目中,除了让我明白工作中需要能力,素质,知识之外,更重要的是学会了如何去完 成一个任务,懂得了享受工作。当遇到问题,冷静,想办法一点一点的排除障碍,到最后获 取成功,一种自信心由然而生,这就是工作的乐趣。有时候也需要虚心请教,从别人的身上 真得能学习到不自己没有的东西,每一次的挫折只能使我更接近成功。音乐播放器项目,我们是七个人组成小组完成的,由组长带领我们,分配任务,每个人, 都发挥自己的长处,更好地去完成任务。对于团队开发来说,团结一致使我深有体会。团队 的合作注重沟通和信任,不能不屑于做小事,永远都要保持亲和诚信,把专业理论运用到具 体实践中,不仅加深我对理论的掌握和运用,还让我拥有了一次又一次难忘的开发经历,这是也是实训最大的收获。这次实训对于我以后学习、找工作也真是受益菲浅,在这3个月中让我初步从理性回到 感性的重新认识,也让我初步的认识这个社会,对于以后做人所应把握的方向也有所启发!

Android游戏开发(快速入门必备)

Android游戏开发之旅一长按Button原理 今天Android123开始新的Android游戏开发之旅系列,主要从控制方法(按键、轨迹球、触屏、重力感应、摄像头、话筒气流、光线亮度)、图形View(高效绘图技术如双缓冲)、音效(游戏音乐)以及最后的OpenGL ES(Java层)和NDK的OpenGL和J2ME游戏移植到Android方法,当然还有一些游戏实现惯用方法,比如地图编辑器,在Android OpenGL如何使用MD2文件,个部分讲述下Android游戏开发的过程最终实现一个比较完整的游戏引擎。相信大家都清楚Android Market下载量比较好的都是游戏,未来手机网游的发展相信Android使用的Java在这方面有比iPhone有更低的入门门槛。 对于很多游戏使用屏幕控制一般需要考虑长按事件,比如在动作类的游戏中需要长按发射武器,结合Android Button模型,我们实现一个带图片的Button的长按,为了更清晰的显示原理,Android开发网这里使用ImageButton作为基类 public class RepeatingImageButton extends ImageButton { private long mStartTime; //记录长按开始 private int mRepeatCount; //重复次数计数 private RepeatListener mListener; private long mInterval = 500; //Timer触发间隔,即每0.5秒算一次按下 public RepeatingImageButton(Context context) { this(context, null); } public RepeatingImageButton(Context context, AttributeSet attrs) { this(context, attrs, android.R.attr.imageButtonStyle); } public RepeatingImageButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setFocusable(true); //允许获得焦点 setLongClickable(true); //启用长按事件 } public void setRepeatListener(RepeatListener l, long interval) { //实现重复按下事件listener mListener = l; mInterval = interval; } @Override public boolean performLongClick() { mStartTime = SystemClock.elapsedRealtime(); mRepeatCount = 0;

Android开发入门书籍推荐

Android开发入门书籍推荐 Android编程入门教程andbook andbook是我看到的最简单但最好的Android程序开发入门书籍,内容仅有60多页,图文并茂,如果你从来没有接触过Android开发,也完全可以通过阅读此书了解程序开发过程,甚至对APK程序的基本原理和Android UI界面开发有个清晰的认识,相信你花上几个小时读过后,一定会跃跃欲试加入Android开发行列,心动吧,那就行动吧。。。 Android应用开发详解 Android应用开发详解是一本Android应用开发书籍,既适合Android初学者,也适合具备了一定Android开发经验但需要开发案例的高级读者。该书分为三个部分,共18章,由浅入深地详细介绍了Android的每个开发细节。该书基础翔实,实例丰富,案例真实。从基础到案例覆盖了Android应用开发的三大领域:基础应用、网络应用和游戏应用。读者所需要学习的,正是该书描述的。

深入浅出Android–Google手持设备应用程序设计 入门书籍,作者写的很不错,可以在阅读SDK的同时阅读这本书,中间的一些使用介绍的非常清楚,最重要的是中文版的 Google Android应用框架原理与程式设计36技 最早介绍Android的中文书籍,台湾人写的繁体版的,看得有些影响,不过还是值得耐心阅读的 Android A Programmer’s Guide

多个专家写的介绍Android的书籍,内容写的很不错,Ask the Expert部分针对一些问题作了详细的说明 Android Essentials 对Android介绍的比较全面,从安装到开发,应该有新版本了。 Google Android SDK开发范例大全(第2版)

安卓(Android)游戏以及手机游戏开发的详细步骤

安卓(Android)游戏以及手机游戏开发的详细流程【精华版】 >>首先说游戏设计部门 通常这是如下职位:游戏设计主负责(也有称主策划) 执行游戏设计师(称执行策划):分剧情策划,数据策划,也有不分的,大家一起提高。辅助员(称辅助策划):做一些比较简单的表据维护,资料收集。 工作职责: 游戏设计主负责人:主要负责游戏设计的整体把握、给大家安排工作,审核工作,提高部门人员士气。, 剧情策划一般负责背景,任务等等故事性比较强的,要求文笔要好 数据策划再细分,为规则和数据平衡,包括规则的描述,公式确定,数据表设定等等。 辅助员,主要是收集资料,维护表格等等,比较不涉及核心的工作。 *注:有一些公司或者团队,在策划岗位,还有新的岗位,如: 表现策划:主要负责特效、动作、音效收集并提需求,部分如音效部分亦有策划来完成。资源策划:主要负责UI设计,模型相关配置,资源管理等等。

>>下面是程序部门 主程序与主设计师,是对游戏引擎最了解的人,以主程序为最强。主程的主要工作,安排程序部门工作,定游戏的数据结构,定一些主要方案的完成方法。 一般程序员,分服务器端与客户端、服务器端程序,对于数据库结构,数据传输、通讯方式等等。客户端程序,对图像及优化有研究的会易受重用。 >>美术部门 主美负责整体美术风格的把握 原画绘制原画交于3D 2D负责贴图,游戏界面等的制作 3D负责3D建模,动作等方面工作

>>脚本与编辑器 在具体游戏实现时,越来越多的公司不会说把游戏中的数据写在C++里,而是用“脚本与数据库”的方式。 C++的作用是用来解释脚本和调用数据库的 在脚本中,写上, if { player hp >=30%hpmax add hp=hpmax } 这里的东西是写在脚本里的,C++就会解释,player、hp、hpmax是什么,hp、hpmax 对应数据库是什么列主要的游戏内核是写在C里的,脚本用来实现游戏具体的一些东西。如每个场景、每个NPC、每个道具都有可能有个脚本文件制定命令及数据一般由主程与主设计师一起来做,具体写脚本,一般为游戏设计部门按规范做这个工作。 编辑器:是高于脚本的一个给游戏设计部门或是美术部门用的工作工具优点是使用简单,界面化的东西,可以自动生成脚本。 缺点是,把一些比较活的东西,写死到工具中了,将来要加功能改结构很麻烦 这些都是程序部门的工作 另外,在程序部门中主要交流就是服务器端与客户端的。这实际就是说,一个游戏主体置放与传输的问题。

Android游戏与应用开发最佳学习路线图

Android游戏与应用开发最佳学习路线图 为了帮助大家更好的学习Android,并快速入门特此我们为大家制定了以下学习路线图,希望能够帮助大家。 一、路线图概括: 二、具体需要掌握知识点:

三、 具体知识点与目标 Java 三、 具体知识点与目标 Java 基础

Android游戏与应用开发

四、免费在线视频教程 Android教程之Android简介 https://www.360docs.net/doc/211392348.html,/zxjc/122.html Android教程之Android-HelloWorld https://www.360docs.net/doc/211392348.html,/zxjc/123.html Android教程之Android 应用程序基本原理 https://www.360docs.net/doc/211392348.html,/zxjc/124.html Android教程之Android 用户界面布局简介 https://www.360docs.net/doc/211392348.html,/zxjc/125.html Android教程之Android 用户界面-选项菜单 https://www.360docs.net/doc/211392348.html,/zxjc/126.html

Android教程之Android 用户界面-使用XML文件创建菜单 https://www.360docs.net/doc/211392348.html,/zxjc/127.html Android教程之Android 用户界面-上下文菜单 https://www.360docs.net/doc/211392348.html,/zxjc/128.html Android教程之Android 用户界面-创建子菜单 https://www.360docs.net/doc/211392348.html,/zxjc/129.html Android教程之Android 用户界面-对话框 https://www.360docs.net/doc/211392348.html,/zxjc/130.html Android教程之Android 用户界面-其他常见的对话框 https://www.360docs.net/doc/211392348.html,/zxjc/131.html Android教程之Android 用户界面Toast https://www.360docs.net/doc/211392348.html,/zxjc/132.html Android教程之Android 用户界面-布局管理 https://www.360docs.net/doc/211392348.html,/zxjc/133.html Android教程之Android 用户界面-布局管理-相对布局 https://www.360docs.net/doc/211392348.html,/zxjc/172.html Android教程之Android 用户界面-表格布局 https://www.360docs.net/doc/211392348.html,/zxjc/173.html Android教程之Android 用户界面-表格布局2 https://www.360docs.net/doc/211392348.html,/zxjc/174.html Android教程之Android 中的事件处理 https://www.360docs.net/doc/211392348.html,/zxjc/175.html Android教程之Android 用户界面-常用组件 https://www.360docs.net/doc/211392348.html,/zxjc/176.html Android教程之Android 用户界面-自动完成文本框(AutoCompleteTextView) https://www.360docs.net/doc/211392348.html,/zxjc/177.html Android教程之Android 用户界面-ListView

android游戏开发教程

一章概述了Android 的历史,引出了本书其余部分将涉及的概念。现在你可能迫不及 待地想编写代码了。本章首先介绍使用Android SDK 开发应用程序的前提条件,学习安装开发环境。接下来,将逐步演示“Hello World!”应用程序,之后详细分析一个稍大型的应用程序。然后将解释Android 应用程序生命周期,最后简单讨论使用A VD (Android Virtual Devices ,Android 虚拟设备)调试应用程序。 要为Android 开发应用程序,需要JDK (Java SE Development Kit ,Java SE 开发工具包)、Android SDK 和一个开发环境。严格来讲,可以使用简单的文本编辑器开发应用程序,但本书将使用常见的Eclipse IDE 。Android SDK 需要JDK 5或更高版本(我们在示例中使用的是JDK 6)和Eclipse 3.3或更高版本(我们使用的是Eclipse 3.5,也叫Galileo )。本书使用Android SDK 2.0。 最后,为了使开发过程更加简单,需要使用ADT 。ADT 是一个Eclipse 插件,支持使用Eclipse IDE 开发Android 应用程序。实际上,本书中的所有示例都是结合使用Eclipse IDE 和ADT 工具开发的。 上

2.1 安装环境 21 2 2.1 安装环境 要开发Android 应用程序,需要建立一个开发环境。本节将介绍如何下载JDK 6、Eclipse IDE 、Android SDK 和ADT ,以及如何配置Eclipse 来开发Android 应用程序。 Android SDK 兼容Windows (Windows XP 、Windows Vista 和Windows 7)、Mac OS X (仅限英特尔平台)和Linux (仅限英特尔平台)。本章将展示如何为所有这些平台建立环境(对于Linux ,我们仅介绍Ubuntu 版本)。我们不会在其他章讨论与平台差异有关的细节。 2.1.1 下载JDK 6 首先需要的是JDK 。Android SDK 需要JDK 5或更高版本,我们使用JDK 6来开发本书中的示例。对于Windows 来说,从Sun 网站(https://www.360docs.net/doc/211392348.html,/javase/downloads/)下载JDK 6并安装。只需要JDK ,不需要其他程序包。对于Mac OS X 来说,从苹果公司网站(http://developer. https://www.360docs.net/doc/211392348.html,/java/download/)下载JDK ,选择适用于具体的Mac OS 版本的文件,然后安装。要安装JDK for Linux ,打开一个终端窗口并键入以下命令: sudo apt-get install sun-java6-jdk 这将安装JDK 及任何依赖关系,比如JRE (Java Runtime Environment ,Java 运行时环境)。 接下来,设置JAVA_HOME 环境变量以指向JDK 安装文件夹。在Windows XP 机器上,可以转到“开始”?“我的电脑”,右键单击并选择“属性”,选择“高级”选项卡,然后单击“环境变 量”。单击“新建”添加JAVA_HOME 变量,如果该变量已存在,单击“编辑”修改它。JAVA_HOME 的值类似于C:\Program Files\Java\jdk1.6.0_16。对于Windows Vista 和Windows 7,调出“ 环境变

基于Android平台的手机游戏开发【开题报告】

毕业设计开题报告 计算机科学与技术 基于Android平台的手机游戏开发 一、选题的背景、意义 手机游戏是相对于传统计算机游戏而提出。通俗来说,手机游戏就是在手机上进行游戏应用。 最早手机游戏是1997年Nokia 推出手机内置游戏贪吃蛇(Snake)。随着手机终端和移动通信网络不断发展,手机游戏也正在经历由简单到复杂进化过程。 2003年9月,随着移动百宝箱正式收费,国内手机游戏产业正式启动,用户增长十分迅速。短短几个月时间里,手机游戏用户就增长到200万。此后时间里,手机游戏用户规模一路高歌猛进,在2005年时即突破1500万。 近年来,因特网在国内迅速普及,导致了网络游戏的高速发展。同样手机的普及,导致了手机游戏市场呈现爆炸式的发展。尤其是国内外巨大的手机拥有量,更是让商家看到了商机,手机游戏市场利润将会十分丰厚。面对潜力如此巨大的手机游戏市场,各游戏开发商,运营商,服务商以及手机终端厂商等都纷纷开始了各自的应战准备,以便抢占商机。 诺基亚,索爱,摩托罗拉等各大手机厂商开始不断的提升手机在游戏方面的性能,同时还在手机操作系统方面采用开放式的平台,方便用户享受不同的手机游戏业务。而国内游戏开发商,如盛大,网易等公司,纷纷跻身手机游戏开发商行列.新浪,搜狐等著名的门户网站,也纷纷涉足手机游戏领域,相继开辟了各自的手机游戏频道和栏目,其他一些游戏网站也都全面加快了手机游戏开发的步伐。目前Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统Android在智能手机领域这块虽然不是做的最早的,但是现在确实做的最好的,市场满意度和市场份额也是整个智能机市场里较大的一个。 据了解,最早进入Android市场的台湾宏达电陆续在一年内推出了G1、Magic、Hero、Tattoo等手机,三星也在近期推出Galaxyi7500,摩托罗拉在早前推出新款Android手机Droid,中国移动也以Android 为基础开发了OPhone平台。这些都证明Android已经成为了智能手机市场的重要发展趋势。

android游戏开发入门: 贪吃蛇 源代码分析

android游戏开发入门:贪吃蛇源代码分析 贪吃蛇是一款足够经典的游戏。它的经典,在于用户操作的简单,在于技术实现的简介,在于他的经久不衰。这里的贪吃蛇的android实现,是SDK Samples中的开源例程。可能各位都有看过~界面如下图啦~ 作为一个刚入门或者还没入门的新手,着实花了我一些力气来理解这段代码。对于各种不懂的地方,慢慢查询资料,对于新的方法,通过修改代码尝试效果。到现在终于能算个一知半解。在代码中,对于自己有所收获的地方,我都做了相应的注释。回过头来,觉得从这段代码中,能学到不少东西~~包括android应用的基本架构,他的面向对象的思想,以及代码的简洁明了。于是,我想到,何不将这些东西分享出来,如果碰巧对感兴趣的朋友们有搜帮助,那就更好了~好了,闲话不说~代码和注释如下(处于对源码的敬意,原本 的英文注释部分都没有删去~大家可以配合理解):PS:最近我正在写自己的“贪吃蛇”,说事贪吃蛇,其实完全颠覆了这 个经典版本的设计理念和操作方式。具体细节先卖一个关子,作品准备参加这次第二届大学生android应用开发大赛。应该一个月内能完成,到时候也会开源出代码来~欢迎大家讨 论指 正·~*************************************************************

****************************************************************** *****Snake工程中,总共有三个文件:*TileView是基于Android的View类实现的方块图类,用来支撑上层类的调用,绘制方块图的显示界面。通过这些代码,能打之了解如何扩展View,实现特色的界面效果。*SnakeView调用了TileView,实现了游戏逻辑和具体的显示。*Snake为主Activity类。建议大家按照上面的顺序看三个文件,可能逻辑上更舒服一点~~下面贴上代码和注释。PS: 调试版本为android2.2。其他版本应该也没问题吧,不过得用虚拟机。因为它是上下左右按键操作,现在大多数android机是没有方向键的吧。TileView.javapackage com.example.android.snake;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.view.View;/** * TileView: a View-variant designed for handling arrays of 'icons' or other * drawables. * */public class TileView extends View { /** * Parameters controlling the

基于Android游戏开发概要设计

基于Android游戏开发--疯狂连连看 ----概要设计 说明书 一、引言?错误!未定义书签。 1.1、编写目的?错误!未定义书签。 1.2、背景?错误!未定义书签。 1.3、定义?错误!未定义书签。 1.4、参考资料?错误!未定义书签。 二、总体设计?错误!未定义书签。 2.1、需求规定......................................................................................... 错误!未定义书签。 2.2、运行环境?错误!未定义书签。 2.3、基本设计概念和处理流程........................................................... 错误!未定义书签。 2.4、结构?错误!未定义书签。 2.5、功能需求与程序的关系................................................................. 错误!未定义书签。 2.6、人工处理过程?错误!未定义书签。 2.7、尚未解决的问题?错误!未定义书签。 三、接口设计................................................................................................... 错误!未定义书签。 3.1、用户接口......................................................................................... 错误!未定义书签。 3.2、外部接口?错误!未定义书签。 3.3、内部接口?错误!未定义书签。 四、运行模块组合?9 4.1、运行模块组合?错误!未定义书签。 4.1.1、播放器的基本界面模块........................ 错误!未定义书签。 4.2.2、播放器的播放界面模块......................... 错误!未定义书签。 4.2、运行控制?错误!未定义书签。 4.2、运行时间?错误!未定义书签。 五、系统数据结构设计?错误!未定义书签。 5.1、逻辑结构设计要点?错误!未定义书签。 5.2、物理结构设计要点?错误!未定义书签。 5.3、数据结构与程序的关系............................................................. 错误!未定义书签。 六、系统出错处理设计?错误!未定义书签。 6.1、出错信息......................................................................................... 错误!未定义书签。 6.2、补救措施?错误!未定义书签。 6.3、系统维护设计?错误!未定义书签。

Android开发的发展与前景

Android开发的发展与前景 本文分以下四个方面论述。 一、Android系统的产生和发展 二、Android系统的市场前景 三、Android软件开发的趋势和前景 四、Android软件开发人员的就业前景 一、Android系统的产生和发展 1系统简介 安卓系统即android (Google公司开发的操作系统)。 Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,

由Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android 智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。2012年7月美国科技博客网站BusinessInsider评选出二十一世纪十款最重要电子产品,Android操作系统和iPhone等榜上有名。2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。 2014第一季度Android平台已占所有移动广告流量来源的42.8%,首度超越iOS。

初学者对Android开发的认识

初学者对Android开发的认识 Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。 Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。 早期由原名为"Android"的公司开发,谷歌在2005年收购"Android.Inc"后,继续进行对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。 2011年初数据显示,仅正式上市两年的操作系统Android已经超越称霸十年的塞班系统,使之跃居全球最受欢迎的智能手机平台。现在,Android系统不但应用于智能手机,也在平板电脑市场急速扩张。采用Android系统主要厂商包括台湾的HTC,(第一台谷歌的

手机G1由HTC生产代工)美国摩托罗拉,SE等,中国大陆厂商如:华为、中兴、联想等。 随着采用Android系统的谷歌手机、平板电脑等产品逐渐扩大市场占有率,Android 平台人才的缺口日益显现。据业内统计,目前国内的3G研发人才缺口有三、四百万,其中Android研发人才缺口至少30万。 Android开发人才占总需求的72%。 职场专家指出,想要从事Android开发的人员,除了基础的计算机技术知识要扎实之外,要根据各类企业、各类岗位的不同需求,补充与岗位相关的Android技术知识。此外,还要注重项目经验的积累。 据职酷网数据统计显示:目前热招的Android技术相关岗位约有3882个,而一个月内的有效岗位量在2298个。主要热招职位包括Android开发工程师、Android软件工程师、Android应用开发工程师、系统驱动工程师,Android手机游戏开发、Android系统软件开发、Android程序员、Android游戏应用版本管理、人机交互分析工程师、Android 中间层开发工程师等。 从人才需求类型来看,目前对Android人才需求一类是偏向硬件驱动的Android人才需求,一类是偏向软件应用的Android人才需求。从目前的招聘需求来看,后者的需求最大,包括手机游戏、手机终端应用软件和其他手机应用软件的开发。据职酷网职位搜索库统计显示,目前企业对这类应用软件的Android开发人才占总需求的72%。 职业专家分析说,由于目前Android技术较新,无论是相关书籍、培训还是大学教育,都处于初级阶段,因此Android人才短期将供不应求。从长期来看,随着各种移动应用和手机游戏等内容需求日益增加,也将激励大中小型手机应用开发商加大对Android应用的开发力度,因此Android人才的就业前景也非常广泛。 做Android开发要培养沟通交流能力、以及团队协作能力和项目经验的积累,“项目是

android连连看手机游戏开发设计说明书

Android手机软件开发设 计说明书 题目: Android 连连看 姓名:方国强 学号: 2009113005 班级: 09软件 指导教师:李红军 完成日期: 2011.12.18

目录 第一章功能介绍 (2) 1.1功能描述 (2) 1.2功能特点 (2) 第二章系统的设计实现 (3) 2.1结构设计 (3) 2.2设计实现 (3) 2.2.1 设计思想. (3) 2.2.2 具体实现 (4) 2.2.3 界面设计说明. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7 2.2.4主要算法设计说. . . . . . . . . . . . . . . . . . . . . . .10 总结 (11) 参考文献 (12)

Andorid连连看系统设计说明书 第一章功能介绍 1.1功能描述 在连连看游戏中,两张相同图片之间存在通路的条件就是两张图片间某条路径中含有的拐角数不超过两个并且没有其它图片存在。基于这一基本功能完成的同时,这个连连看还有以下一些功能: 1、计时器:在游戏过程中同步设置一个计时器,需在规定时间内完成游戏,否则就为游戏失败。 2、游戏难度:可以在游戏开始时设置游戏难易程度,其实就是规定时间的不同。游戏的难易程度可以再窗体的游戏难度显示栏上显示。 3、暂停:在游戏过程中,玩家可以根据自己的需要暂停游戏,点击start 键后又可以返回游戏。 4、路径显示:游戏过程中,如果两张所选的相同图片之间存在着通路,就可以用连线显示该组图片间的一条路径,便于玩家观察。 1.2 功能特点 1、用于为玩家提供操作提示,便于玩家了解游戏的规则。 2、用于为玩家提供可视化的游戏界面,增加了游戏的可玩性。 3 、当用户选择菜单时能够快速反应,以满足用户的要求。 4、完成图片的消除功能,消除时画线功能,重新排列功能。

基于Android平台的数独游戏设计与实现_郭东恩

总第269期 2012年第3期 计算机与数字工程 Computer &Digital Engineering Vol.40No.3 46   基于Android平台的数独游戏设计与实现* 郭东恩 吴 刚 (南阳理工学院软件学院 南阳 473000) 摘 要 该文开发了益智类数独手机游戏。该游戏以多种输入方式及良好的用户界面呈现丰富的数字谜团,为各种用户提供一个简单小巧的娱乐平台。游戏基于Android平台开发实现,可以运行于任意主流的Android手机中。 关键词 Android;SQLite;XML;数独游戏 中图分类号 TP31l Design and Implementation of Sudoku Game Based on Android GUO Dong en WU Gang (School of Software,Nanyang Institute of Technology,Nanyang 473000) Abstract The Sudoku mobile game was developed which shows rich digital mystery through using variety of input methods and a gooduser interface.It provides a simple and lovely entertainment platform for users.This game’s achievement is based on the Android platform,it can run on any Android phones in the mainstream. Key Words Android,SQLite,XML,Sudoku game Class Number TP31l 1 引言 随着人们对便携需求的不断变化,移动设备越来越普及,进入了寻常百姓的生活当中。然而随着生活水平的不断提高,人们对移动设备的要求也越来越高,移动设备开始向微型化智能化方向发展。手机游戏由于具有随时、随地、随身的特性开始在游戏市场占据越来越大的市场份额。手机游戏软件已成为手机应用软件中使用率最高的一类。根据艾瑞咨询集团(iResearch)调查预测,到2012年,全球手机游戏收入将由2007年的32亿美金增长至72亿美金[1]。由此可见,手机游戏开发行业已经成为软件开发行业中的一枝奇葩。成为广大程序开发人员的一块沃土。Google和33个巨头联袂推出Android平台,迅速占领市场,成为互联网移动设备的主角,引领时代的发展方向[2~4]。 在经济文化日益发展的今天,人民的生活水平得到了很大的提高。生活在钢筋混凝土大都市里的人群,每天都要面对各种各样的生活压力,为了给大家提供最好的思维锻炼,缓解人们工作压力,放松和休息大脑,开发了休闲益智类数独手机游戏。 2 系统需求分析及模块设计 “数独”的前身为“九宫格”,最早起源于中国,之后在欧美、日本等国家得到了广泛的传播。2004年,第一个“数独”游戏被刊登上了英国《泰晤士报》的封面,此时开始“数独”游戏才真正为世界所知晓。由于此游戏操作简单,不需要特定的语言基础,也不需要进行数字运算且可玩性高、锻 炼思维、开发大脑,被称为21世纪的“思维体操”[5]。 “数独”游戏是一个单机的益智型游戏,主要是提供欢迎界面、用户帮助、 难易程度选择、游戏操作及保存退出等功能。核心操作是在一个划分为9块九宫格的9×9方格中,分别填上1~9这九个数字,使之每行、每列及每个九宫格中皆有数字1~9出现。 图1 “数独”游戏功能模块图 根据对“数独”游戏的功能 进行分析归纳,规划出了用户 许可协议、欢迎动画模块、游戏 菜单模块、游戏介绍模块、游戏 主模块、帮助模块、关于模块、 退出模块等八大模块,具体功 能模块结构如图1所示。 3 系统主要技术及开发模式 3.1 系统使用的主要技术 由于手机游戏开发的独特性及“数独”游戏本身的特点及要求,开发该游戏时使用的主要技术如下 1)Android平台开发技术 Android作为互联网移动平台中的佼佼者,以其强大的可移植性,良好的兼容性和稳定性,迅速成互联网手机时代的领头羊。由于Android是相对比较新的技术,下面对其主要技术简单概述[1,6]。 (1)Activity是Android四大控件中最主要的一个,是人机交互的门面,通过Activity的调用可以很方便的调用view类的视图对象,进而显示相应的界面信息。Activity *收稿日期:2011年9月7日,修回日期:2011年10月15日作者简介:郭东恩,男,讲师,硕士,研究方向:计算机软件及数据库。

安卓入门笔记及开发环境搭建教程

安卓入门教程及环境搭建(附笔记) 需要的软件包有三个,截止到2012年7月这些软件都是最新版本的:分别是JDK、SDK、Eclipse(版本4.2 Juno)他们的名字和大小如下 一、软件包的下载 1、JDK的下载(jdk-7u5-windows-i586) https://www.360docs.net/doc/211392348.html,/technetwork/java/javase/downloads/index.html

2、SDK的下载(installer_r20-windows)https://www.360docs.net/doc/211392348.html,/sdk/index.html 3、Eclipse的下载(eclipse-jee-juno-win32)https://www.360docs.net/doc/211392348.html,/downloads/

二、软件安装 说说我的文件夹是怎么安排的,软件安装前先在自己安装软件的那个盘新建一个文件夹名字可以取为Android,然后这三个软件分别安装到里面的三个文件夹里就可以了,然后在Android文件夹里新建一个文件夹专门放自己的工程文件。 1、JDK的安装 上面下载的jdk-7u5-windows-i586是一个安装包,直接双击就可以安装了,记得路径选择Android文件夹里的Java 文件夹。 2、Eclipse的安装 上面下载的eclipse-jee-juno-win32是一个压缩包,解压后就可以直接用了,将解压后的文件夹eclipse-jee-juno-win32也放在Android文件夹下。 3、SDK的安装 上面下载的installer_r20-windows是一个安装包,将它安装到Android文件夹里的android-sdk文件夹。 装好以后像我的文件夹就是这样了

相关文档
最新文档