Android游戏开发菜鸟之路(四)

最近一直在搭一个框架吧,基本是参照《Beginning Android Games》一书的方法,以后可能还会在此基础上更改。

此框架主要实现游戏中的一些基本功能:

FileIO

AudioManager

InputManager

Graphics


FileIO:

FileIO模块主要实现三个内容:从Ram中读取内容,从SD卡中读取内容,将内容写入SD中。

从Ram中读取内容,即从assets/目录中读取内容,利用AssetManager类:

AssetManagerassets = activity.getAssets();
assets.open(fileName);

从SD卡中读取内容,要用到Environment类。首先判断外部存储是否存在:

this.state = Environment.getExternalStorageState();
if(!state.equals(Environment.MEDIA_MOUNTED)){
           // don’t exist
}
else{
           // exist
}

如果存在,得到外部存储的路径:

externalStoragePath = Environment.getExternalStorageDirectory()
                                          .getAbsolutePath()+
                                          File.separator;

读入和输出代码为:

FileInputStream(externalStoragePath+fileName);
FileOutputStream(externalStoragePath+fileName);

而用户通过调研这些接口,便可以获得想要的文件的输入输出的Handler了,不是这里说Handler是否合适。


AudioManager:

这里我们将根据音频的大小来处理。如果音频较小(或者说是短),我们利用SoundPool类来处理,建立一个SoundPool实例:

this.soundPool = newSoundPool(20,AudioManager.STREAM_MUSIC,0);

然后通过AssetManager得到某个音频的AssetFileDescriptor:

AssetFileDescriptorassetDescriptor = assets.openFd(fileName);

我们可以利用这个描述符去加载一个音频

int soundId = soundPool.load(assetDescriptor,0)

soundId为音频号,开启音频和关闭音频都靠它了:

soundPool.play(soundId, volume, volume,0, 0, 1);
soundPool.unload(soundId);

如果音频较大,我们可以用MediaPlayer类。在这之前,我们应当设置音频流:

activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);

相同的,获得音频的描述符:

AssetFileDescriptorassetDescriptor = assets.openFd(fileName);

最后音频加载:

 
 
mediaPlayer.setDataSource(assetFD.getFileDescriptor(),assetFD.getStartOffset(), assetFD.getLength());

那么怎么去开启一个音频呢?首先要prepare它,然后才可以start,pause和stop它,如果不想用了,可以release它。

 

InputManager:

游戏的输入分为三类:仪器的加速度(重力感应器)、键盘触发和触摸屏。而这三类都需要Listener来监听,即要实现对应的Listener的接口。


仪器的加速度的实现很简单,其要实现SensorEventListener接口,并且通过Context来注册SensorManager,然后通过SensorManager来得到加速器的Sensor,最后通过Sensor来注册监听器:

SensorManager sensor =(SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
if(sensor.getSensorList(Sensor.TYPE_ACCELEROMETER).size() != 0){
    Sensor accelerometer =sensor.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
    sensor.registerListener(this, accelerometer,SensorManager.SENSOR_DELAY_GAME);
}

然后在Listener中的onSensorChanged中读取加速度:

public void onSensorChanged(SensorEvent event) {
       // TODO Auto-generatedmethod stub
       accelX = event.values[0];
       accelY = event.values[1];
       accelZ = event.values[2];
 
}

接下来实现键盘触发,其要实现OnKeyListener接口,然后就是给指定的View设置监听器:

view.setOnKeyListener(this);
view.setFocusableInTouchMode(true);
view.requestFocus();

然后再Listener中的onKey中处理按键事件,主要对KeyEvent.ACTION_UP和KeyEvent.ACTION_DOWN两个事件进行处理。

 

最后是触摸屏,其要实现OnTouchListener接口,先说说单手指触摸屏的处理,其处理起来很简单,先对指定的View设置监听器:

view.setOnTouchListener(this);

然后再Listener中的onTouch中进行处理,主要处理MotionEvent.ACTION_DOWN,MotionEvent.ACTION_UP,MotionEvent.ACTION_MOVE和MotionEvent.ACTION_CANCEL。

再说说多手指触摸屏触发,其与单手指的最大不同在于获得action和pointerId上,pointerId可以理解为是哪只手在触发:

int action = event.getAction() & MotionEvent.ACTION_MASK;
int pointerIndex =(event.getAction() &MotionEvent.ACTION_POINTER_ID_MASK)
                            >>MotionEvent.ACTION_POINTER_ID_SHIFT;
intpointerId = event.getPointerId(pointerIndex);

最后就是处理事件了。

 

Graphics:

其思想就是封装一种类,可以在屏幕上画一些基本类型的图和Bitmap。我们的思想是先在屏幕上铺一个大的Bitmap作为画纸,任何图形和图层都在这上面画。

我们先封装一下Bitmap,bitmap可以有一个format的属性,分别是:

public static enum PixmapFormat{
       ARGB8888, ARGB4444, RGB565
}

通过这个封装类还可以得到Bitmap的高和宽。我们称这个封装类(其实是个接口)为Pixmap。

还有一个Graphics接口,他定义了创造一个Pixmap,绘画一个Pixmap和基本图形的方法。

 

整合:

最后,也是最关键的就是将上面讲的这4项进行整合,那就是Game接口来定义的,他定义了获得上面五个方面的方法,以及获得当前窗口和设置窗口的方法。然后就是利用AndroidGame类来实现,他会新建一个SurfaceView实例,通过它来将图纸画到屏幕上。

源码可以从这里下载:http://download.csdn.net/detail/whosemario/3754024


接下来就是用这个框架写一个贪吃蛇的程序,甚至有可能将此游戏移植到html5上,敬请期待~


你可能感兴趣的:(游戏,框架,android,action,图形,delay)