forked from: forked from: [CannonML][Flixel]BulletRunner Test

by ohisama
♥0 | Line 275 | Modified 2013-02-03 12:30:02 | MIT License
play

ActionScript3 source code

/**
 * Copyright ohisama ( http://wonderfl.net/user/ohisama )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/isPt
 */

// forked from raarlac's forked from: [CannonML][Flixel]BulletRunner Test
// forked from civet's [CannonML][Flixel]BulletRunner Test
package
{
    import flash.display.*;
    import flash.events.*;
    import org.flixel.FlxGame;
    [SWF(width="465", height="465", frameRate="30")]
    public class FirstShmups extends Sprite
    {
        public function FirstShmups() 
        {
            this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        }
        private function onAddedToStage(e : Event) : void 
        {
            this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
            run();
        }
        private function run() : void
        {
            this.addChild(new FlxGame(465, 465, PlayState, 1));
        }
    }
}
import flash.display.Sprite;
import flash.utils.setTimeout;
import org.flixel.*;
import org.flixel.system.input.Keyboard;
import org.si.cml.CMLObject;
import org.si.cml.CMLSequence;
import org.si.cml.extensions.BulletRunner;
class PlayState extends FlxState
{         
    private var _rootCML : String = "py16[[px$??*216+216n{10}w40-$r*20]4l$r+=0.1]";
    private var _missCount : int;
    private var _score  :int;
    private var _textfield : FlxText;
    private var _player : Player;
    private var _shots : FlxGroup;
    private var _enemies : FlxGroup;
    private var _bullets : FlxGroup;
    override public function create() : void
    {
        _player = new Player(228, 400);
        _shots = Player.shots;
        _enemies = Enemy.enemies;
        _bullets = Bullet.bullets;
        this.add(_player);
        this.add(_shots);
        this.add(_enemies);
        this.add(_bullets);
        _textfield = new FlxText(0, 0, 200, "SCORE : 0 / MISS : 0 / RANK : 0");
        this.add(_textfield);
        BulletRunner.setDefaultScope(0, 0, 465, 465);
        var br : BulletRunner = BulletRunner.apply( new Sprite() );//dummy?
        br.callbacks = {"onNew": onRootNew};
        br.runSequence(_rootCML);
        super.create();
    }
    override public function update() : void
    {           
        BulletRunner.updateTargetPosition(_player.x, _player.y);
        FlxG.collide(_bullets, _player, overlapBulletsPlayer);
        FlxG.collide(_shots, _enemies, overlapShotsEnemies);
        super.update();
    }
    public function onRootNew(args : Array) : BulletRunner
    {
        return Enemy.create();
    }
    public function overlapBulletsPlayer(bullet : Bullet, player : Player):void
    {
        var emitter : FlxEmitter = createEmitter(0xffffffff, 8);
        emitter.at(_player);
        emitter.start();
        this.add(emitter);
        _bullets.kill();
        player.kill();
        _missCount++;
        updateText();
        BulletRunner.pause();
        setTimeout(reborn, 1000);
    }
    private function reborn() : void
    {
        _player = new Player(216, 400);  
        add(_player);
        _bullets = new FlxGroup();
        Bullet.bullets = _bullets;
        add(_bullets);
        BulletRunner.resume();
    }
    public function overlapShotsEnemies(shot : Shot, enemy : Enemy) : void
    {
        var emitter : FlxEmitter = createEmitter(0xffff0000, 2);
        emitter.at(enemy);
        emitter.start();
        this.add(emitter);
        enemy.damage(0.2);
        _score++;
        updateText();
    }
    private function updateText() : void
    {
        _textfield.text = "SCORE : " + _score.toString() + " / MISS : " + _missCount.toString() + " / RANK : " + CMLObject.globalRank.toFixed(1);
    }    
    private function createEmitter(color : uint, num : int) : FlxEmitter
    {
        var emitter : FlxEmitter = new FlxEmitter();
        emitter.gravity = 0;
        emitter.maxRotation = 0;
        emitter.setXSpeed(-500, 500);
        emitter.setYSpeed(-500, 500);
        var particles : int = num;
        for(var i : int = 0; i < particles; i++) 
        {
            var particle : FlxParticle = new FlxParticle();
            particle.makeGraphic(2, 2, color);
            particle.exists = false;
            emitter.add(particle);
        }
        return emitter;        
    }
}
class Enemy extends FlxSprite
{
    public static var enemies : FlxGroup = new FlxGroup();
    public static var sequences : Array = 
    [
        new CMLSequence("v0,10i20v~bm5,120   [f4+$r*4{6}w20]3ay0.3"),         // 5 way barrage, repeat 3 times
        new CMLSequence("v0,10i20v~bm5,0,2   [f7-$r*3{5}w20]3ay0.3"),         // 5 straight bullets, repeat 3 times
        new CMLSequence("v0,10i20v~bm5,0,0,2 [f8+$r*6{3}w20]3 ay0.3"),        // 5 rapid-fire cannon, repeat 3 times
        new CMLSequence("v0,10i20v~bm8,15,4,2htx[f7+$r*3{4}w30]2ay0.3"),      // 5 "whip" type barrage, repeat 2 times
        new CMLSequence("v0,10i20v~br5,30,2,4[f8+$r*6{4}w30]2ay0.3"),         // 5 random bullets, repeat 2 times
        new CMLSequence("v0,10i20v~bm12,360  [f8{6i10v~vd6+$r*8}w30]2ay0.3"), // 12 round barrage, repeat 2 times
        new CMLSequence("v0,10i20v~bm24,360,0,1bm2,180 f4+$r*8{3}w60 ay0.3")  // doubled all range barrage
    ];
    private var _bulletRunner : BulletRunner;
    private var _life : Number;
    public function Enemy()
    {
        this.makeGraphic(32, 12, 0xffff0000);
    }
    public static function create() : BulletRunner
    {
        var enemy : Enemy = new Enemy();
        var br:BulletRunner = BulletRunner.apply(enemy);
        br.callbacks = enemy;
        return br;
    }
    public function damage(d : Number) : void
    {
        _life -= d;
        if (_life <= 0) 
        {
            _bulletRunner.destroy(1);
        }
    }
    public function onCreate(br : BulletRunner) : void
    {    
        _bulletRunner = br;
        _life = 1;
        var i : int = int(Math.random() * sequences.length);
        br.runSequence( sequences[i] );
        enemies.add(this);
    }
    public function onUpdate(br : BulletRunner) : void
    {
    }
    public function onDestroy(br : BulletRunner) : void
    {
        enemies.remove(this);
    }
    public function onNew(args : Array) : BulletRunner
    {
        return null;
    }
    public function onFire(args : Array) : BulletRunner
    {
        var b : Bullet = new Bullet(4);
        var br : BulletRunner = BulletRunner.apply(b);
        br.callbacks = b;
        return br;
    }
    private var _rotation : Number;
    public function set rotation(value : Number) : void 
    {
        _rotation = value;
    }
    public function get rotation() : Number 
    {
        return _rotation;
    }
}
class Bullet extends FlxSprite
{
    public static var bullets : FlxGroup = new FlxGroup();
    public function Bullet(radius : int)
    {
        this.makeGraphic(radius, radius, 0xffff6633);
    }
    public function onCreate(br : BulletRunner) : void
    {    
        bullets.add(this);
    }
    public function onUpdate(br : BulletRunner) : void
    {
    }
    public function onDestroy(br : BulletRunner) : void
    {    
        bullets.remove(this);
    }
    public function onNew(args : Array) : BulletRunner
    {
        return null;
    }
    public function onFire(args : Array) : BulletRunner
    {
        return null;
    }
    private var _rotation : Number;
    public function set rotation(value : Number) : void 
    {
        _rotation = value;
    }
    public function get rotation() : Number 
    {
        return _rotation;
    }
}
class Player extends FlxSprite
{
    public static var shots : FlxGroup = new FlxGroup();
    public function Player(x : int, y : int)
    {
        super(x, y);
        this.makeGraphic(8, 8, 0xffffffff);
    }
    override public function update() : void
    {
        var vx : int = 0;
        var vy : int = 0;
        var keys : Keyboard = FlxG.keys;
        var left : int = keys.LEFT ? 1 : 0;
        var right : int = keys.RIGHT ? 1 : 0
        var down : int = keys.DOWN ? 1 : 0;
        var up : int = keys.UP ? 1 : 0
        vx = 4 * right - 4 * left;
        vy = 4 * down - 4 * up;
        x += vx;
        y += vy;
        x = (x < 0) ? 0 : ((x > FlxG.width-width)? FlxG.width-width : x);
        y = (y < 0) ? 0 : ((y > FlxG.height-height)? FlxG.height-height : y);
        super.update();
        if (keys.X || keys.SPACE) 
        {
            var shot : Shot = new Shot();
            shot.x = this.x + this.width / 2 - shot.width / 2;
            shot.y = this.y;
            shots.add(shot);
        }
    }
}
class Shot extends FlxSprite
{
    public function Shot()
    {
        this.makeGraphic(2, 8, 0xffffffff);
    }
    override public function update() : void
    {
        y -= 16;
        if (y < 0) this.kill();
        super.update();
    }
}

Forked