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

android游戏开发—06—三种描绘方式和方法的范例

2013年05月06日 ⁄ 综合 ⁄ 共 5798字 ⁄ 字号 评论关闭

第一种描绘方式:使用SurfaceView类来描绘

public class MainActivity extends Activity {

	MySurfaceView mySurfaceView;
	Thread mainLoop;
	private MySurfaceView view;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		view = new MySurfaceView(this);
		super.setContentView(view);
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		Thread.interrupted();
	}

	class MySurfaceView extends SurfaceView implements Runnable {

		Bitmap bitmap;
		boolean u, d, l, r;
		Paint paint = new Paint();
		int left, top;
		long time;
		int tx, ty;

		public MySurfaceView(Context context) {
			super(context);
			// TODO Auto-generated constructor stub
			setFocusable(true);
			requestFocus();// 请求聚焦
			bitmap = BitmapFactory.decodeResource(context.getResources(),
					R.drawable.ic_launcher);
			paint.setColor(Color.RED);
			tx = bitmap.getWidth();
			ty = bitmap.getHeight() / 2;
			mainLoop = new Thread(this);
			mainLoop.start();
		}

		void doDraw() {
			Canvas canvas = getHolder().lockCanvas();
			if (canvas != null) {
				canvas.drawColor(Color.WHITE);
				if (u)
					top--;
				if (d)
					top++;
				if (l)
					left--;
				if (r)
					left++;
				canvas.drawBitmap(bitmap, left * 10, top * 10, paint);
				long now = System.currentTimeMillis();
				System.out.println(now - time);
				canvas.drawText(1000f / (now - time) + "fps", tx, ty, paint);
				time = now;
				getHolder().unlockCanvasAndPost(canvas);
			}
		}

		public void run() {
			// TODO Auto-generated method stub
			while (true) {
				doDraw();
			}
		}

		@Override
		public boolean onKeyDown(int keyCode, KeyEvent event) {
			switch (keyCode) {
			case KeyEvent.KEYCODE_DPAD_UP:
				u = true;
				break;
			case KeyEvent.KEYCODE_DPAD_DOWN:
				d = true;
				break;
			case KeyEvent.KEYCODE_DPAD_LEFT:
				l = true;
				break;
			case KeyEvent.KEYCODE_DPAD_RIGHT:
				r = true;
				break;
			default:
				return false;
			}
			return true;
		}

		@Override
		public boolean onKeyUp(int keyCode, KeyEvent event) {
			switch (keyCode) {
			case KeyEvent.KEYCODE_DPAD_UP:
				u = false;
				break;
			case KeyEvent.KEYCODE_DPAD_DOWN:
				d = false;
				break;
			case KeyEvent.KEYCODE_DPAD_LEFT:
				l = false;
				break;
			case KeyEvent.KEYCODE_DPAD_RIGHT:
				r = false;
				break;
			default:
				return false;
			}
			return true;
		}
	}
} 


第二种描绘方式:使用View类来描绘。

public class MainActivity extends Activity {

	MySurfaceView mySurfaceView;
	Thread mainLoop;
	private MySurfaceView view;
	Handler handler = new Handler();

        @Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		view = new MySurfaceView(this);
		super.setContentView(view);
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		Thread.interrupted();
	}

	class MySurfaceView extends View implements Runnable {

		Bitmap bitmap;
		boolean u, d, l, r;
		Paint paint = new Paint();
		int left, top;
		long time;
		int tx, ty;

		public MySurfaceView(Context context) {
			super(context);
			// TODO Auto-generated constructor stub
			setFocusable(true);
			requestFocus();// 请求聚焦
			bitmap = BitmapFactory.decodeResource(context.getResources(),
					R.drawable.ic_launcher);
			paint.setColor(Color.RED);
			tx = bitmap.getWidth();
			ty = bitmap.getHeight() / 2;
			mainLoop = new Thread(this);
			mainLoop.start();
		}

		@Override
		protected void onDraw(Canvas canvas) {
			if (canvas != null) {
				canvas.drawColor(Color.WHITE);
				if (u)
					top--;
				if (d)
					top++;
				if (l)
					left--;
				if (r)
					left++;
				canvas.drawBitmap(bitmap, left * 10, top * 10, paint);
				long now = System.currentTimeMillis();
				System.out.println(now - time);
				canvas.drawText(1000f / (now - time) + "fps", tx, ty, paint);
				time = now;
			}
		}

	     public void run() {
			// TODO Auto-generated method stub
			while (true) {
				handler.post(new Runnable() {
					public void run() {
						// TODO Auto-generated method stub
						invalidate();// 使窗口无效,意味着重绘,会调用ondraw方法
					}
				});
			}
		}

		@Override
		public boolean onKeyDown(int keyCode, KeyEvent event) {
			switch (keyCode) {
			case KeyEvent.KEYCODE_DPAD_UP:
				u = true;
				break;
			case KeyEvent.KEYCODE_DPAD_DOWN:
				d = true;
				break;
			case KeyEvent.KEYCODE_DPAD_LEFT:
				l = true;
				break;
			case KeyEvent.KEYCODE_DPAD_RIGHT:
				r = true;
				break;
			default:
				return false;
			}
			return true;
		}

		@Override
		public boolean onKeyUp(int keyCode, KeyEvent event) {
			switch (keyCode) {
			case KeyEvent.KEYCODE_DPAD_UP:
				u = false;
				break;
			case KeyEvent.KEYCODE_DPAD_DOWN:
				d = false;
				break;
			case KeyEvent.KEYCODE_DPAD_LEFT:
				l = false;
				break;
			case KeyEvent.KEYCODE_DPAD_RIGHT:
				r = false;
				break;
			default:
				return false;
			}
			return true;
		}
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

}

第三种描绘方式:使用BItmapDrawable类描绘

public class MainActivity extends Activity {

	MySurfaceView mySurfaceView;
	Thread mainLoop;
	private MySurfaceView view;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		view = new MySurfaceView(this);
		super.setContentView(view);
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		Thread.interrupted();
	}

	class MySurfaceView extends SurfaceView implements Runnable {

		BitmapDrawable bd;
		Bitmap bitmap;
		boolean u, d, l, r;
		Paint paint = new Paint();
		int left, top;
		long time;
		int tx, ty;
		int imageWidth, imageHeight;

		public MySurfaceView(Context context) {
			super(context);
			// TODO Auto-generated constructor stub
			setFocusable(true);
			requestFocus();// 请求聚焦
			bitmap = BitmapFactory.decodeResource(context.getResources(),
					R.drawable.ic_launcher);
			paint.setColor(Color.RED);
			     bd = new BitmapDrawable(context.getResources(), bitmap);
			tx = bitmap.getWidth();
			ty = bitmap.getHeight() / 2;
			     imageWidth = bitmap.getWidth();
		        imageHeight = bitmap.getHeight();
			mainLoop = new Thread(this);
			mainLoop.start();
		}

		public void doDraw() {
			Canvas canvas = getHolder().lockCanvas();
			if (canvas != null) {
				canvas.drawColor(Color.WHITE);
				if (u)
					top--;
				if (d)
					top++;
				if (l)
					left--;
				if (r)
					left++;
				bd.draw(canvas);
			        bd.setBounds(left * 10, top * 10, left * 10 + imageWidth, top* 10 + imageHeight);
				long now = System.currentTimeMillis();
				System.out.println(now - time);
				canvas.drawText(1000f / (now - time) + "fps", tx, ty, paint);
				time = now;
				getHolder().unlockCanvasAndPost(canvas);
			}
		}

		public void run() {
			// TODO Auto-generated method stub
			while (true) {
				doDraw();
			}
		}

		@Override
		public boolean onKeyDown(int keyCode, KeyEvent event) {
			switch (keyCode) {
			case KeyEvent.KEYCODE_DPAD_UP:
				u = true;
				break;
			case KeyEvent.KEYCODE_DPAD_DOWN:
				d = true;
				break;
			case KeyEvent.KEYCODE_DPAD_LEFT:
				l = true;
				break;
			case KeyEvent.KEYCODE_DPAD_RIGHT:
				r = true;
				break;
			default:
				return false;
			}
			return true;
		}

		@Override
		public boolean onKeyUp(int keyCode, KeyEvent event) {
			switch (keyCode) {
			case KeyEvent.KEYCODE_DPAD_UP:
				u = false;
				break;
			case KeyEvent.KEYCODE_DPAD_DOWN:
				d = false;
				break;
			case KeyEvent.KEYCODE_DPAD_LEFT:
				l = false;
				break;
			case KeyEvent.KEYCODE_DPAD_RIGHT:
				r = false;
				break;
			default:
				return false;
			}
			return true;
		}
	}
}

抱歉!评论已关闭.