前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android SurfaceView游戏开发示例

Android SurfaceView游戏开发示例

作者头像
阳光岛主
发布2019-02-19 18:01:14
9790
发布2019-02-19 18:01:14
举报
文章被收录于专栏:米扑专栏米扑专栏

当我们需要开发一个复杂游戏的时候,而且对程序的执行效率要求很高时,View类就不能满足需求了,这时必须用SurfaceView类进行开发。

例如,对速度要求很高的游戏时,View类就不能满足需求了,这时必须使用SurfaceView类进行开发。例如,对速度要求很高的游戏,可以使用双缓冲来显示。游戏中的背景、人物、动画等都需要绘制在一个画布(Canvas)上,而SurfaceView可以直接访问一个画布,SurfaceView 是提供给需要直接画像素而不是使用窗体部件的应用使用的。 每个Surface创建一个Canvas对象(但属性时常改变),用来管理View和Surface上的绘图操作。 

具体示例:

Activity

代码语言:javascript
复制
public class Activity01 extends Activity {
	
	GameSurfaceView gameView = null;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        gameView = new GameSurfaceView(this);
        setContentView(gameView);
    }
}

GameSurfaceView

代码语言:javascript
复制
public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable{

	private Activity01 mActivity = null;
	
	private SurfaceHolder mHolder = null;
	private Thread mThread = null;;
	private boolean mLoop = false;
	
	private Canvas mCanvas = null;
	private Paint mPaint = null;
	private long drawStartTime = 0, drawCostTime = 0, drawTotalTime = 30;
	
	private float x, y;
	private int screenWidth = 480, screenHeight = 800;
	
	public GameSurfaceView(Context context) {
		super(context);

		mActivity = (Activity01)context;
		
		mHolder = this.getHolder();
		mHolder.addCallback(this);
		setFocusable(true);
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		mPaint = new Paint();
		mPaint.setColor(Color.CYAN);
		mLoop = true;
		
		new Thread(this).start();
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
		screenWidth = width;
		screenHeight = height;
		
		x = screenWidth / 2;
		y = screenHeight / 2;
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		mLoop = false;
	}

	@Override
	public void run() {
		while(mLoop){
			drawStartTime = SystemClock.uptimeMillis();
			
			synchronized (mHolder) {
				try {
					mCanvas = mHolder.lockCanvas();
					onDraw();		// repaint
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					if(mCanvas != null){
						mHolder.unlockCanvasAndPost(mCanvas);
					}
				}
			}
			
			drawCostTime = SystemClock.uptimeMillis() - drawStartTime;
			Log.i("drawCostTime", "drawCostTime = " + drawCostTime);
			try {
				if(drawCostTime < drawTotalTime){
					Thread.sleep(drawTotalTime - drawCostTime);		// sleep elapse time
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	private void onDraw(){
		if(mHolder == null && mPaint == null){
			return;
		}
		
		mPaint.setAntiAlias(true);
		mPaint.setAlpha(100);
		
		mPaint.setColor(Color.CYAN);	// paint background color
		mCanvas.drawRect(0, 0, screenWidth, screenHeight, mPaint);
		
		mPaint.setColor(Color.BLUE);	// paint foreground color
		mCanvas.drawCircle(x, y, 50, mPaint);
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		super.onTouchEvent(event);

		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			this.x = event.getX();
			this.y = event.getY();
			break;

		case MotionEvent.ACTION_MOVE:
			this.x = event.getX();
			this.y = event.getY();
			break;

		case MotionEvent.ACTION_UP:
			this.x = event.getX();
			this.y = event.getY();
			break;

		default:
			this.x = event.getX();
			this.y = event.getY();
			break;
		}

		return true;	// true then event can be implemented again
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event){
		super.onKeyDown(keyCode, event);
		
		if(keyCode == KeyEvent.ACTION_DOWN){
			this.mActivity.finish();
		}
		
		return true;
	}
}

运行效果:

源码下载

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012年02月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档