Android游戏之音频类设计

Android游戏之音频类设计

maxStreams the maximum number of simultaneous streams for this SoundPool object streamType the audio stream type as described in AudioManager For example, game applications will normally use STREAM_MUSIC. srcQuality the sample-rate converter quality. Currently has no effect. Use 0 for the default.

Returnsa SoundPool object, or null if creation failedF.MediaPlayerG.MediaPlayer.OnCompletionListener

2、设计3个接口Sound,Music,Audio,音频Audio由声音Sound和音乐Music构成package com.badlogic.androidgames.framework;public interface Sound {public void play(float volume);public void dispose();}package com.badlogic.androidgames.framework;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();}package com.badlogic.androidgames.framework;public interface Audio {public Music newMusic(String filename);public Sound newSound(String filename);}3、针对3个接口实现每一个对应的类package com.badlogic.androidgames.framework.impl;import java.io.IOException;import android.content.res.AssetFileDescriptor;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import com.badlogic.androidgames.framework.Music;public class AndroidMusic implements Music, OnCompletionListener {MediaPlayer mediaPlayer;boolean isPrepared = false;public AndroidMusic(AssetFileDescriptor assetDescriptor) {mediaPlayer = new MediaPlayer();try {mediaPlayer.setDataSource(assetDescriptor.getFileDescriptor(),assetDescriptor.getStartOffset(),assetDescriptor.getLength());mediaPlayer.prepare();isPrepared = true;mediaPlayer.setOnCompletionListener(this);} catch (Exception e) {throw new RuntimeException("Couldn’t load music");}}@Overridepublic void dispose() {if (mediaPlayer.isPlaying())mediaPlayer.stop();mediaPlayer.release();}@Overridepublic boolean isLooping() {return mediaPlayer.isLooping();}@Overridepublic boolean isPlaying() {return mediaPlayer.isPlaying();}@Overridepublic boolean isStopped() {return !isPrepared;}@Overridepublic void pause() {if (mediaPlayer.isPlaying())mediaPlayer.pause();}@Overridepublic void play() {if (mediaPlayer.isPlaying())return;try {synchronized (this) {if (!isPrepared)mediaPlayer.prepare();mediaPlayer.start();}} catch (IllegalStateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void setLooping(boolean isLooping) {mediaPlayer.setLooping(isLooping);}@Overridepublic void setVolume(float volume) {mediaPlayer.setVolume(volume, volume);}@Overridepublic void stop() {mediaPlayer.stop();synchronized (this) {isPrepared = false;}}@Overridepublic void onCompletion(MediaPlayer arg0) {synchronized (this) {isPrepared = false;}}}

package com.badlogic.androidgames.framework.impl;import android.media.SoundPool;import com.badlogic.androidgames.framework.Sound;public class AndroidSound implements Sound {int soundId;SoundPool soundPool;public AndroidSound(SoundPool soundPool,int soundId) {this.soundId = soundId;this.soundPool = soundPool;}@Overridepublic void play(float volume) {soundPool.play(soundId, volume, volume, 0, 0, 1);}@Overridepublic void dispose() {soundPool.unload(soundId);}}

package com.badlogic.androidgames.framework.impl;import java.io.IOException;import android.app.Activity;import android.content.res.AssetFileDescriptor;import android.content.res.AssetManager;import android.media.AudioManager;import android.media.SoundPool;import com.badlogic.androidgames.framework.Audio;import com.badlogic.androidgames.framework.Music;import com.badlogic.androidgames.framework.Sound;public class AndroidAudio implements Audio {AssetManager assets;SoundPool soundPool;public AndroidAudio(Activity activity) {activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);this.assets = activity.getAssets();this.soundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);}@Overridepublic Music newMusic(String filename) {try {AssetFileDescriptor assetDescriptor = assets.openFd(filename);return new AndroidMusic(assetDescriptor);} catch (IOException e) {throw new RuntimeException("Couldn’t load music ‘" + filename + "’");}}@Overridepublic Sound newSound(String filename) {try {AssetFileDescriptor assetDescriptor = assets.openFd(filename);int soundId = soundPool.load(assetDescriptor, 0);return new AndroidSound(soundPool, soundId);} catch (IOException e) {throw new RuntimeException("Couldn’t load sound ‘" + filename + "’");}} }

本文浅述了“beginning-android-games”书本的相关基础知识和相关类的设计分析,书本和源码:本篇中的类实现来自“beginning-android-games\ch07-gl-basics”

,不义而富且贵,于我如浮云。

Android游戏之音频类设计

相关文章:

你感兴趣的文章:

标签云: