from: http://bbs.9ria.com/thread-77302-1-1.html
演示程序
http://www.adamatomic.com/canabalt/
http://www.flixel.org/mode/
Flixel横板游戏制作教程(六)—SoundsandMusic(音效与音乐)
本教程是接着Flixel横板游戏制作教程(五)—Enemies (加入敌人)来做的。
音乐音效的加入让游戏更生动,快试试吧,下面是教程咯~
先看到 Player 类:
package
{
import org.flixel.FlxG;
import org.flixel.FlxGroup;
import org.flixel.FlxObject;
import org.flixel.FlxSprite;
/**
* ...
* @author zb
*/
public class Player extends FlxSprite
{
//***********已有的内容**************//
//跳跃的声音
[Embed(source = 'media/jump.mp3')]
protected var jumpSnd:Class;
//着地的声音
[Embed(source = 'media/land.mp3')]
protected var landSnd:Class;
//***********已有的内容**************//
//重写update 方法,用于控制
public override function update():void
{
//***********已有的内容**************//
//找到 这里,然后在下面加上
if(FlxG.keys.justPressed('X') && onFloor)
{
//跳跃的时候,人物的y轴速度是向上的
velocity.y = -JUMP_ACCELERATION;
//播放跳跃声音
//参数1:播放的声音类
//参数2:声音大小,默认为1
//参数3:是否循环,默认为false
FlxG.play(jumpSnd,1.0,false);
}
//***********已有的内容**************//
}
//重写这个碰到下方的方法,主要是加一个落地声音
override public function hitBottom(Contact:FlxObject,Velocity:Number):void
{
//为什么要 速度大于50呢?
//首先是因为,当人物在地面的时候,会不停的检测碰撞
//那么hitBottom会不停的检测,如果不加一个速度判断
//那么声音会不停的 播放
//所以加一个速度值判断 就是为了 让人物在地面的时候(地面时y速度为0)
//不会播放落地声音。。
if (velocity.y > 50)
{
//落地声音
FlxG.play(landSnd);
}
super.hitBottom(Contact, Velocity);
}
}
}
package
{
import org.flixel.FlxG;
import org.flixel.FlxGroup;
import org.flixel.FlxObject;
import org.flixel.FlxState;
import org.flixel.FlxTileblock;
import org.flixel.FlxU;
/**
* ...
* @author zb
*/
public class GameState extends FlxState
{
//***********已有的内容*************//
//背景音乐
[Embed(source = 'media/mode.mp3')]
protected var bgMusic:Class;
//找到这个方法
override public function create():void
{
//***********已有的内容*************//
//添加背景音乐
addBackGroundMusic();
}
//***********已有的内容*************//
private function addBackGroundMusic():void
{
//play 和 playMusic 有什么区别?
//区别就是在于 play 方法的 第三个参数:Looped
//playMusic 没有这个 Looped ,是因为这个方法是播放循环音乐
//相当于 play 方法的 Looped 参数设置为 true,默认为false
FlxG.playMusic(bgMusic);
}
}
}
下面是Bullet 类:
package
{
import org.flixel.FlxG;
import org.flixel.FlxObject;
import org.flixel.FlxSprite;
/**
* ...
* @author zb
*/
public class Bullet extends FlxSprite
{
//***********已有的内容************//
//发射子弹的声音
[Embed(source = 'media/shoot.mp3')]
protected var shootSnd:Class;
//子弹碰到障碍物的声音
[Embed(source = 'media/hit.mp3')]
protected var hitSnd:Class;
//***********已有的内容************//
//找到这个方法
public function shoot(sPosX:Number,sPosY:Number,velX:Number,velY:Number):void
{
//***********已有的内容************//
//播放发射时的声音
FlxG.play(shootSnd);
}
//***********已有的内容************//
//找到这个方法
override public function hurt(Damage:Number):void
{
//***********已有的内容************//
//播放碰到障碍物时爆炸的声音
FlxG.play(hitSnd);
}
}
}
接着是 Enemy 类:
package
{
import org.flixel.FlxEmitter;
import org.flixel.FlxG;
import org.flixel.FlxObject;
import org.flixel.FlxSprite;
/**
* ...
* @author zb
*/
public class Enemy extends FlxSprite
{
//***********已有的内容**************//
//敌人爆炸的声音
[Embed(source = 'media/asplode.mp3')]
protected var asplodeSnd:Class;
//***********已有的内容**************//
//找到这个方法
override public function kill():void
{
//***********已有的内容**************//
//播放敌人爆炸的声音
FlxG.play(asplodeSnd);
}
//***********已有的内容**************//
}
}
最后是 GameState 类: