当前位置: 代码迷 >> Android >> 《Beginning Android Games》Chapter3付出的基本框架
  详细解决方案

《Beginning Android Games》Chapter3付出的基本框架

热度:193   发布时间:2016-05-01 19:02:45.0
《Beginning Android Games》Chapter3给出的基本框架

一个游戏的基础框架大致分为这几个部分:

1 Window management

2 Input

3 File I/O

4 Graphics

5 Audio

6 Game framework

?

之后书中给出了具体每一部分接口的定义,如下:

Input接口

?

public interface Input {	public static class KeyEvent{		public static final int KEY_DOWN=0;		public static final int KEY_UP=1;			public int type;		public int keyCode;		public char keyChar;	}		public static class TouchEvent{		public static final int TOUCH_DOWN=0;		public static final int TOUCH_UP=1;		public static final int TOUCH_DRAGGED=2;				public int type;		public int x,y;		public int pointer;	}		public boolean isKeyPressed(int keyCode);		public boolean isTouchDown(int pointer);		public int getTouchX(int pointer);		public int getTouchY(int pointer);		public float getAccelX();		public float getAccelY();		public float getAccelZ();		public List<KeyEvent> getKeyEvents();		public List<TouchEvent> getTouchEvents();}

?

?

FileIO接口

?

public interface FileIO {	public InputStream readAsset(String fileName) throws IOException;		public InputStream readFile(String fileName) throws IOException;		public OutputStream writeFile(String fileName) throws IOException;}

?

?

Audio接口 其中还包含了Music和Sound的接口定义

?

public interface Audio {	public Music newMusic(String filename);		public Sound newSound(String filename);}
?

?

public interface Music {	public void play();		public void stop();		public void pause();		public void setLooping(boolean looping);		public void setVolume(float volume);		public boolean isPlaying();		public boolean isStopped();		public boolean isLooping();		public void dispose();}

?

?

?

public interface Sound {	public void play(float volume);		public void dispose();}

?

?

Graphics接口的定义 包括Pixmap

?

public interface Graphics {	public static enum PixmapFormat {		ARGB8888, ARGB84444, 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();}

?

public interface Pixmap {	public int getWidth();		public PixmapFormat getFormat();		public void dispose();}

?

最后是Game接口的定义 以及抽象类Screen

public interface Game {	public Input getInput();		public FileIO getFileIO();		public Graphics getGraphics();		public Audio getAudio();		public void setScreen(Screen screen);		public Screen getCurrentScreen();		public Screen getStartScreen();}

?

public abstract class Screen {	protected final Game game;		public Screen(Game game){		this.game=game;	}	//更新状态	public abstract void update(float deltaTime);	//刷新画面	public abstract void present(float deltaTime);		public abstract void pause();		public abstract void resume();		public abstract void dispose();}

?

以上就基本实现了最简单的框架 觉得还是比较清晰的 所以照搬记录一下

?

最后Chapter3还提到了Frame Rate–Independent Movement 也就是固定帧数的问题?

例如若每次循环移动1个像素点 在60FPS的情况下 1秒就移动了60个像素 而30FPS则移动了30个像素 这样移动的速度相当于提升了2倍 作者给出的解决方案是根据deltaTime 计算应该移动的实际距离 也就是从x+=1 改成x+=30*deltaTime 30是希望的每秒移动像素值

?————————————题外话——————————

再想到之前看到的一个介绍 游戏基本是一个循环 : ?更新状态——重新绘制——休眠——更新状态

而其中的休眠时间并不是一个固定值 而是动态计算的 休眠长度=理想值-处理用去的时间 其实也跟上面的思路类似

?

  相关解决方案