《Beginning Android Games》给出基本框架的实现(3)

关于用户事件的处理是比较复杂的一个部分,在上一篇过后,剩下的关于Audio,Graphics,FileIO的部分就显得比较简单了

首先来看AndroidFileIO,这里的File主要存在于2个地方,一个是SD卡上,另一个是assets文件夹中

 

public class AndroidFileIO implements FileIO {
	AssetManager assets;
	String externalStoragePath;
	
	public AndroidFileIO(AssetManager assets){
		this.assets=assets;
		this.externalStoragePath=Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator;
	}
	
	@Override
	public InputStream readAsset(String fileName) throws IOException {
		return assets.open(fileName);
	}

	@Override
	public InputStream readFile(String fileName) throws IOException {
		return new FileInputStream(externalStoragePath+fileName);
	}

	@Override
	public OutputStream writeFile(String fileName) throws IOException {
		return new FileOutputStream(externalStoragePath+fileName);
	}

}

 

再看AndroidGraphics的实现 主要关系到2个类,AndroidGraphics和AndroidPixmap,他们分别是之前给出抽象中Graphics和Pixmap的实现

 

public class AndroidPixmap implements Pixmap {
	Bitmap bitmap;
	PixmapFormat format;
	
	public AndroidPixmap(Bitmap bitmap, PixmapFormat format){
		this.bitmap=bitmap;
		this.format=format;
	}
	
	@Override
	public void dispose() {
		bitmap.recycle();
	}

	@Override
	public PixmapFormat getFormat() {
		return format;
	}

	@Override
	public int getWidth() {
		return bitmap.getWidth();
	}

	@Override
	public int getHeight() {
		return bitmap.getHeight();
	}

}

 

 

public class AndroidGraphics implements Graphics {
	AssetManager assets;
	Bitmap frameBuffer;
	Canvas canvas;
	Paint paint;
	Rect srcRect = new Rect();
	Rect dstRect = new Rect();

	public AndroidGraphics(AssetManager assets, Bitmap frameBuffer) {
		this.assets = assets;
		this.frameBuffer = frameBuffer;
		canvas = new Canvas(frameBuffer);
		paint = new Paint();
	}

	@Override
	public void clear(int color) {
		canvas.drawRGB((color & 0xff0000) >> 16, (color & 0xff00) >> 8,
				(color & 0xff));
	}

	@Override
	public void drawLine(int x, int y, int x2, int y2, int color) {
		paint.setColor(color);
		canvas.drawLine(x, y, x2, y2, paint);
	}

	@Override
	public void drawPixel(int x, int y, int color) {
		paint.setColor(color);
		canvas.drawPoint(x, y, paint);
	}

	@Override
	public void drawPixmap(Pixmap pixmap, int x, int y, int srcX, int srcY,
			int srcWidth, int srcHeight) {
		srcRect.left=srcX;
		srcRect.top=srcY;
		srcRect.right=srcX+srcWidth-1;
		srcRect.bottom=srcY+srcHeight-1;
		
		dstRect.left=x;
		dstRect.top=y;
		dstRect.right=x+srcWidth-1;
		dstRect.bottom=y+srcHeight-1;
		
		canvas.drawBitmap(((AndroidPixmap)pixmap).bitmap, srcRect, dstRect, paint);
	}

	@Override
	public void drawPixmap(Pixmap pixmap, int x, int y) {
		canvas.drawBitmap(((AndroidPixmap)pixmap).bitmap, x, y, paint);

	}

	@Override
	public void drawRect(int x, int y, int width, int height, int color) {
		paint.setColor(color);
		paint.setStyle(Style.FILL);
		canvas.drawRect(x, y, x + width - 1, y + height - 1, paint);
	}

	@Override
	public int getHeight() {
		return frameBuffer.getHeight();
	}

	@Override
	public int getWidth() {
		return frameBuffer.getWidth();
	}

	@Override
	public Pixmap newPixmap(String fileName, PixmapFormat format) {
		Config config = null;
		if (format == PixmapFormat.RGB565) {
			config = Config.RGB_565;
		} else if (format == PixmapFormat.ARGB84444) {
			config = Config.ARGB_4444;
		} else {
			config = Config.ARGB_8888;
		}

		Options options = new Options();
		options.inPreferredConfig = config;

		InputStream in = null;
		Bitmap bitmap = null;
		try {
			in = assets.open(fileName);
			bitmap = BitmapFactory.decodeStream(in);
			if (bitmap == null) {
				throw new RuntimeException("Couldn't load bitmap from asset '"
						+ fileName + "'");
			}
		} catch (IOException e) {
			throw new RuntimeException("Couldn't load bitmap from asset '"
					+ fileName + "'");
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
				}
			}
		}

		if (bitmap.getConfig() == Config.RGB_565) {
			format = PixmapFormat.RGB565;
		} else if (bitmap.getConfig() == Config.ARGB_4444) {
			format = PixmapFormat.ARGB84444;
		} else {
			format = PixmapFormat.ARGB8888;
		}

		return new AndroidPixmap(bitmap, format);
	}

}

你可能感兴趣的:(android)