现在的位置: 首页 > 综合 > 正文

游戏开发-SurfaceView类使用详解

2018年06月09日 ⁄ 综合 ⁄ 共 2358字 ⁄ 字号 评论关闭

一、实现游戏框架SurfaceView

public class MySurfaceView extends SurfaceView implements Callback, Runnable 
{     
    private SurfaceHolder surfaceholder; //surface控制器    
    private Thread thread;  //Runnable接口对应的线程   
   
    //构造函数实现
    public MySurfaceView(Context context) 
    {     
        super(context);     
        
        thread = new Thread(this); //创建一个本类自带线程,可以运行本类的重载的run()函数    
        surfaceholder = this.getHolder(); //获取surface控制器    
        surfaceholder.addCallback(this); // 添加回调函数,使surfaceCreated等回调函数有效
    }     
    
    @Override       
    public void surfaceCreated(SurfaceHolder holder) 
    {//在创建时,开始线程,运行自带的run()函数     
        thread.start();     
    }     
   
    //Runnable接口重载的run()函数
    public void run() 
    {   
        //循环执行每过指定时间重新画图, 从而实现动画效果 
        while (true) 
        {     
            draw();     
            try 
            {     
                Thread.sleep(100);     
            } 
            catch (InterruptedException e) 
            {     
            }     
        }     
    }
    
    //在surface的大小发生改变时激发     
    public void surfaceChanged(SurfaceHolder holder, int format, int width,     
            int height) {     
    } 
    //销毁时激发,一般在这里将画图的线程停止、释放。    
    public void surfaceDestroyed(SurfaceHolder holder) {               
    }   
    
    //实现画图
    private void draw() 
    {     
        try 
        {   
            //通过surface控制器获取surface上的画布,并锁定画布
            Canvas  canvas = surfaceholder.lockCanvas(); 
           
            //开始绘画操作
            canvas.drawColor(Color.WHITE); 
            canvas.drawText("Himi", 100, 100, paint);  
            canvas.drawText("游戏框架", 100, 130, paint);     
        } 
        catch (Exception ex) 
        {     
        } 
        finally 
        {
            //结束锁定画布,并将画好的画布提交。
            if (canvas != null)     
                sfh.unlockCanvasAndPost(canvas);    
        }     
    }       
}   

整个流程如下:

1、继承SurfaceView并实现SurfaceHolder.Callback接口和Runnable接口。

2、通过SurfaceView.getHolder()获得SurfaceHolder对象。

3、通过SurfaceHolder.addCallback(callback)添加回调函数。

4、创建一个本类自带线程,可以运行本类的重载的run()函数

5、在surfaceCreated函数中启动线程。使运行线程函数run()

6、在线程函数里实现绘画:

     先通过SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布,然后绘画,最后通过SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交画布

7、销毁时激发surfaceDestroyed函数,一般在这里将画图的线程停止、释放。

二、activity中加载这个游戏框架

setContentView(MySurfaceView);

三、游戏框架SurfaceView的另外一种实现:

public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback 
{//继承SurfaceView并实现SurfaceHolder.Callback接口,没有Runnable接口
  
  MyThread myhread;
  //构造函数
	public GameSurfaceView(Context context) 
	{
		super(context);
		
		myhread = new MyThread();
		//获取Surface控制器
		this.holder = this.getHolder();
		//添加回调函数
		holder.addCallback(this);
	}	
	
	//绘制界面
	protected void onDraw(Canvas canvas) 
	{
		super.onDraw(canvas);

	}
	
	public void surfaceCreated(SurfaceHolder holder) 
	{//创建时启动线程
    mythread.start();
	}
	
	//内部线程类
	class MyThread extends Thread 
	{		
		//运行函数
		public void run() 
		{
			while (go_on) 
			{
				try 
				{
					Thread.sleep(100);
				} 
				catch (InterruptedException e) 
				{
				}				
				synchronized (holder) 
				{
					Canvas canvas = holder.lockCanvas();
					//绘制画面
					GameSurfaceView.this.onDraw(canvas);
		     
		     	holder.unlockCanvasAndPost(canvas);
				}
			}
		}
	}
}	

说明:因为没有实现Runnable,所以要自创一个内部线程类,并在构造函数是创建对象,线程类的run函数要调用GameSurfaceView类的绘图函数。其他的步骤类似

抱歉!评论已关闭.