from: http://bbs.9ria.com/thread-77302-1-1.html
演示程序
http://www.adamatomic.com/canabalt/
http://www.flixel.org/mode/
Flixel横板游戏制作教程(十)—Pickups(拾取道具)
Flixel横板游戏制作教程(十)—Pickups(拾取道具)
本教程是接着Flixel横板游戏制作教程(九)—SquashingthePlayer(挤压Player)来做的。
下面开始制作拾取的道具——金币。
先是金币 Coin 类:
package
{
import org.flixel.FlxG;
import org.flixel.FlxSprite;
/**
* ...
* @author zb
*/
public class Coin extends FlxSprite
{
//金币素材
[Embed(source = 'media/coin.png')]
protected var coinImg:Class;
//拾取金币时的音效
[Embed(source = 'media/pickup.mp3')]
protected var getSnd:Class;
//金币是否已经被拾取的 标识
public var hasGotten:Boolean = false;
public function Coin(px:Number,py:Number):void
{
loadGraphic(coinImg, true, false, 8, 8);
//设置coin的坐标
//这里 y 坐标向上移动一个 coin 的高度,
//主要是方便 如果将coin 直接放在平台上时不会与平台重叠
this.y -= (px + this.height);
this.x = px;
//金币动画
addAnimation('roll', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 12);
play('roll');
//给金币一个 y 轴方向的加速度以及最大速度
//因为本教程是让金币从高空中落下
acceleration.y = 300;
maxVelocity.y = 300;
}
//获取金币时的方法
public function getCoin():void
{
//获取金币时 设置为 true
hasGotten = true;
//同时将金币的y 速度 设置为 向上
//让金币获取时 有个 向上弹起的动作
this.velocity.y = -0.5 * this.acceleration.y;
//播放获取金币时的音效。
FlxG.play(getSnd);
}
//重写 update
override public function update():void
{
//这里判断 当 y 速度大于50,同时已经被 获取时
//也就是在金币 被 player 获取后,在弹起下落过程时
if (velocity.y>=50 && hasGotten)
{
//将金币 kill 掉
this.kill();
}
//别忘了
super.update();
}
}
}
下面是GameStage 类:
package
{
import org.flixel.FlxG;
import org.flixel.FlxGroup;
import org.flixel.FlxObject;
import org.flixel.FlxSprite;
import org.flixel.FlxState;
import org.flixel.FlxText;
import org.flixel.FlxTileblock;
import org.flixel.FlxU;
/**
* ...
* @author zb
*/
public class GameState extends FlxState
{
//*********已有的内容************//
//金币组
private var coinGroup:FlxGroup;
override public function create():void
{
//*********已有的内容************//
//加入可以拾取的金币
addCoins();
}
//*********已有的内容************//
override public function update():void
{
//*********已有的内容************//
//注意,如果 collide 方法 放在 overlap 方法之后,那么 coin 不会弹起来
//因为如果先是 overlap 判断,然后在判断 collide 的话,顺序是
//overlap 时,给 coin 赋值 y 的速度,但是并没有update数据,
//接着判断 collide,此时因为 coin 与地面还是碰撞着的,
//所以 collide 判断又把 coin 的 y 速度变为了0,
//下面接着的update 刷新了数据,此时coin y速度为0,coin 也就不会弹起来
FlxU.collide(coinGroup, levels);
FlxU.overlap(player, coinGroup, getCoin);
//还是要提醒下,别忘了加上。。。
super.update();
}
//*********已有的内容************//
private function addCoins():void
{
coinGroup = new FlxGroup();
var coin:Coin;
for (var i:int = 0; i < 5; i++)
{
coin = new Coin(10 + i * 30, 20);
coinGroup.add(coin);
}
add(coinGroup);
}
private function getCoin(ob1:FlxSprite,ob2:FlxSprite):void
{
var coin:Coin = ob2 as Coin;
//当金币没有被获取时,才获取金币
if (!coin.hasGotten)
{
coin.getCoin();
}
}
}
}