android游戏开发自学笔记3-3

来源:互联网 发布:python 自定义迭代器 编辑:程序博客网 时间:2024/06/06 07:49

游戏的代码的确多,再开一页吧。等代码写好了。再给每段代码写清楚来龙去脉,设计思路吧。现在是根据书上所说,调试代码阶段。嘿嘿。


package com.gamestudy.mrnom.framework.impl;import android.graphics.Bitmap;import com.gamestudy.mrnom.framework.Graphics.PixmapFormat;import com.gamestudy.mrnom.framework.Pixmap;public class AndroidPixmap implements Pixmap {Bitmap bitmap;PixmapFormat format;public AndroidPixmap(Bitmap bitmap, PixmapFormat format) {this.bitmap = bitmap;this.format = format;}@Overridepublic int getWidth() {return bitmap.getWidth();}@Overridepublic int getHeight() {return bitmap.getHeight();}@Overridepublic PixmapFormat getFormat() {return format;}@Overridepublic void dispose() {bitmap.recycle();}}

package com.gamestudy.mrnom.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.gamestudy.mrnom.framework.Graphics;import com.gamestudy.mrnom.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();}@Overridepublic 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;elseconfig = 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;elseformat = PixmapFormat.ARGB8888;return new AndroidPixmap(bitmap, format);}@Overridepublic void clear(int color) {canvas.drawRGB((color & 0xff0000) >> 16, (color & 0xff00) >> 8,(color & 0xff));}@Overridepublic void drawPixel(int x, int y, int color) {paint.setColor(color);canvas.drawPoint(x, y, paint);}@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 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);}@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,null);}@Overridepublic void drawPixmap(Pixmap pixmap, int x, int y) {canvas.drawBitmap(((AndroidPixmap)pixmap).bitmap, x, y, null);}@Overridepublic int getWidth() {return frameBuffer.getWidth();}@Overridepublic int getHeight() {return frameBuffer.getHeight();}}

package com.gamestudy.mrnom.framework.impl;import android.app.Activity;import android.content.Context;import android.content.res.Configuration;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.os.Bundle;import android.os.PowerManager;import android.os.PowerManager.WakeLock;import android.view.Window;import android.view.WindowManager;import com.gamestudy.mrnom.framework.Audio;import com.gamestudy.mrnom.framework.FileIO;import com.gamestudy.mrnom.framework.Game;import com.gamestudy.mrnom.framework.Graphics;import com.gamestudy.mrnom.framework.Input;import com.gamestudy.mrnom.framework.Screen;public  abstract class AndroidGame extends Activity implements Game {AndroidFastRenderView renderView;Graphics graphics;Audio audio;Input input;FileIO fileIO;Screen screen;WakeLock wakeLock;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);boolean isLandscape = getResources().getConfiguration().orientation ==Configuration.ORIENTATION_LANDSCAPE;int frameBufferWidth = isLandscape ? 480 : 320;int frameBufferHeight = isLandscape ? 320 : 480;Bitmap frameBuffer = Bitmap.createBitmap(frameBufferWidth,frameBufferHeight, Config.RGB_565);float scaleX = (float) frameBufferWidth/ getWindowManager().getDefaultDisplay().getWidth();float scaleY = (float) frameBufferHeight/ getWindowManager().getDefaultDisplay().getHeight();renderView = new AndroidFastRenderView(this, frameBuffer);graphics = new AndroidGraphics(getAssets(), frameBuffer);fileIO = new AndroidFileIO(getAssets());audio = new AndroidAudio(this);input = new AndroidInput(this, renderView, scaleX, scaleY);screen = getStartScreen();setContentView(renderView);PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "GLGame");}@Overridepublic void onResume() {super.onResume();wakeLock.acquire();screen.resume();renderView.resume();}@Overridepublic void onPause() {super.onPause();wakeLock.release();renderView.pause();screen.pause();if (isFinishing())screen.dispose();}@Overridepublic Input getInput() {return input;}@Overridepublic FileIO getFileIO() {return fileIO;}@Overridepublic Graphics getGraphics() {return graphics;}@Overridepublic Audio getAudio() {return audio;}@Overridepublic void setScreen(Screen screen) {if (screen == null)throw new IllegalArgumentException("Screen must not be null");this.screen.pause();this.screen.dispose();screen.resume();screen.update(0);this.screen = screen;}public Screen getCurrentScreen() {return screen;}}

package com.gamestudy.mrnom.framework.impl;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Rect;import android.view.SurfaceHolder;import android.view.SurfaceView;public class AndroidFastRenderView extends SurfaceView implements Runnable {AndroidGame game;Bitmap framebuffer;Thread renderThread = null;SurfaceHolder holder;volatile boolean running = false;public AndroidFastRenderView(AndroidGame game, Bitmap framebuffer) {super(game);this.game = game;this.framebuffer = framebuffer;this.holder = getHolder();}public void resume() {running = true;renderThread = new Thread(this);renderThread.start();}public void run() {Rect dstRect = new Rect();long startTime = System.nanoTime();while(running) {if(!holder.getSurface().isValid())continue;float deltaTime = (System.nanoTime()-startTime) / 1000000000.0f;startTime = System.nanoTime();game.getCurrentScreen().update(deltaTime);game.getCurrentScreen().present(deltaTime);Canvas canvas = holder.lockCanvas();canvas.getClipBounds(dstRect);canvas.drawBitmap(framebuffer, null, dstRect, null);holder.unlockCanvasAndPost(canvas);}}public void pause() {running = false;while(true) {try {renderThread.join();break;} catch (InterruptedException e) {// retry}}}}