`
daikainan
  • 浏览: 201888 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Android游戏开发学习(7)--MediaPlayer与SoundPool详解与应用

阅读更多

MediaPlayer:使用简单,适合做游戏的背景音乐,资源占用量较高、延迟时间较长、不支持多个音频同时播放等。

音乐文件正常播放完毕,而又没有设置循环播放的话就进入该状态,并会触发OnCompletionListener的onCompletion()方法。
此时可以调用start()方法重新从头播放文件,也可以stop()停止MediaPlayer,或者也可以seekTo()来重新定位播放位置,播放下一首音乐
如果你设置了循环播放  mp.setLooping(true); 的话,那么永远都不会监听到播放完成的状态!!!!这里一定要注意!


SoundPool:适合播放游戏中的特效,如技能声音,怪物叫声等时间很短的音乐

1. SoundPool最大只能申请1M的内存空间。

2. 音频格式建议使用OGG格式。使用WAV格式的音频文件存放游戏音效,经过反复测试,在音效播放间隔较短的情况下会出现异常关闭的情况

3.在使用SoundPool播放音频的时候,如果在初始化中就调用播放函数进行播放音乐那么根本没有声音,不是因为没有执行,而是 SoundPool需要一准备时间

----------------------------------------------------------------------------------------------------------------
下面以实例说明:

首先看效果

 

 

 

 

 

 

       你不停的点击在MediaPlayer与SoundPool发射子弹是会发现,SoundPool的更适合做音乐特效,MediaPlayer适合做背景音乐。
     其他不做解释:自己下载源码,亲自运行,然后打开背景音乐,不停的点击右侧的6个发射按钮,慢慢体验,你会明白的。。。

 

 

 

在看代码

 

package dk.game;

import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

public class MusicTestActivity extends Activity {
	
	private MediaPlayer mediaPlayerBg;
	private MediaPlayer mediaPlayerTeXiao1;
	private MediaPlayer mediaPlayerTeXiao2;
	private MediaPlayer mediaPlayerTeXiao3;
	private SoundPool soundPool;
	private AudioManager am; 
	private int maxVol;
	private int loadId1,loadId2,loadId3;
	private Context context;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //全屏显示
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        //去掉标题
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        //横屏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        setContentView(R.layout.main);
        //获得当前的上下文
        context=getApplicationContext();
        
        mediaPlayerBg=MediaPlayer.create(context, R.raw.bgmusic);
        //背景音乐循环播放
        mediaPlayerBg.setLooping(true);
        mediaPlayerTeXiao1=MediaPlayer.create(context, R.raw.shoot1);
        mediaPlayerTeXiao2=MediaPlayer.create(context, R.raw.shoot2);
        mediaPlayerTeXiao3=MediaPlayer.create(context, R.raw.shoot3);
        //SoundPool的初始化
        /*
         * 第一个参数是:同时播放特效的数量
         * 第二个参数是:音乐播放的音频流
         * 第三个参数是:音乐的质量
         */
        soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 100);
        loadId1=soundPool.load(context, R.raw.shoot1, 1);
        loadId2=soundPool.load(context, R.raw.shoot2, 1);
        loadId3=soundPool.load(context, R.raw.shoot3, 1);
        /*
		 * Android OS中,如果你去按手机上的调节音量的按钮,会分两种情况,
		 * 一种是调整手机本身的铃声音量,一种是调整游戏,软件,音乐播放的音量
		 * 当我们在游戏中的时候 ,总是想调整游戏的音量而不是手机的铃声音量,
		 * 可是烦人的问题又来了,我在开发中发现,只有游戏中有声音在播放的时候
		 * ,你才能去调整游戏的音量,否则就是手机的音量,有没有办法让手机只要是
		 * 在运行游戏的状态就只调整游戏的音量呢?试试下面这段代码吧!
		 * setVolumeControlStream(AudioManager.STREAM_MUSIC);
		 * 设定调整音量为媒体音量,当暂停播放的时候调整音量就不会再默认调整铃声音量了
		 */
        setVolumeControlStream(AudioManager.STREAM_MUSIC);
        
        // 获取音频服务然后强转成一个音频管理器,后面方便用来控制音量大小用
     	am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
        // 获取最大音量值(15最大! .不是100!)
     	maxVol = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    }
    /**
     * 播放背景音乐
     * @param view
     */
    public void startBgMusic(View view){
    	if(mediaPlayerBg != null) {
    		  mediaPlayerBg.stop();
    	}
    	try {
			mediaPlayerBg.prepare();
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
    	mediaPlayerBg.start();
    }
    /**
     * 停止播放背景音乐
     * @param view
     */
    public void stopBgMusic(View view){
    	mediaPlayerBg.stop();
    }
    
    
    /**
     * MediaPlayer特效1
     * @param view
     */
    public void playTeXiao1(View view){
    	if(mediaPlayerTeXiao1 != null) {
    		mediaPlayerTeXiao1.stop();
    	}
    	try {
    		mediaPlayerTeXiao1.prepare();
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
    	mediaPlayerTeXiao1.start();
    }
    /**
     * MediaPlayer特效2
     * @param view
     */
    public void playTeXiao2(View view){
    	if(mediaPlayerTeXiao2 != null) {
    		mediaPlayerTeXiao2.stop();
    	}
    	try {
    		mediaPlayerTeXiao2.prepare();
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
    	mediaPlayerTeXiao2.start();
    }
    /**
     * MediaPlayer特效2
     * @param view
     */
    public void playTeXiao3(View view){
    	if(mediaPlayerTeXiao3 != null) {
    		mediaPlayerTeXiao3.stop();
    	}
    	try {
    		mediaPlayerTeXiao3.prepare();
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
    	mediaPlayerTeXiao3.start();
    }
    
    
    /**
     * SoundPool特效1
     * @param view
     */
    public void playSoundPoolTeXiao1(View view){
    	//参数1:播放特效加载后的ID值
    	//参数2:左声道音量大小(range = 0.0 to 1.0)
    	//参数3:右声道音量大小(range = 0.0 to 1.0)
    	//参数4:特效音乐播放的优先级,因为可以同时播放多个特效音乐
    	//参数5:是否循环播放,0只播放一次(0 = no loop, -1 = loop forever)
    	//参数6:特效音乐播放的速度,1F为正常播放,范围 0.5 到 2.0
    	soundPool.play(loadId1, 0.5f, 0.5f, 1, 0, 1f);
    	
    }
    /**
     * SoundPool特效2
     * @param view
     */
    public void playSoundPoolTeXiao2(View view){
    	soundPool.play(loadId2, 0.5f, 0.5f, 1, 0, 1f);
    	
    }
    /**
     * SoundPool特效3
     * @param view
     */
    public void playSoundPoolTeXiao3(View view){
    	soundPool.play(loadId3, 0.5f, 0.5f, 1, 0, 1f);
    	
    }
    
}

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="fill_parent"
        android:background="@drawable/bg"
        android:layout_height="fill_parent" >

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentBottom="true"
            android:text="停止背景音乐" 
            android:onClick="stopBgMusic"
            />
         <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/button1"
            android:layout_alignParentLeft="true"
            android:text="播放背景音乐" 
            android:onClick="startBgMusic"
            />
  
 		<Button
            android:id="@+id/button43"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:text="SoundPool发射子弹3" 
            android:onClick="playSoundPoolTeXiao3"
            />
 		<Button
            android:id="@+id/button42"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_above="@id/button43"
            android:text="SoundPool发射子弹2" 
            android:onClick="playSoundPoolTeXiao2"
            />
 		        
 		 <Button
            android:id="@+id/button41"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_above="@id/button42"
            android:text="SoundPool发射子弹1" 
            android:onClick="playSoundPoolTeXiao1"
            />
 		 
 		 <Button
            android:id="@+id/button23"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@id/button43"
            android:layout_alignParentBottom="true"
            android:text="MediaPlayer发射子弹3" 
            android:onClick="playTeXiao3"
            />
 		 
 		 <Button
            android:id="@+id/button22"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
           android:layout_toLeftOf="@id/button42"
            android:layout_above="@id/button23"
            android:text="MediaPlayer发射子弹2" 
            android:onClick="playTeXiao2"
            />
 		 <Button
            android:id="@+id/button21"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
           android:layout_toLeftOf="@id/button41"
            android:layout_above="@id/button22"
            android:text="MediaPlayer发射子弹1" 
            android:onClick="playTeXiao1"
            />
 		 
    </RelativeLayout>

</LinearLayout>
 

 

最后源码 :郁闷文件大小不能超过10MB,分成2个压缩包了

 

 

 

 

 

 

 

 

 

  • 大小: 69.6 KB
1
0
分享到:
评论
3 楼 yangmaolinpl 2014-07-25  
顶下楼主,新学。
2 楼 张雪源 2012-07-24  
学习一下!
1 楼 cheneyszp 2012-07-09  
赞lz~~~

相关推荐

    Android应用开发详解.pdf

    标题:“Android应用开发详解.pdf” 描述:“下载不需要资源分,非常值得看,对学习将会有很大的帮助。...希望这份“Android应用开发详解.pdf”能够为你的学习之路提供有价值的指导和帮助,开启你的Android开发之旅。

    Android 2.0游戏开发实战宝典

    - 游戏开发概述:讲解游戏的基本架构,以及在Android平台上开发游戏的优劣势。 - OpenGL ES入门:介绍OpenGL ES 2.0,它是Android游戏开发中常用的图形渲染库。 2. **第2章** - Android游戏项目构建 - 创建...

    android小游戏源码.rar

    - **Android SDK**:所有Android应用开发的基础,包含了一系列工具、库和API,用于构建、调试和发布Android应用。 - **Java语言**:Android主要的开发语言,虽然现在Kotlin更为推荐,但很多早期的游戏源码仍使用...

    android 小游戏源码

    Android小游戏源码是一个学习和研究Android应用开发的宝贵资源,它可以帮助开发者深入理解游戏开发的基本原理、设计模式以及Android平台上的编程实践。在本篇文章中,我们将围绕Android小游戏源码展开,探讨其中的...

    Android3D游戏开发技术详解与典型案例源代码(16-22章).rar

    《Android 3D游戏开发技术详解与典型案例源代码(16-22章)》是一部深入探讨Android平台3D游戏开发的专业教程,包含了丰富的实践案例和源代码,旨在帮助开发者掌握构建高性能3D游戏的关键技术和策略。以下是这些章节中...

    基于AndroidStudio打地鼠小游戏源代码

    首先,我们要了解Android Studio是Google官方推荐的Android应用开发集成环境,它提供了强大的IDE功能,包括代码编辑、调试、构建工具等,使得开发者能够高效地进行Android应用开发。对于游戏开发,Android Studio还...

    基于Android Studio的打砖块游戏(简易版).zip

    在移动应用开发领域,Android Studio作为Google官方推荐的Android应用开发工具,具有强大的功能和便捷的集成开发环境。本项目"基于Android Studio的打砖块游戏(简易版)",提供了一个简单易学的实例,旨在帮助...

    基于android的网球游戏

    【基于Android的网球游戏开发详解】 在移动设备领域,Android平台因其开源特性和广泛的设备覆盖范围,成为开发者们实现创新游戏的重要舞台。本篇将深入探讨如何开发一款基于Android的网球游戏,以此为例,让我们...

    android飞机游戏.rar

    2. 音效与音乐:Android的MediaPlayer和SoundPool类可以处理游戏的音效和背景音乐,提升游戏体验。 五、性能优化 1. 多线程:为了保证游戏流畅运行,通常会将渲染和逻辑计算放在不同的线程中,避免阻塞主线程。 2...

    Android应用源码之滚屏动作游戏-太空保卫战源码-IT计算机-毕业设计.zip

    《Android应用源码详解:滚屏动作游戏-太空保卫战》 在移动开发领域,Android平台因其开源性和广泛的设备支持,成为了许多开发者首选的开发环境。对于学生而言,毕业设计是一个展示技能、深入理解编程原理的重要...

    一款Android的像素游戏

    《Android像素游戏开发详解》 在移动平台,尤其是Android系统上,像素游戏因其独特的艺术风格和简单的编程逻辑,成为许多开发者和爱好者入门游戏开发的首选。本篇文章将深入探讨如何利用Java语言创建一款像素风格的...

    android迷宫游戏源代码

    在Android平台上开发游戏,开发者可以利用丰富的API和工具集,为用户带来各种各样的游戏体验。本项目名为“MiGong1.1”,是一款基于Android 2.2(Froyo)系统的小型迷宫游戏。尽管存在一些小问题,但整体上它能正常...

    Android拼图游戏源码

    在Android平台上开发游戏,开发者通常会利用Java或Kotlin作为主要编程语言,配合Android Studio作为集成开发环境。本项目是一个基于Android的拼图游戏源码,它为学习Android游戏开发提供了实际的案例,帮助开发者...

    Android应用源码之推箱子小游戏源码.zip

    综上所述,分析Android应用源码中的推箱子小游戏,我们可以学习到Android应用开发的基本流程,理解自定义View的绘制,掌握游戏逻辑和物理引擎的设计,以及如何处理用户输入和优化图形界面。通过实践这样的项目,...

    Android版打飞机游戏

    《Android版打飞机游戏开发详解》 在移动设备上,打飞机游戏因其简单易上手、趣味性强的特点,深受广大用户喜爱。本项目是针对Android平台开发的一款打飞机游戏,其核心亮点在于随机生成多种敌机,为玩家带来丰富的...

    android连连看游戏源码

    通过分析这个Android连连看游戏源码,开发者不仅可以学习到基本的Android应用开发知识,还能深入理解游戏开发中的逻辑处理、资源管理、用户交互等核心技能。对于希望提升Android游戏开发能力的人来说,这是一个非常...

Global site tag (gtag.js) - Google Analytics