固定砲台

by muta244 forked from Wonderfl Tank Game Tank Sample 1 (diff: 314)
♥0 | Line 106 | Modified 2009-10-10 01:12:21 | MIT License | (replaced)
play

ActionScript3 source code

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

package {

import Box2D.Common.Math.b2Vec2;

import flash.display.Bitmap;
import flash.display.Loader;
import flash.display.Sprite;
import flash.display.BitmapData;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.TimerEvent;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.net.URLRequest;
import flash.system.Security;
import flash.utils.setTimeout;
import flash.utils.Timer;

import net.wonderfl.game.infinity_tank.core.UserActionHandler;
import net.wonderfl.game.infinity_tank.model.*;
import net.wonderfl.game.infinity_tank.tank.TankBase;
import net.wonderfl.utils.SequentialLoader;

public class Tank extends TankBase
{
    private var _spTank:Sprite;
    private var _spBattery:Sprite;
    private var _ctfm:ColorTransform;
    private var _images:Vector.<Bitmap>;
    private var _gun:Bitmap;
    private var _arr:Array = [];
    private var _i:int = -1;
    private var _j:int = 0;
    private var _arrCommands:Array = [Command.FIRE, Command.GUN_TURN_LEFT, Command.GUN_TURN_RIGHT, Command.TANK_MOVE_BACKWARD, Command.TANK_MOVE_FORWARD, Command.TANK_TURN_LEFT, Command.TANK_TURN_RIGHT];
    private var _mat:Matrix = new Matrix(1, 0, 0, 1, 5, 15);

    public function Tank():void
    {
        // 弾のクラスのurlをセットしてください
        // 弾のドキュメントクラスはBulletRendererBaseクラスを拡張したBulletRendererクラスである必要があります
        // http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/bullet/BulletRendererBase.html
        _bulletRenderer = "http://swf.wonderfl.net/swf/usercode/8/8f/8faa/8faa6f4c1148ad9a535d25bdd49b7e4d98d02030.swf";

        _spTank = new Sprite;
        _spBattery = new Sprite;

        SequentialLoader.loadImages([
            "http://assets.wonderfl.net/images/tank/tankA_1.png",
            "http://assets.wonderfl.net/images/tank/tankA_2.png",
            "http://assets.wonderfl.net/images/tank/tankB_cannon.png"
        ], _arr, _onImageLoaded);

        _ctfm = new ColorTransform(1, 1, 1, 0);
    }

    // Commandクラスのフラグを立てることによって、タンクの行動を設定できます
    // http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/model/Command.html
    override public function action():int
    {
        var action:int = Command.FIRE;

        // My Tank Position
        var mtp:b2Vec2 = _scene.myTankPosition;
        // Enemy Tank Position
        var etp:b2Vec2 = _scene.enemyTankPosition;
        // Subtract Tank Position
        var stp:b2Vec2 = etp.Copy();
        stp.Subtract(mtp);

        var m2e:Number = Math.atan2(stp.y, stp.x);
        var e2m:Number = (m2e - Math.PI) % (Math.PI * 2);

        // My Tank Angle
        var mta:Number = _scene.myTankAngle;
        // My Gun Angle
        var mga:Number = _scene.myGunAngle + mta;

        // Target Tank Angle
        var tta:Number = mta;
        // Target Gun Angle
        var tga:Number = mga;

        action |= (m2e < mta)
                ? Command.TANK_TURN_LEFT : Command.TANK_TURN_RIGHT;

        action |= (m2e < mga)
                ? Command.GUN_TURN_LEFT : Command.GUN_TURN_RIGHT;

        return action;
    }

    override public function draw(bitmapData:BitmapData):void
    {
        // _sceneオブジェクトは現在のステージの状況を保持しています
        // _sceneオブジェクトはBattleSceneクラスのインスタンスです。詳しくは、
        // http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/model/BattleScene.html
        // 主砲の角度を計算します。
        // この角度は相対的で戦車の本体から見た角度です。
        _spBattery.rotation = _scene.myGunAngle * 180 / Math.PI;

        // ここでは2枚のPNGをGIFアニメのように切り替えています
        if (_i > -1) {
            _i = (_j & 1) ? 1 : 0;
            var bm:Bitmap = _images[_i];
            bm.visible = true;
            _i = 1 - _i;
            bm = _images[_i];
            bm.visible = false;
            _j++;
            _j &= 3;
        }
        // 前回の状態を一旦消す
        bitmapData.colorTransform(bitmapData.rect, _ctfm);
        // _mat = new Matrix(1, 0, 0, 1, 5, 15)なのですが、
        // これは戦車のBitmapDataを戦車のヒットエリアよりやや大きめにしているからです
        // ビットマップのサイズは60 x 60で戦車のヒットエリアは
        // 50 x 30です。右向きを正面とするのがデフォルトの状態です
        // なので、
        // (60 - 50) / 2 = 5
        // (60 - 30) / 2 = 15
        // つまり、戦車本体はビットマップの左上隅の点から少しずれて
        // 左から5ピクセル、上から15ピクセルのところにあります
        bitmapData.draw(_spTank, _mat, null, null, null, true);
    }

    // called when a bullet hits this tank
    override public function hit():void
    {
        // 弾が当たったときに呼ばれます
        // エフェクトをつけてみてください
    }

    private function _onImageLoaded():void
    {
        _images = Vector.<Bitmap>(_arr.map(function ($ldr:Loader, $index:int, $arr:Array):Bitmap {
            var mat:Matrix = new Matrix;
            var bd:BitmapData = new BitmapData($ldr.width, $ldr.height, true, 0x00ffffff);
            bd.draw($ldr, mat);
            var bm:Bitmap = new Bitmap(bd);

            return bm;
        }));

        _gun = _images.pop();
        _gun.x = -5;

        _gun.y = -5;
        _spBattery.addChild(_gun);
        _spBattery.x = 20;
        _spBattery.y = 15;
        _i = 0;
        _images.forEach(function ($bm:Bitmap, $index:int, $vec:Vector.<Bitmap>):void {
            _spTank.addChild($bm);
        });
        _spTank.addChild(_spBattery);
    }
}

}