In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

[wonderfl本] 練習問題2、チョロQ

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

// forked from 9re's 車が動くアニメーション
package {
    import flash.display.Sprite;
    import flash.events.Event;
    
    [SWF(frameRate="60", width="800", height="800")]
    
    public class AnimationExample extends Sprite
    {
        private var _car:Car;
        private var _mator:GasMator;
        private var _ground:Ground;
        
        public function AnimationExample() 
        {
            // 地形
            _ground = new Ground();
            addChild(_ground);

            // 車のクラスのインスタンスを作る
            // 色は赤にする
            _car = new Car(0xd00000);
            addChild(_car);

            // 画面中央に配置
            _car.x = 200;
            _car.y = 350;

            // メーターの作成
            _mator = new GasMator(_car);
            _mator.y = 700;
            addChild(_mator);
        }
    }
}

import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import flash.events.Event;

class Car extends Sprite {
    // ガソリンの量最初は入っていない = 0
    private var _gas:int = 0;

    // ドラッグ関連
    private var _isDrag:Boolean = false;
    private var _maxX:Number = 0;

    // 移動or停止
    private var _stop:Boolean = false;
    
    // コンストラクタ
    // 製造時に車の色は決まる
    public function Car(_fillColor:uint) {
        // 描画
        _draw(_fillColor);

        // ドラッグ設定
        setupDrag();

        // 1フレーム毎に実行する処理にmoveCarを追加する
        addEventListener(Event.ENTER_FRAME, update);
    }

    private function setupDrag():void {
        // マウスオーバーレイ時に手のアイコンに変える
        buttonMode = true;

        // ドラッグ設定
        addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
        addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
        addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
    }

    // ドラッグ開始
    private function onMouseDown(e:MouseEvent):void {
        // 移動停止
        _stop = true;

        // 計測位置設定
        _maxX = x;

        // ドラッグ開始
        _isDrag = true;
        e.currentTarget.startDrag();
    }

    // マウス移動
    private function onMouseMove(e:MouseEvent):void {
        if (_isDrag) {
            // 計測位置更新
            if (x > _maxX)
                _maxX = x;

            // ガソリン注入
            putGas(_maxX - x);
        }
    }

    // ドラッグ終了
    private function onMouseUp(e:MouseEvent):void {
        // ガソリン注入
        putGas(_maxX - x);

        // ドラッグ解除
        _isDrag = false;
        e.currentTarget.stopDrag();

        // 移動可能に
        _stop = false;
    }

    // 更新
    private function update(e:Event):void {
        if (!_stop)
            move();
    }
    
    // 車を動かす
    private function move():void {
        // 移動
        if (_gas > 10) {        // ガスの残量が10より大きい場合
            x += 5;             // x座標を5だけ増やす
        } else {                // ガスの量が10以下の場合
            x += _gas / 2;      // 残りのガスの量によって動きが変わる
        }
        
        _gas--;                 // 車が動くとガスは減る
        if (_gas < 0) {         // もしガスの量が0より小さいなら
            _gas = 0;           // ガスの量を0にセットする
        }                       // ガスの量はマイナスにはならない

        // 端までいってしまったら死亡
        var maxX:int = stage.stageWidth - 55;
        if (x > maxX) {
          x = 200;
          y = 350;
          putGas(0);
        }
    }

    public function putGas(gas:int):void {
        _gas = Math.max(gas, 0);
    }
    
    public function get gas():int {
        return _gas;
    }
    
    // 描画メソッド。privateなので外からは見えない
    // 車の形や色は製造される時に決まってしまうので外部からは
    // 呼べない
    private function _draw(_fillColor:uint):void
    {
        // 車輪を書く
        graphics.beginFill(0x333333);
        graphics.drawCircle(10, 20, 5);
        graphics.drawCircle(45, 20, 5);
        graphics.endFill();
        // 車体を書く
        graphics.beginFill(_fillColor);
        graphics.moveTo(0, 10);
        graphics.lineTo(15, 0);
        graphics.lineTo(30, 0);
        graphics.lineTo(40, 10);
        graphics.lineTo(50, 10);
        graphics.lineTo(55, 15);
        graphics.lineTo(55, 20);
        graphics.lineTo(0, 20);
        graphics.endFill();
    }
}

class GasMator extends Sprite {
    private var _car:Car;
    private var _tf:TextField;

    public function GasMator(car:Car) {
        // 車への参照
        _car = car;
        
        // テキスト
        _tf = new TextField();
        _tf.autoSize = TextFieldAutoSize.LEFT;
        addChild(_tf);

        // 背景
        _tf.background = true;
        _tf.backgroundColor = 0x000000;
        _tf.alpha = 0.5;

        // 文字
        var f:TextFormat = new TextFormat();
        f.color = 0xffffff;
        f.size = 30;
        _tf.defaultTextFormat = f;

        // 表示するテキスト
        _tf.text = "Power";

        // プロセス
        addEventListener(Event.ENTER_FRAME, update);
    }

    private function update(e:Event):void {
        graphics.clear();
        graphics.beginFill(0xFF7637, 1);
        graphics.drawRect(_tf.width, 0, _car.gas, _tf.height);
        graphics.endFill();
    }
}

class Ground extends Sprite {
    public function Ground() {
        graphics.beginFill(0xFFDD54);
        graphics.drawRect(450, 0, 150, 700);
        graphics.endFill();
        addText(500, 350, "50", 0x000000);
        
        graphics.beginFill(0xA4FF55);
        graphics.drawRect(600, 0, 125, 700);
        graphics.endFill();
        addText(625, 350, "100", 0x000000);

        graphics.beginFill(0xFF7A52);
        graphics.drawRect(725, 0, 100, 700);
        graphics.endFill();
        addText(725, 350, "200", 0x000000);
    }

    public function addText(x:int, y:int, text:String, color:Object):void {
        var tf:TextField = new TextField();
        tf.autoSize = TextFieldAutoSize.LEFT;

        var f:TextFormat = new TextFormat();
        f.color = color;
        f.size = 50;
        tf.defaultTextFormat = f;
        
        tf.x = x;
        tf.y = y;
        tf.text = text;
        
        addChild(tf);
    }
}