from: http://bbs.9ria.com/thread-77302-1-1.html
演示程序
http://www.adamatomic.com/canabalt/
http://www.flixel.org/mode/
Flixel横板游戏制作教程(十一)—JetPack(飞行背包)
Flixel横板游戏制作教程(十一)—JetPack(飞行背包)
本教程是接着Flixel横板游戏制作教程(十)—Pickups(拾取道具)来做的。
给角色带一个飞行器,是不是感觉很酷?那我们赶快开始吧~
这里 按 SPACE(空白键)为使用飞行背包。
看到 Player 类:
package
{
import org.flixel.FlxEmitter;
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/jet.png')]
protected var jetImg:Class;
//飞行背包的音效
[Embed(source = 'media/jetpack.mp3')]
protected var sndJetPack:Class;
//飞行背包 粒子发射器
private var jetPack:FlxEmitter;
//飞行背包的 气体 消失的时间,变量,计时用,-1为不计时
private var jetPackCountDown:Number = -1;
//飞行背包的气体消失时间的初始值,设置为0.5秒
private const COUNT_DOWN:Number = 0.5;
//初始化给个初始坐标,当然可以不用参数,不过super的时候一定要加上
public function Player(startX:Number=100,startY:Number=50):void
{
//**********已有的内容************//
//添加飞行背包
addJetPack();
}
//重写update 方法,用于控制
public override function update():void
{
//**********已有的内容************//
//按住 Space 键 开始飞行
if (FlxG.keys.pressed('SPACE'))
{
//播放喷气时的音效
FlxG.play(sndJetPack);
//on 这个属性,是指 粒子发射器 是否正在发射粒子。
//这里判断 当 没有发射粒子时
if (!jetPack.on)
{
//粒子开始发射,
//参数1:设置false,这样粒子就不会 一次性全部 发射完,而是一个接一个发射,并且会无限发射
//参数2:设置0.02,每个粒子的发射间隔为 0.02秒
jetPack.start(false, 0.02);
}
//将player 的 y 轴 加速度 设置为 这个值,方向向上
this.acceleration.y = -JUMP_ACCELERATION;
//设置 jetPack 的 x 和 y 坐标,
//就是让 发射器 实时跟随者 Player
jetPack.x = this.x + this.width * 0.5;
jetPack.y = this.y + this.height;
//设置为 -1
jetPackCountDown = -1;
}
//当 放开 space 按键时
if (FlxG.keys.justReleased('SPACE'))
{
//计数器 设置这个值,也就是0.5秒,即开始计时
jetPackCountDown = COUNT_DOWN;
//同时Player 的y轴加速度变为 重力值
this.acceleration.y = GRAVITY_ACCELERATION;
}
//当计数器 不为 -1时,也就是说 开始计时
if (jetPackCountDown != -1)
{
//计时器开始计时
//每次 update 都会减去 一个 值
//elapsed 就是 每次 update 经过的时间
jetPackCountDown -= FlxG.elapsed;
//当 计时器 减少到 0以下时
if (jetPackCountDown<=0)
{
//计时器 设置为 -1
jetPackCountDown = -1;
//同时将 飞行背包 kill 掉,这样气体就会消失
jetPack.kill();
}
}
/*** 切记 ***/
//这个语句一定要加上去,只要重写了update,就一定要调用 super的update
//否则不会刷新动画。。也不会响应你在这里所设置的控制
super.update();
}
//**********已有的内容************//
private function addJetPack():void
{
jetPack = new FlxEmitter();
//创建粒子
//参数1:粒子素材
//参数2:粒子的最大数量
jetPack.createSprites(jetImg, 15);
//将粒子发射时的 x 和 y 轴速度 设置为0,让喷射的气体位置不变
jetPack.setXSpeed(0, 0);
jetPack.setYSpeed(0, 0);
//设置粒子不会旋转
jetPack.setRotation(0, 0);
//设置粒子不受重力影响
jetPack.gravity = 0;
//记得添加到state 中。。
FlxG.state.add(jetPack);
}
}
}