Android游戏之文件读写类和绘图类设计
Android游戏之文件读写类和绘图类设计
1、基础知识:
A. FileInputStream
http://developer.android.com/reference/java/io/FileInputStream.html
B. FileOutputStream
http://developer.android.com/reference/java/io/FileOutputStream.html
C. Environment.getExternalStorageDirectory()
http://developer.android.com/reference/android/os/Environment.html#getExternalStorageDirectory()
D. Bitmap
http://developer.android.com/reference/android/graphics/Bitmap.html
E. Canvas
http://developer.android.com/reference/android/graphics/Canvas.html
F. Paint
http://developer.android.com/reference/android/graphics/Paint.html
G. Rect
http://developer.android.com/reference/android/graphics/Rect.html
2、设计文件读写接口FileIO和文件读写类AndroidFileIO
package com.badlogic.androidgames.framework; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public interface FileIO { public InputStream readAsset(String fileName) throws IOException; public InputStream readFile(String fileName) throws IOException; public OutputStream writeFile(String fileName) throws IOException; }
package com.badlogic.androidgames.framework.impl; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.content.res.AssetManager; import android.os.Environment; import com.badlogic.androidgames.framework.FileIO; 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); } }
3. 设计像素接口Pixmap,绘图接口Graphics,像素类AndroidPixmap和绘图类AndroidGraphics
package com.badlogic.androidgames.framework; import com.badlogic.androidgames.framework.Graphics.PixmapFormat; public interface Pixmap { public int getWidth(); public int getHeight(); public PixmapFormat getFormat(); public void dispose(); }
package com.badlogic.androidgames.framework; public interface Graphics { public static enum PixmapFormat { ARGB8888, ARGB4444, RGB565 } public Pixmap newPixmap(String fileName, PixmapFormat format); public void clear(int color); public void drawPixel(int x, int y, int color); public void drawLine(int x, int y, int x2, int y2, int color); public void drawRect(int x, int y, int width, int height, int color); public void drawPixmap(Pixmap pixmap, int x, int y, int srcX, int srcY, int srcWidth, int srcHeight); public void drawPixmap(Pixmap pixmap, int x, int y); public int getWidth(); public int getHeight(); }
package com.badlogic.androidgames.framework.impl; import android.graphics.Bitmap; import com.badlogic.androidgames.framework.Graphics.PixmapFormat; import com.badlogic.androidgames.framework.Pixmap; public class AndroidPixmap implements Pixmap { Bitmap bitmap; PixmapFormat format; public AndroidPixmap(Bitmap bitmap, PixmapFormat format) { this.bitmap = bitmap; this.format = format; } @Override public int getWidth() { return bitmap.getWidth(); } @Override public int getHeight() { return bitmap.getHeight(); } @Override public PixmapFormat getFormat() { return format; } @Override public void dispose() { bitmap.recycle(); } }
package com.badlogic.androidgames.framework.impl; import java.io.IOException; import java.io.InputStream; import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.Rect; import com.badlogic.androidgames.framework.Graphics; import com.badlogic.androidgames.framework.Pixmap; 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; this.canvas = new Canvas(frameBuffer); this.paint = new Paint(); } @Override public Pixmap newPixmap(String fileName, PixmapFormat format) { Config config = null; if (format == PixmapFormat.RGB565) config = Config.RGB_565; else if (format == PixmapFormat.ARGB4444) 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.ARGB4444; else format = PixmapFormat.ARGB8888; return new AndroidPixmap(bitmap, format); } @Override public void clear(int color) { canvas.drawRGB((color & 0xff0000) >> 16, (color & 0xff00) >> 8, (color & 0xff)); } @Override public void drawPixel(int x, int y, int color) { paint.setColor(color); canvas.drawPoint(x, y, paint); } @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 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 + width - 1, 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, null); } @Override public void drawPixmap(Pixmap pixmap, int x, int y) { canvas.drawBitmap(((AndroidPixmap)pixmap).bitmap, x, y, null); } @Override public int getWidth() { return frameBuffer.getWidth(); } @Override public int getHeight() { return frameBuffer.getHeight(); } }
4. 另外基于openGL ES的绘图类GLGraphics(之前的绘图类AndroidGraphics是基于像素绘图)
package com.badlogic.androidgames.framework.impl; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLSurfaceView; public class GLGraphics { GLSurfaceView glView; GL10 gl; GLGraphics(GLSurfaceView glView) { this.glView = glView; } public GL10 getGL() { return gl; } void setGL(GL10 gl) { this.gl = gl; } public int getWidth() { return glView.getWidth(); } public int getHeight() { return glView.getHeight(); } }
本文浅述了“beginning-android-games”书本的相关基础知识和相关类的设计分析,
书本和源码:http://download.csdn.net/detail/yangzhenping/8420261
本篇中的类实现来自“beginning-android-games\ch07-gl-basics”
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。