forked from: 固定弾幕回避学習結果再生機

by uwi forked from 固定弾幕回避学習結果再生機 (diff: 1)
♥0 | Line 220 | Modified 2009-11-04 10:34:25 | MIT License
play

ActionScript3 source code

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

// forked from uwi's 固定弾幕回避学習結果再生機
// forked from uwi's GAで固定弾幕回避学習
package {
    import com.flashdynamix.utils.SWFProfiler;
    import flash.text.TextField;
    import flash.display.*;
    import flash.filters.*;
    import flash.geom.*;
    import flash.events.*;
    import flash.ui.*;
    import flash.utils.getTimer;
    
    public class GAReplayer extends Sprite {
        private var _bullets : Array;
        private var _ct : int;
        private var _myx : Point;
        private var _nhit : int;
        private const R_BULLET : Number = 10.0;
        private const R_ME : Number = 5.0;
        private const INFD : Number = (R_BULLET + R_ME) * (R_BULLET + R_ME);
        
        private var _tf : TextField;
        private var _space : BitmapData;
        private var _bgspace : BitmapData;
        private var _shapeself : Shape;
        
        private var _bmdbullet : BitmapData;
        
        // ここに回避パターンを書く
        private var _avptn : String = "658701555028870016338851773121884401445661188877334888333333078770011624422711263180470805521437540008774580000007766600552250044440002288806660075540000554224006666433357711388704550022130338100088000000777000000000000221111611137778333235571666555505000000000000000000666000000000000000000000000005";
        
        private const P0 : Point = new Point(0, 0);
        private const WEAKBLUR : BitmapFilter = new BlurFilter(2.0, 2.0);
        
        public function GAReplayer() {
            Wonderfl.capture_delay(5);
            SWFProfiler.init(this);
            
            // 宇宙
            _space = new BitmapData(465, 465, false, 0x000000);
            var bmpspace : Bitmap = new Bitmap(_space);
            addChild(bmpspace);
            
            var shs : Shape = new Shape();
            var mat : Matrix = new Matrix();
            mat.createGradientBox(465, 465, 0, 0, 0);
            shs.graphics.beginGradientFill(
                "linear",
                [0x333377, 0x000000],
                [1, 1],
                [0, 255],
                mat
                );
            shs.graphics.drawRect(0, 0, 465, 465);
            shs.graphics.endFill();
            _bgspace = new BitmapData(465, 465, false, 0x000000);
            _bgspace.draw(shs);
                            
            _shapeself = new Shape();
            
            // 弾描画
            var bevel : BitmapFilter = new GradientBevelFilter(4.0, 45, [0xffffff, 0x0000ff], [1.0, 1.0], [70, 255], 4.0, 4.0, 1, 2, "inner");
            var sh : Shape = new Shape();
            var g : Graphics = sh.graphics;
            g.lineStyle(1.0, 0x999999);
            g.beginFill(0xeeeeee);
            g.drawCircle(R_BULLET, R_BULLET, R_BULLET);
            g.endFill();
            _bmdbullet = new BitmapData(R_BULLET * 2, R_BULLET * 2, true, 0x00000000);
            _bmdbullet.draw(sh);
            _bmdbullet.applyFilter(_bmdbullet, _bmdbullet.rect, P0, bevel);
            _bmdbullet.applyFilter(_bmdbullet, _bmdbullet.rect, P0, WEAKBLUR);
            
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
            stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
            
            // デバッグ用
            _tf = new TextField();
            _tf.autoSize = "left";
//            _tf.text = "" + _bmd.width + "\t" + _bmd.height;
            _tf.textColor = 0xffffff;
            _tf.borderColor = 0xffffff;
            _tf.border = true;
            addChild(_tf);
            
            init();
        }
        
        private var _kf : uint = 0;
        private var _state : int;
        
        private function onKeyDown(e : KeyboardEvent) : void
        {
            if(e.keyCode == Keyboard.SPACE && _state == 1){
                init();
                addEventListener(Event.ENTER_FRAME, onEnterFrame);
            }
            
            if(e.keyCode == Keyboard.DOWN){
                _kf |= 1;
            }else if(e.keyCode == Keyboard.UP){
                _kf |= 2;
            }else if(e.keyCode == Keyboard.RIGHT){
                _kf |= 4;
            }else if(e.keyCode == Keyboard.LEFT){
                _kf |= 8;
            }
        }
        
        private function onKeyUp(e : KeyboardEvent) : void
        {
            if(e.keyCode == Keyboard.DOWN){
                _kf ^= 1;
            }else if(e.keyCode == Keyboard.UP){
                _kf ^= 2;
            }else if(e.keyCode == Keyboard.RIGHT){
                _kf ^= 4;
            }else if(e.keyCode == Keyboard.LEFT){
                _kf ^= 8;
            }
        }
        
        private function init() : void
        {
            _myx = new Point(465 / 2, 465 / 2);
            _bullets = [];
            _ct = 0;
            _nhit = 0;
            
            _state = 0;
        }
        
        private function onEnterFrame(e : Event) : void
        {
            draw();
            judge();
            
            _ct++;
            if(_ct % 7 == 0){
                addBullet(0, 0, 5);
                addBullet(200, 0, 5);
                addBullet(465, 0, 5);
            }
            
            moveMe();
            moveBullets();
            
            _tf.text = 
                "time : " + _ct + 
                "\nhit : " + _nhit + 
                "\nbullets : " + _bullets.length + 
                "\n_kf : " + _kf;
        }
        
        // LRUD
        private var mv : Array = [
            null, [0, 6], [0, -6], null,
            [6, 0], [4, 4], [4, -4], null,
            [-6, 0], [-4, 4], [-4, -4], null,
            null, null, null, null];
            
        private const ST : Array = [
            [0, 0],
            [6, 0], [4, -4], [0, -6], [-4, -4],
            [-6, 0], [-4, 4], [0, 6], [4, 4]
            ];
        
        private function moveMe() : void
        {
            var step : int = (_ct - 1) / 3;
            if(step >= _avptn.length){
                _state = 1;
                removeEventListener(Event.ENTER_FRAME, onEnterFrame);
                return;
            }
            _myx.x += ST[int(_avptn.charAt(step))][0];
            _myx.y += ST[int(_avptn.charAt(step))][1];
            
            /*
            // 自機
            if(mv[_kf]){
                _myx.x += mv[_kf][0];
                _myx.y += mv[_kf][1];
            }
            */
        }
        
        private function moveBullets() : void
        {
            // 弾
            for each(var b : Bullet in _bullets){
                b.xx += b.vx;
                b.xy += b.vy;
            }
        }
        
        // 弾削除
        private function removeBullet(i : int) : void
        {
            if(i < _bullets.length - 1){
                _bullets[i] = _bullets.pop();
            }else{
                _bullets.pop();
            }
        }
        
        // 当たり判定
        private function judge() : void
        {
            for(var i : int = _bullets.length - 1;i >= 0;i--){
                var b : Bullet = _bullets[i];
                if(
                    (b.xx - _myx.x) * (b.xx - _myx.x) + 
                    (b.xy - _myx.y) * (b.xy - _myx.y)
                    < INFD){
                        _nhit++;
                        removeBullet(i);
                        continue;
                }
                if(b.xx < 0 || b.xx > 465.0 || b.xy < 0 || b.xy > 465.0){
                    removeBullet(i);
                }
            }
            if(_myx.x < 0 || _myx.x > 465.0 || _myx.y < 0 || _myx.y > 465.0){
                _nhit+=10;
                _myx.x = 465 / 2;
                _myx.y = 465 / 2;
            }
        }
        
        // 描画
        private function draw() : void
        {
            _space.lock();
            _space.fillRect(_space.rect, 0x000000);
//            _space.copyPixels(_bgspace, _bgspace.rect, P0);
            
            var g : Graphics = _shapeself.graphics;
            g.clear();
            
            // self
            g.lineStyle(1.0, 0x333399);
            g.beginFill(0x3333ff);
            g.drawCircle(_myx.x, _myx.y, 5);
            g.endFill();
            _space.draw(_shapeself, null, null, BlendMode.ADD);
            
            // bullets
            for each(var b : Bullet in _bullets){
                _space.copyPixels(_bmdbullet, _bmdbullet.rect,
                    new Point(b.xx - R_BULLET, b.xy - R_BULLET));
            }
            
            _space.unlock();
        }
        
        // 弾追加
        private function addBullet(x : Number, y : Number, v : Number) : void
        {
            var r : Number = Math.sqrt((_myx.x - x) * (_myx.x - x) + (_myx.y - y) * (_myx.y - y));

            var b : Bullet = new Bullet();
            b.xx = x;
            b.xy = y;
            b.vx = v * (_myx.x - x) / r;
            b.vy = v * (_myx.y - y) / r;
            b.r = R_BULLET;
            _bullets.push(b);
        }        
    }
}

class Bullet
{
    public var xx : Number;
    public var xy : Number;
    public var vx : Number;
    public var vy : Number;
    public var r : Number;
}