Android游戏之文件读写类和绘图类设计

来源:互联网 发布:程序员必须会c语言吗 编辑:程序博客网 时间:2024/05/16 17:43

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”

0 0
原创粉丝点击