游戏过程中按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();
				}
			}
		}
	}
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值