砲台と弾丸

by zier
砲台と弾丸 2010/08/22 Zier
速度とかメモリとか全く考慮せず、思うがままに即興で作ったコードです。
つい勢いでやってしまった。後悔は(ry
♥0 | Line 148 | Modified 2010-08-22 17:53:33 | MIT License
play

ActionScript3 source code

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

/* 
砲台と弾丸 2010/08/22 Zier
速度とかメモリとか全く考慮せず、思うがままに即興で作ったコードです。
つい勢いでやってしまった。後悔は(ry
 */
package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    
    [SWF(width=465, height=465, framerate=60)]
    public class Main extends Sprite 
    {
        private static const SCREEN_WIDTH: int = 465
        private static const SCREEN_HEIGHT: int = 465
        
        private var turret: Turret = null
        private var me: MouseEvent = null
        private var trigger: Boolean = false
        
        private var bullets: Array = []
        
        public function Main():void 
        {
            graphics.beginFill(0x0)
            graphics.drawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)
            graphics.endFill()
            
            turret = new Turret(SCREEN_WIDTH / 2, SCREEN_HEIGHT)
            turret.addEventListener(Turret.ADD_BULLET, onAddBullet)
            addChild(turret)
            
            addEventListener(Event.ENTER_FRAME, onEnterFrame)
            stage.addEventListener(MouseEvent.MOUSE_DOWN, function(): void { trigger = true } )
            stage.addEventListener(MouseEvent.MOUSE_UP, function(): void { trigger = false } )
        }
        
        private var nextAddBullet: Bullet = null;
        private function onAddBullet(e: BulletEvent): void {
            nextAddBullet = new Bullet(turret.x + e.pos, turret.y, mouseX, mouseY)
        }

        private var frameProcessing: Boolean = false
        
        private function onEnterFrame(e: Event): void {
            if (frameProcessing) return
            frameProcessing = true
            
            if (null != nextAddBullet) {
                bullets.push(nextAddBullet)
                addChild(nextAddBullet)
                nextAddBullet = null
            }
            
            turret.frameAction(trigger)
            var i: int
            for (i = 0; i < bullets.length; i++) {
                var bullet: Bullet = bullets[i]
                
                if (null != bullet) {
                    if (bullet.frameAction()) {
                        removeChild(bullet)
                        bullets[i] = null
                    }
                }
            }
            
            i = bullets.length
            while (0 < i--) {
                if (null == bullets[i]) bullets.splice(i, 1)
            }
            frameProcessing = false
        }
    }
}

import flash.events.Event
import flash.display.Sprite
import flash.geom.Point

class BulletEvent extends Event {
    
    private var _pos: int = 0
    public function get pos(): int { return _pos }
    
    public function BulletEvent(type:String, pos: int, bubbles:Boolean = false, cancelable:Boolean = false) {
        super(type, bubbles, cancelable);
        _pos = pos;
    }
}

// 弾丸
class Bullet extends Sprite {
    private var t: Point
    private var d: Point
    
    private static const BULLET_SIZE: int = 3
    public function Bullet(_x: int, _y: int, _tx: int, _ty: int): void {
        graphics.beginFill(0xFFFFFF)
        graphics.drawEllipse(-BULLET_SIZE/2, -BULLET_SIZE/2, BULLET_SIZE, BULLET_SIZE)
        graphics.endFill()
        
        x = _x
        y = _y
        t = new Point(_tx, _ty)
        d = t.subtract(new Point(x, y))
        d.normalize(10)
        frameAction()
    }
    
    public function frameAction(): Boolean {
        x += d.x
        y += d.y
        
        var cx: Boolean = (0 <= d.x) ? t.x <= x : x <= t.x;
        var cy: Boolean = (0 <= d.y) ? t.y <= y : y <= t.y;
        
        return (cx && cy)
    }
}

// 砲身
class Barrel extends Sprite {
    
    private static const BARREL_LENGTH: int = 20
    
    private var _pos: int = 0
    private var _loading: int = 0
    public function get pos(): int { return _pos }
    public function loading(): Boolean { return 0 < _loading }

    public function Barrel(pos: int = 0) { _pos = pos }
    
    public function frameAction(): void {
        if (0 < _loading) _loading -= 2
        
        var d: Point = new Point(mouseX, mouseY)
        d.normalize(BARREL_LENGTH - _loading)
        
        graphics.clear()
        graphics.lineStyle(2, 0xc0c0c0)
        graphics.moveTo(_pos, 0)
        graphics.lineTo(d.x + _pos, d.y)
    }
    
    public function shot(): void {
        _loading = 8
    }
}

// 砲塔
class Turret extends Sprite {
    public static const ADD_BULLET: String = "addBullet"
    
    private static const SIZE: int = 25
    
    private var barrels: Array = []
    private var actionIndex: int = 0
    private var _loading: int = 0

    public function Turret(_x: int, _y: int): void {
        x = _x
        y = _y
        
        barrels.push(new Barrel(-3))
        barrels.push(new Barrel(0))
        barrels.push(new Barrel(+3))
        for each (var barrel: Barrel in barrels) addChild(barrel)
        
        var armor: Sprite = new Sprite()
        with (addChild(armor)) {
            graphics.beginFill(0xe0e0e0)
            graphics.drawEllipse(-SIZE/2, -SIZE/2, SIZE, SIZE)
            graphics.endFill()
        }
    }
    
    public function loading(): Boolean { return 0 < _loading }
    
    public function shot(): void {
        if (loading()) return
        
        actionIndex = (actionIndex + 1) % barrels.length
        var barrel: Barrel = barrels[actionIndex]
        if (barrel.loading()) return
        barrel.shot()
        _loading = 3;
        
        dispatchEvent(new BulletEvent(ADD_BULLET, barrel.pos))
    }
    
    public function frameAction(trigger: Boolean): void {
        if (0 < _loading) _loading -= 1
        
        if (trigger) shot()
        for each (var barrel: Barrel in barrels) barrel.frameAction()
    }
}