Rainbow Tank
forked from Wonderfl Tank Game Tank Sample 1 (diff: 137)
このコードを新着タンク一覧http://flash-games.wonderfl.net/tank/list/new に表示させるにはinfinite-tank-entry というタグをつけてください
♥0 |
Line 132 |
Modified 2009-10-22 16:18:51 |
MIT License
archived:2017-03-09 13:00:58
| (replaced)
ActionScript3 source code
/**
* Copyright heriet ( http://wonderfl.net/user/heriet )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/8EWl
*/
// forked from 9re's Wonderfl Tank Game Tank Sample 1
// このコードを新着タンク一覧http://flash-games.wonderfl.net/tank/list/new
// に表示させるにはinfinite-tank-entry
// というタグをつけてください
package
{
import flash.display.Bitmap;
import flash.display.BlendMode;
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.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 _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()
{
// 弾のクラスの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(0.75, 0.5, 0.5, 0.75, 32);
}
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);
}
private static const A:Number = 1664525;
private static const C:Number = 1013904223;
private static const M:Number = 0x100000000;
private var r:Number = 1.0;
private function random():uint {
r = (r * A + C) % M;
return r;
}
private var _commandedCount:int = 0;
private var _is1P:Boolean = true;
private var _prevEnemyX:Number;
private var _prevEnemyY:Number;
// Commandクラスのフラグを立てることによって、タンクの行動を設定できます
// http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/model/Command.html
override public function action():int
{
var enemyPos:WVector2D = _scene.enemyTankPosition;
var myPos:WVector2D = _scene.myTankPosition;
if (_commandedCount == 0) {
if (myPos.y < 300)
_is1P = false;
}
_commandedCount++;
var action:int;
if(_is1P)
action = Command.TANK_TURN_RIGHT;
else if(random() % 1000 > 100)
action = Command.TANK_TURN_RIGHT;
// たまに止まる(移動予測弾対策?)
if (random() % 1000 > 100)
action |= Command.TANK_MOVE_BACKWARD;
// 最初はどうせ当らない
if (_commandedCount > 6)
action |= Command.FIRE;
enemyPos.subtract(myPos);
var angle:Number = Math.atan2(enemyPos.y, enemyPos.x);
angle -= (_scene.myGunAngle + _scene.myTankAngle);
// 固定砲台以外にランダム射撃
var movedLen:Number = Math.pow(_prevEnemyX - enemyPos.x,2) + Math.pow(_prevEnemyY - enemyPos.y,2);
if (Math.abs(angle) < Math.PI / 4 && movedLen > 256 && (_scene.enemyTankLinearVelocity.x != 0 || _scene.enemyTankLinearVelocity.y != 0))
angle += (2.0 * Math.PI * (random() / M) - Math.PI) / 8;
angle = angle - 2.0 * Math.PI * Math.floor( 0.5 + angle / ( 2.0 * Math.PI ));
if (angle > 0) action |= Command.GUN_TURN_RIGHT;
else if (angle < 0) action |= Command.GUN_TURN_LEFT;
_prevEnemyX = enemyPos.x;
_prevEnemyY = enemyPos.y;
return action;
}
private var frameCount:int = 0;
override public function draw(bitmapData:BitmapData):void
{
frameCount++;
// _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.identity();
// タンクの傾きをセット
_mat.rotate(_scene.myTankAngle);
// タンクの位置に平行移動. タンクのグラフィックは中心座標となっています.
_mat.translate(_scene.myTankPosition.x, _scene.myTankPosition.y);
bitmapData.draw(_spTank, _mat, null, null, null, true);
var colorTransForm:ColorTransform = new ColorTransform((Math.sin(frameCount * Math.PI / 100) + 1.0) / 2, (Math.cos(frameCount * Math.PI / 200) + 1.0) / 2, (Math.sin(frameCount * Math.PI / 300) + 1.0) / 2);
bitmapData.colorTransform(bitmapData.rect, colorTransForm);
}
// called when a bullet hits this tank
override public function hit():void {
// 弾が当たったときに呼ばれます
// エフェクトをつけてみてください
}
}
}