Android SurfaceView游戏开发示例

本文介绍如何使用SurfaceView进行高效的游戏开发。通过双缓冲技术提高绘制效率,并提供了完整的示例代码,包括Activity和GameSurfaceView的具体实现。

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

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


具体示例:

Activity

public class Activity01 extends Activity { GameSurfaceView gameView = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); gameView = new GameSurfaceView(this); setContentView(gameView); } }


GameSurfaceView

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; } }
运行效果:



源码下载




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值