Android简单游戏框架结构九

1.1.1 抽象方法定义

此处给出为子类使用的抽象方法的定义,这些抽象方法的定义有助于子类在开发游戏的过程中有效的分离不同状态、不同的操作代码,使开发变得更快捷、明了。

抽象方法如下:

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);
1.1.2 完整代码

至此,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);

();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值