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

red tank

このコードを新着タンク一覧http://flash-games.wonderfl.net/tank/list/new
に表示させるにはinfinite-tank-entry
というタグをつけてください
/**
 * Copyright bentomorio ( http://wonderfl.net/user/bentomorio )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/p3Ga
 */

// このコードを新着タンク一覧http://flash-games.wonderfl.net/tank/list/new
// に表示させるにはinfinite-tank-entry
// というタグをつけてください
package 
{
 import flash.display.Bitmap;
 import flash.display.Loader;
 import flash.display.Sprite;
 import flash.display.BitmapData;
 import flash.geom.ColorTransform;
 import flash.geom.Matrix;
 import flash.utils.setTimeout;
 import flash.utils.Timer;
 
 import net.wonderfl.game.infinity_tank.development.*;
 import net.wonderfl.math.*;
 import net.wonderfl.utils.SequentialLoader;
 /**
  * @author 9re
  */
 // クラス名は必ずTankにして、TankBaseクラスを拡張して下さい
 // http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/tank/TankBase.html
 public class Tank extends TankBase
 {
  private var _gunFlag:Boolean = true;
  private var _lastBulletCount:int = 0;
  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 _mat:Matrix = new Matrix(1, 0, 0, 1, 5, 15);
  
  public function Tank() 
  {
           // 弾のクラスのurlをセットしてください
   // 弾のドキュメントクラスはBulletRendererBaseクラスを拡張したBulletRendererクラスである必要があります
   // 弾の一覧は、http://flash-games.wonderfl.net/tank/list/bullets
   // にあります.
   // http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/development/BulletRendererBase.html
   _bulletRenderer = "http://swf.wonderfl.net/swf/usercode/0/04/046c/046cee45b4334c4f2dac8dfa7ec9ea2b2b2eb27d.swf";
   
   _spTank = new Sprite;
   _spBattery = new Sprite;
   
   SequentialLoader.loadImages(["http://assets.wonderfl.net/images/related_images/6/65/6505/650528c2d07e515b9830b5fc0b0d4af045b5af83","http://assets.wonderfl.net/images/related_images/0/0e/0e4e/0e4e629d59f6fe11e4f3b038ee5e60a5f79093dc","http://assets.wonderfl.net/images/related_images/8/8c/8c47/8c47c76389b5f0672cfe73133314f54db798d250"], _arr, onImageLoaded);
   
   _ctfm = new ColorTransform(1, 1, 1, 0);
   
   
   
   super();
  }

  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);
    bm.x = -bm.width / 2;
    bm.y = -bm.height / 2;
    
    return bm;
   }));
   
   _gun = _images.pop();
   _gun.x = -5;
   
   _gun.y = -5;
   _spBattery.addChild(_gun);
   _i = 0;
   _images.forEach(function ($bm:Bitmap, $index:int, $vec:Vector.<Bitmap>):void {
    _spTank.addChild($bm);
   });
   _spTank.addChild(_spBattery);
  }
  
  // 5フレームに1度呼ばれるcallback
  // 現在のゲームの状態を見るには、_sceneオブジェクトのプロパティーを
  // 調べます.
  // @see http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/development/BattleScene.html
  override public function action():int
  {
   // 前回のactionで弾が撃たれたかどうかを調べる.
   // 人対AIのゲーム・バランスのために弾は同画面内に最大3発までしか
   // 撃てない.
   if (_lastBulletCount < _scene.myBulletCount) {
    // 前回た弾を撃っている場合は、撃たないようにフラグをセット
    _gunFlag = false;
    // 400ms後にフラグを解除
    setTimeout(clearGunFlag, 400);
   }
   // 現在の画面内にある弾の数を保存する.
   _lastBulletCount = _scene.myBulletCount;
   
   // フラグによって、撃つか撃たないかを判断
   var action:int = (_gunFlag) ? Command.FIRE : Command.DO_NOTHING;
   
   // 敵の位置を取得.
   var enemyPos:WVector2D = _scene.enemyTankPosition;
   // 自分の位置を敵の位置から引く.
   // 自分から見た敵の位置を計算
   enemyPos.subtract(_scene.myTankPosition);
   
   // 自分からみた敵の方向を計算する.
   var angle:Number = Math.atan2(enemyPos.y, enemyPos.x);
   // 敵の方向をコピー
   var direction:Number = angle;
   
   // 敵の方向と自分の砲台の向いている方向の差を計算
   angle -= (_scene.myTankAngle + _scene.myGunAngle);
   // 敵の方向と自分のタンクの向いている方向の差を計算
   direction -= _scene.myTankAngle;
   
   // 角度を0~2πに丸める
   angle = WMath.modulo2PI(angle);
   direction = WMath.modulo2PI(direction);
   
   // 角度が0~πの場合は敵は砲台より右側にいる.
   if (angle <= Math.PI) action |= Command.GUN_TURN_RIGHT;
   // 角度がπより大きい場合は敵は砲台の左側にいる.
   else action |= Command.GUN_TURN_LEFT;
   
   // 角度が0~πの場合は敵は自分の向いている方向の右側にいる.
   if (direction <= Math.PI) action |= Command.TANK_TURN_RIGHT;
   // 角度がπより大きい場合は敵は自分の向いている方向の左側にいる.
   else action |= Command.TANK_TURN_LEFT;
   
   // 許容する角度を-π/4~π/4にセットし、
   var allow:Number = Math.PI / 4;
   // 敵が許容角度の範囲内に居るなら敵に前進する.
   // (敵の方向に向かって前進)
   if ((direction < allow) || (direction > WMath.DOUBLE_PI - allow))
    action |= Command.TANK_MOVE_FORWARD;
   
   return action;
  }
  
  private function clearGunFlag():void
  {
   _gunFlag = true;
  }
  
  // 毎フレームごとに呼ばれる描画callback
  // stageと同じ大きさのBitmapDataが渡されます.
  // 現在のゲームの状態を見るには、_sceneオブジェクトのプロパティーを
  // 調べます.
  // @see http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/development/BattleScene.html
  override public function draw(bitmapData:BitmapData):void
  {
   // 砲台の向きをセットします.
   // 砲台はタンクのSpriteの子供のスプライトです.
   _spBattery.rotation = _scene.myGunAngle * 180 / Math.PI;
   
   
   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;
   }
   
   // 単位行列にセット
   _mat.identity();
   // タンクの傾きをセット
   _mat.rotate(_scene.myTankAngle);
   // タンクの位置に平行移動. タンクのグラフィックは中心座標となっています.
   _mat.translate(_scene.myTankPosition.x, _scene.myTankPosition.y);
   
   // 一度BitmapDataをクリア
   bitmapData.colorTransform(bitmapData.rect, _ctfm);
   // BitmapDataを描画
   bitmapData.draw(_spTank, _mat, null, null, null, true);
  }
  
  // called when a bullet hits this tank
  override public function hit():void {
   // 被弾したときに呼ばれるcallbackです.
  }
  
  // called when this tank fires
  override public function fire():void 
  {
   // 弾が発射される時に呼ばれるcallbackです.
  }
 }
}