Android游戏返回菜单,Android开发教程:游戏过程中按Home键后返回游戏界面

症状:游戏过程中,按下Home键返回手机主菜单,再点击游戏图标试图返回游戏的时候屏幕黑的一片!

以前一直没在意只有结束线程在运行游戏,今天觉得改仔细琢磨一下这个问题了!

首先第一件事:打印Logo看看按下Home键后会调用哪些方法,结果如下:

游戏过程中按下Home后:

11-29 20:42:07.090: I/System.out(18835): Activity onPause...

11-29 20:42:14.190: I/System.out(18835): Activity  onStop...

11-29 20:42:14.260: I/System.out(18835): SurfaceView surfaceDestroyed...

可见SurfaceView 在返回手机主菜单的时候被销毁了,而我的SurfaceView 主线程是在构造方法里创建的

那么我们返回游戏的时候会调哪些方法呢?接着看Log:

11-29 20:48:06.940: I/System.out(18835): Activity  onRestart...

11-29 20:48:06.950: I/System.out(18835): Activity  onResume...

11-29 20:48:07.230: I/System.out(18835): SurfaceView  surfaceCreated...

11-29 20:48:07.240: I/System.out(18835): SurfaceView  surfaceChanged...

surfaceDestroyed 的时候线程已经退出了运行,这时再返回到游戏刷屏的线程就没了,任何绘制方法都没调用,所以你看到的只有黑漆漆的屏幕啦!

明白了运行原理我们就知道改怎么做啦!

首先创建线程放在 surfaceCreated ,并启动线程,

当 surfaceDestroyed 调用的时候,线程已经无效了,我们把线程对象设为null释放他,

然后不管怎么返回线程都会继续运行你的游戏也就不会中断了,来段简单的代码更具表达力度!

package com.game.view;

import Android.content.Context;

import Android.graphics.Canvas;

import Android.graphics.Paint;

import Android.graphics.Paint.Style;

import Android.graphics.Rect;

import Android.view.SurfaceHolder;

import Android.view.SurfaceHolder.Callback;

import Android.view.SurfaceView;

public class TestView extends SurfaceView implements Callback, Runnable{

public static final int GAME_HEART = 1000/30;   //每秒刷新30次

public static int screenW, screenH;

private Thread thread;

private SurfaceHolder holder;

private Paint paint;

public TestView(Context context) {

super(context);

// TODO Auto-generated constructor stub

holder = getHolder();

holder.addCallback(this);

paint = new Paint(Paint.ANTI_ALIAS_FLAG);// 无锯齿

paint.setStyle(Style.FILL); //填充样式

paint.setTextSize(16); // 字体大小

}

/**

* 执行游戏逻辑方法

*/

private void update() {

}

/**

* 执行游戏绘制

*/

private Rect rect = new Rect();

private void draw(){

Canvas canvas = holder.lockCanvas();

String text = "天使之翼的示例Demo";

//获取文本宽高

paint.getTextBounds(text, 0, text.length(), rect);

//在屏幕中央位置显示文本

paint.setColor(0xfff000f0); //注意最高两位 ff 代表画笔透明度,不设置的画就是完全透明了,看不到任何效果

canvas.drawText(text,

(screenW - rect.width())/2,

screenH/2 + rect.height()/2,

paint);

holder.unlockCanvasAndPost(canvas);

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

// TODO Auto-generated method stub

screenW = getWidth();

screenH = getHeight();

thread = new Thread(this);

isRun = true;

thread.start();

}

@Override

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

// TODO Auto-generated method stub

//当屏幕旋转的时候重新获取屏幕宽高

screenW = getWidth();

screenH = getHeight();

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// TODO Auto-generated method stub

isRun = false;

thread = null;

}

private boolean isRun;  //线程运行标志

private int useTime;    //记录每次刷屏使用的时间

@Override

public void run() {

// TODO Auto-generated method stub

long start, end;

while(isRun){

start = System.currentTimeMillis();

update(); // 刷新界面上所有元素

draw(); // 绘制界面元素

end = System.currentTimeMillis();

useTime = (int) (end - start);

if(useTime < GAME_HEART){    //保证每次刷屏时间间隔相同

try {

Thread.sleep(GAME_HEART - useTime);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

}

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2011-11/48318.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值