private void Draw() {
/**绘制游戏背景**/
mCanvas.drawBitmap(mbitmapBg,0,0, mPaint); /**绘制小球**/
mCanvas.drawBitmap(mbitmapBall, mPosX,mPosY, mPaint);
/**X轴 Y轴 Z轴的重力值**/
mCanvas.drawText(\轴重力值:\ mCanvas.drawText(\轴重力值:\, 0, 40, mPaint); mCanvas.drawText(\轴重力值:\ }
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) { }
@Override
public void surfaceCreated(SurfaceHolder holder) { /**开始游戏主循环线程**/ mIsRunning = true;
new Thread(this).start(); /**得到当前屏幕宽高**/
mScreenWidth = this.getWidth(); mScreenHeight = this.getHeight();
/**得到小球越界区域**/
mScreenBallWidth = mScreenWidth - mbitmapBall.getWidth(); mScreenBallHeight = mScreenHeight - mbitmapBall.getHeight(); }
@Override
public void surfaceDestroyed(SurfaceHolder holder) { mIsRunning = false; }
@Override
public void run() { while (mIsRunning) {
/** 取得更新游戏之前的时间 **/
long startTime = System.currentTimeMillis(); /** 在这里加上线程安全锁 **/ synchronized (mSurfaceHolder) { /** 拿到当前画布然后锁定 **/
mCanvas = mSurfaceHolder.lockCanvas(); Draw();
/** 绘制结束后解锁显示在屏幕上 **/
mSurfaceHolder.unlockCanvasAndPost(mCanvas); }
/** 取得更新游戏结束的时间 **/
long endTime = System.currentTimeMillis();
/** 计算出游戏一次更新的毫秒数 **/ int diffTime = (int) (endTime - startTime); /** 确保每次更新时间为50帧 **/ while (diffTime <= TIME_IN_FRAME) {
diffTime = (int) (System.currentTimeMillis() - startTime); /** 线程等待 **/ Thread.yield(); } } }
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) { // TODO Auto-generated method stub }
@Override
public void onSensorChanged(SensorEvent event) { mGX = event.values[SensorManager.DATA_X]; mGY= event.values[SensorManager.DATA_Y]; mGZ = event.values[SensorManager.DATA_Z]; //这里乘以2是为了让小球移动的更快 mPosX -= mGX * 2; mPosY += mGY * 2;
//检测小球是否超出边界 if (mPosX < 0) { mPosX = 0;
} else if (mPosX > mScreenBallWidth) { mPosX = mScreenBallWidth; }
if (mPosY < 0) { mPosY = 0;
} else if (mPosY > mScreenBallHeight) { mPosY = mScreenBallHeight; } } } }