实现游戏音效的预加载
来源:互联网 发布:淘宝创作达人登录 编辑:程序博客网 时间:2024/05/14 11:04
游戏中有很多东西是需要预加载进来的,这样可以使游戏更流畅,虽然,游戏中音效占用的资源比较少,但是,还是有必要为音效做一个预加载的,这里用安卓原生的方法实现了一个音效加载系统。
思路:
安卓中游戏的资源通常都是根据id来加载的(这个id可以在R.java文件中找到),在系统中使用了两个HashMap,一个存储资源的ID,一个存储音效加载后的ID,这两个HashMap有共同的key值将两个表联系起来。
系统中实现了资源的加载,根据资源ID播放音效,卸载资源。
下面是脑图的地址,是系统中详细函数的介绍。
http://naotu.baidu.com/file/079133fa68a2e51d5800f905e77ef67b?token=d52654a7a8883f62
Demo代码:
MainActivity.java
package com.example.soundloadsystem;import android.R.integer;import android.app.Activity;import android.content.Context;import android.media.AudioManager;import android.media.SoundPool;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity {public static MainActivity _instance ;public SoundLoadSystem soundLoadSystem;public SoundPool m_soundPool ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(R.layout.activity_main);setContentView(R.layout.main);_instance = this;m_soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);soundLoadSystem = SoundLoadSystem.Instance();addSoundRes();initUICallback();}public void addSoundRes(){soundLoadSystem.add(R.raw.sound_0);soundLoadSystem.add(R.raw.sound_1);soundLoadSystem.add(R.raw.sound_2);soundLoadSystem.add(R.raw.sound_3);soundLoadSystem.add(R.raw.sound_4);soundLoadSystem.add(R.raw.sound_5);}public void initUICallback(){Button btn1 = (Button)findViewById(R.id.Button01);Button btn2 = (Button)findViewById(R.id.Button02);Button btn3 = (Button)findViewById(R.id.Button04);btn1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubsoundLoadSystem.load();}});btn2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub\AudioManager am = (AudioManager)_instance.getSystemService(Context.AUDIO_SERVICE);float streamVolumeCurrent = am.getStreamVolume(AudioManager.STREAM_MUSIC);float streamVolumeMax = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);float volume = streamVolumeCurrent / streamVolumeMax;m_soundPool.play(soundLoadSystem.getRandomID(), volume, volume, 1, 0, 1.0f);}});btn3.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubsoundLoadSystem.unload();}});}}
SoundLoadSystem.java
package com.example.soundloadsystem;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Random;import android.R.integer;import android.content.Context;import android.drm.DrmStore.RightsStatus;import android.media.AudioManager;import android.media.SoundPool;import android.util.Log;public class SoundLoadSystem {public static SoundLoadSystem _instance ;public HashMap<Integer, Integer> m_soundResIDMap ;public HashMap<Integer, Integer> m_soundIDMap;public int m_index = 0 ;public static SoundLoadSystem Instance(){if (_instance == null) {_instance = new SoundLoadSystem();}return _instance ;}public static void Destory(){_instance = null ;System.gc();}private SoundLoadSystem() {// TODO Auto-generated constructor stubm_soundResIDMap = new HashMap<Integer, Integer>();m_soundIDMap = new HashMap<Integer, Integer>();}public void add(Integer id){if (isHave(id) == false) {m_soundResIDMap.put(m_index, id);m_index++ ;}}public void load(){Context cot = MainActivity._instance ;SoundPool spPool = MainActivity._instance.m_soundPool;int per = 0 ;Iterator iterator = m_soundResIDMap.entrySet().iterator() ;while (iterator.hasNext()) {Map.Entry<Integer,Integer> entry = (Map.Entry<Integer,Integer>)iterator.next();Integer index = entry.getKey();Integer id = entry.getValue();Integer spID = spPool.load(cot, id,1);m_soundIDMap.put(index, spID);per++;}}public int getLength(){//Because m_index start from 0,so the length is m_index + 1.return m_soundIDMap.size();}public boolean isHave(Integer id){return m_soundResIDMap.containsValue(id) ;}public Integer getRandomID(){if (m_soundIDMap.size() == 0|| m_soundResIDMap.size() == 0) {Log.e("load_error","Doesn't load any res.");return -1;}Integer ret = -1;Random random = new Random();Integer randInteger = random.nextInt(getLength());ret = m_soundIDMap.get(randInteger);return ret;}public void unload(){SoundPool spPool = MainActivity._instance.m_soundPool;spPool.unload(1);Iterator iterator = m_soundIDMap.entrySet().iterator() ;while (iterator.hasNext()) {Map.Entry<Integer,Integer> entry = (Map.Entry)iterator.next();Integer id = entry.getValue();spPool.unload(id);}m_soundIDMap.clear();m_soundIDMap = new HashMap<Integer, Integer>();}public int getSoundIDByResID(Integer resID){int soundID = -1;int index = -1;boolean isHave = m_soundResIDMap.containsKey(resID);if (isHave) {Iterator iterator = m_soundIDMap.entrySet().iterator() ;while (iterator.hasNext()) {Map.Entry<Integer,Integer> entry = (Map.Entry)iterator.next();Integer idx = entry.getKey();Integer id = entry.getValue();if (id == resID) {index = idx ;}}soundID = m_soundIDMap.get(index);}else {Log.e("sound_res","can't find sound which id is" + resID);}return soundID ;}public void reset(){m_soundIDMap.clear();m_soundResIDMap.clear();m_soundIDMap = new HashMap<Integer, Integer>();m_soundResIDMap = new HashMap<Integer, Integer>();m_index = 0;}}
Demo下载地址:http://download.csdn.net/detail/c_boy_lu/9300661
0 0
- 实现游戏音效的预加载
- Android游戏音效实现
- android音效的加载方式
- 游戏音效创作是游戏的灵魂
- 【Android 应用开发】Android游戏音效实现
- 科普小知识:VR游戏的音效
- 【cocos2d-x IOS游戏开发-捕鱼达人19】音乐与音效的实现
- Android游戏开发中使用SoundPool来实现音效的播放
- Unity之C#——用单例实现一个游戏内部的音效控制器
- IOS音乐和音效的加载播放
- Android游戏设计之-------游戏音效的播放 SoundPool
- 利用Directsound 3D实现游戏中3D音效
- 利用Directsound 3D实现游戏中3D音效
- 游戏中按概率播放某个音效简单c++实现
- 音效系统实现:事件音效
- Android 游戏音效控制
- 游戏音效制作
- 游戏音效下载网站大全
- 安卓的几种延迟方式
- Pyserial+PyQT+Python3.4串口工具——界面
- 创建型模式——工厂方法模式
- 查找OGG trail file中是否存在相关记录的命令
- Button事件实现方法的总结
- 实现游戏音效的预加载
- 制作S3C6410 的交叉编译链
- Kamailio安装指南
- 继承、初始化方法、便利构造器
- 王学岗属性动画上(十一)——属性动画的综合应用
- apt-get update报错问题
- matlab曲线拟合
- 昌大软院大神养成计划之网页设计之路第八天
- 对表的一些基本操作