1.1.1 抽象方法定义
1.1.2 完整代码
此处给出为子类使用的抽象方法的定义,这些抽象方法的定义有助于子类在开发游戏的过程中有效的分离不同状态、不同的操作代码,使开发变得更快捷、明了。
抽象方法如下:
public abstract void loadingLogic();
public abstract boolean loadingTouchEvent(MotionEvent event); public abstract void loadingRender(Canvas c, Paint p); public abstract void logoLogic(); public abstract boolean logoTouchEvent(MotionEvent event); public abstract void logoRender(Canvas c, Paint p); public abstract void menuLogic(); public abstract boolean menuTouchEvent(MotionEvent event); public abstract void menuRender(Canvas c, Paint p); public abstract void playLogic(); public abstract boolean playTouchEvent(MotionEvent event); public abstract void playRender(Canvas c, Paint p); public abstract void endLogic(); public abstract boolean endTouchEvent(MotionEvent event); public abstract void endRender(Canvas c, Paint p); |
至此,GameSurfaceView介绍完毕,一下以下附完整GameSurfaceView的代码,如下:
package game.platform;
import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; public abstract class GameSurfaceView extends SurfaceView implements Runnable, SurfaceHolder.Callback, GestureDetector.OnGestureListener { SurfaceHolder holder; public boolean isUseGesture = false; public GestureDetector gestureDetector; public final int GAMESTATE_LOADING = 0; public final int GAMESTATE_LOGO = 1; public final int GAMESTATE_MENU = 2; public final int GAMESTATE_PLAY = 3; public final int GAMESTATE_END = 4; public int gameState; Thread gameThread; /** * true:Pouse the game thread; * false:Running the game thread; */ boolean threadPouse; /** * true:End the game thread; * fasle:Running the game thread; */ boolean threadEnd; int fps = 10; int loadingPersent; public int actulWidth,actulHeight; public float renderWidth,renderHeight; public Bitmap renderMap; public Canvas renderCanvas; Paint renderPaint; Paint p = new Paint(); Matrix renderMatrix; public GameSurfaceView(Context context, int renderWidth, int renderHeight){ super(context); holder = getHolder(); holder.addCallback(this); gestureDetector = new GestureDetector(context, this); setLongClickable(true); actulWidth = getWidth(); actulHeight = getHeight(); this.renderWidth = renderWidth; this.renderHeight = renderHeight; renderMap = Bitmap.createBitmap(renderWidth, renderHeight, Bitmap.Config.ARGB_8888); renderCanvas = new Canvas(renderMap); renderPaint = new Paint(); } public void startThread(){ if(gameThread == null){ gameThread = new Thread(this); } threadEnd = false; threadPouse = false; gameThread.start(); } public void pouseThread(){ threadPouse = true; } public void resumeThread(){ threadPouse = false; } public void stopThread(){ threadEnd = true; } public void setFps(int fps){ this.fps = fps; } public int getFps(){ return fps; } public void setGameStateLoading(){ gameState = GAMESTATE_LOADING; loadingPersent = 0; } public void setGameStateLogo(){ gameState = GAMESTATE_LOGO; } public void setGameStateMenu(){ gameState = GAMESTATE_MENU; } public void setGameStatePlay(){ gameState = GAMESTATE_PLAY; } public void setGameStateEnd(){ gameState = GAMESTATE_END; } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } @Override public boolean onTouchEvent(MotionEvent event) { MotionEvent renderEvent = MotionEvent.obtain(event); renderEvent.setLocation(event.getX() * renderWidth / actulWidth, event.getY() * renderHeight / actulHeight); boolean isUsed = false; switch(gameState){ case GAMESTATE_LOADING: isUsed = loadingTouchEvent(renderEvent); break; case GAMESTATE_LOGO: isUsed = logoTouchEvent(renderEvent); break; case GAMESTATE_MENU: isUsed = menuTouchEvent(renderEvent); break; case GAMESTATE_PLAY: isUsed = playTouchEvent(renderEvent); break; case GAMESTATE_END: isUsed = endTouchEvent(renderEvent); break; } if (!isUsed && isUseGesture) { return gestureDetector.onTouchEvent(renderEvent); } return isUsed; } public void render(){ Canvas c = holder.lockCanvas(); if (c == null) { System.out.println("SurfaceView.canvas is null"); return; } if (renderMatrix == null) { actulWidth = getWidth(); actulHeight = getHeight(); renderMatrix = new Matrix(); renderMatrix.setScale(actulWidth / renderWidth, actulHeight / renderHeight); renderMatrix.postTranslate(0, 0); } switch(gameState){ case GAMESTATE_LOADING: loadingRender(renderCanvas, p); break; case GAMESTATE_LOGO: logoRender(renderCanvas, p); break; case GAMESTATE_MENU: menuRender(renderCanvas, p); break; case GAMESTATE_PLAY: playRender(renderC break; case GAMESTATE_END: endRender(renderCanvas, p); break; } c.drawBitmap(renderMap, renderMatrix, renderPaint); holder.unlockCanvasAndPost(c); } @Override public void run() { // TODO Auto-generated method stub long startTime; long delayTime; while(!threadEnd){ startTime = System.currentTimeMillis(); if(!threadPouse){ switch(gameState){ case GAMESTATE_LOADING: loadingLogic(); break; case GAMESTATE_LOGO: logoLogic(); break; case GAMESTATE_MENU: menuLogic(); break; case GAMESTATE_PLAY: playLogic(); break; case GAMESTATE_END: endLogic(); break; } } render(); try { delayTime = startTime + 1000/fps -System.currentTimeMillis(); if(delayTime < 0){ delayTime = 0; } Thread.sleep(delayTime); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public Bitmap loadBitmap(int res){ return BitmapFactory.decodeResource(getResources(), res); } public abstract void loadingLogic(); public void setLoadingPersent(int loadingPersent){ this.loadingPersent = loadingPersent; } public int getLoadingPersent(){ return loadingPersent; } public abstract boolean loadingTouchEvent(MotionEvent event); public abstract void loadingRender(Canvas c, Paint p); public abstract void logoLogic(); public abstract boolean logoTouchEvent(MotionEvent event); public abstract void logoRender(Canvas c, Paint p); public abstract void menuLogic(); public abstract boolean menuTouchEvent(MotionEvent event); public abstract void menuRender(Canvas c, Paint p); public abstract void playLogic(); public abstract boolean playTouchEvent(MotionEvent event); public abstract void playRender(Canvas c, Paint p); public abstract void endLogic(); public abstract boolean endTouchEvent(MotionEvent event); public abstract void endRender(Canvas c, Paint p); (); |