《Beginning Android Games》给出基本框架的实现(3)关于用户事件的处理是比较复杂的一个部分,在上一篇过后,
《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;}@Overridepublic InputStream readAsset(String fileName) throws IOException {return assets.open(fileName);}@Overridepublic InputStream readFile(String fileName) throws IOException {return new FileInputStream(externalStoragePath+fileName);}@Overridepublic 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;}@Overridepublic void dispose() {bitmap.recycle();}@Overridepublic PixmapFormat getFormat() {return format;}@Overridepublic int getWidth() {return bitmap.getWidth();}@Overridepublic 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();}@Overridepublic void clear(int color) {canvas.drawRGB((color & 0xff0000) >> 16, (color & 0xff00) >> 8,(color & 0xff));}@Overridepublic void drawLine(int x, int y, int x2, int y2, int color) {paint.setColor(color);canvas.drawLine(x, y, x2, y2, paint);}@Overridepublic void drawPixel(int x, int y, int color) {paint.setColor(color);canvas.drawPoint(x, y, paint);}@Overridepublic 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);}@Overridepublic void drawPixmap(Pixmap pixmap, int x, int y) {canvas.drawBitmap(((AndroidPixmap)pixmap).bitmap, x, y, paint);}@Overridepublic 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);}@Overridepublic int getHeight() {return frameBuffer.getHeight();}@Overridepublic int getWidth() {return frameBuffer.getWidth();}@Overridepublic 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);}} 