DLab'z Tank
forked from Wonderfl Tank Game Tank Sample 1 (diff: 215)
ã“ã®コードを新ç€タンク一覧http://flash-games.wonderfl.net/tank/list/new ã«表示ã•ã›るã«ã¯infinite-tank-entry ã¨ã„ã†タグをã¤ã‘ã¦ãÂÂã ã•ã„
♥0 |
Line 157 |
Modified 2009-12-10 02:51:23 |
MIT License
archived:2017-03-10 06:39:32
| (replaced)
ActionScript3 source code
/**
* Copyright DLabz ( http://wonderfl.net/user/DLabz )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/qc7f
*/
// ã“ã®コードを新ç€タンク一覧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);
private var angle:Number;
private var direction:Number;
private var enemyPos:WVector2D;
private var enemyDistance:Number;
private var enemySpeed:WVector2D;
private var loosCannon:Number;
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/tank/tankA_1.png", "http://assets.wonderfl.net/images/tank/tankA_2.png", "http://assets.wonderfl.net/images/tank/tankA_cannon.png"], _arr, onImageLoaded);
_ctfm = new ColorTransform(1, 1, 1, 0);
super();
}
// ※タンクã®動ãÂÂã®メイン関数
// 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
{
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//タンクã®動ãÂÂã¯Commandクラスã«よりæ“Â作ã—ã¾ã™。以下Commandクラスã®コマンド///////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// Command.FIRE 弾を撃ã¤
// Command.GUN_TURN_RIGHT ç ²å°をå³旋回
// Command.GUN_TURN_LEFT ç ²å°を左旋回
// Command.TANK_MOVE_FORWARD å‰Â進
// Command.TANK_MOVE_BACKWARD 後進
// TANK_TURN_LEFT 左ã«旋回
// TANK_TURN_RIGHT å³ã«旋回
// command.addCommand(Command.コマンド);//実行ã™る動ãÂÂã«追åŠÂ
// return command.action; ã“ã®関数ã®最後ã§実行ã™る
// @see http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/development/Command.html
var command:Command = new Command;
// å‰Â回ãŸ弾を撃ã£ã¦ã„る場åˆã¯ã€Âæ’ƒãŸãªã„よã†ã«フラグをセット
//Locate enemy on map
//not sure what dis is, but porbably does same thng as my conditions
//angle = WMath.modulo2PI(angle);
//direction = WMath.modulo2PI(direction);
//Based on how far and fast is the enemy, Decide how loosy soud aiming be
eye();
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//Send commands//////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//Turn the gun thowards enemy
if ((angle > 0.05 )&&(angle < Math.PI)) {
command.addCommand(Command.GUN_TURN_RIGHT);
}else if((angle < -0.05 )&&(angle > -Math.PI)) {
command.addCommand(Command.GUN_TURN_LEFT);
}
eye();
if (enemyDistance > 100){
loosCannon = Math.abs( 5/enemyDistance) ;
}else{
loosCannon = 0.1;
}
//if condition is met, FIRE, else MOVE
if (_gunFlag && (angle < loosCannon) && (angle > - loosCannon)) {
command.addCommand(Command.FIRE);
}else{
//Some randomness
var ev:Number = Math.random();
//turn tank
if (direction >= .2) {
command.addCommand(Command.TANK_TURN_RIGHT);
}else if (direction <= -.2) {
command.addCommand(Command.TANK_TURN_LEFT);
}
//will moving forward be efective?
var allow:Number = Math.PI / 4;
//if enemy is more than 100 away, and tank is turned right way, move forward
if ((enemyDistance > 80) && ((direction < allow) && (direction > - allow)))
command.addCommand(Command.TANK_MOVE_FORWARD);
else {
//else randome evade
if ( ev< 0.2){
command.addCommand(Command.TANK_TURN_LEFT);
}else if (ev > 0.8){
command.addCommand(Command.TANK_TURN_RIGHT);
}
if (Math.random() < 0.8){
command.addCommand(Command.TANK_MOVE_BACKWARD);
}
}
}
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//AIã“ã“ã¾ã§//////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// command.actionãŒフラグã¨ãªã£ã¦ã„る
return command.action;
}
//Stay on top!
private function eye():void {
enemyPos = _scene.enemyTankPosition;
//Calculate relative position
enemyPos.subtract(_scene.myTankPosition);
//get enemy speed and direction
enemyDistance = enemyPos.length;
enemySpeed = _scene.enemyTankLinearVelocity;
//Anticipate position
//enemySpeed.scale(0.8);
if(enemySpeed.length > 100){
enemyPos.add(enemySpeed);
}
//Find angle at wich is enemy
angle = Math.atan2(enemyPos.y, enemyPos.x);
//Find how much should tank be turned,but don't go straight to enemy
direction = angle + (Math.random()-0.5)/4;
//substract current rotation of gun
angle -= (_scene.myTankAngle + _scene.myGunAngle);
//substract current rotation of gun
direction -= _scene.myTankAngle;
//fix rotation direction
while (angle > 2*Math.PI) {
angle -= 4 * Math.PI;
}
while (angle < - 2*Math.PI) {
angle += 4 * Math.PI;
}
while (direction > 2* Math.PI) {
direction -= 4 * Math.PI;
}
while (direction < - 2*Math.PI) {
direction += 4 * Math.PI;
}
}
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//追加æ¼â€Ã¥â€¡Âº//////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// ※被弾時ã«æ¼â€Ã¥â€¡ÂºÃ£â€šâ€™Ã¥â€¦Â¥Ã£â€šÅ’ãŸã„時ã«編集ã—ã¦ãÂÂã ã•ã„。
// called when a bullet hits this tank
override public function hit():void {
// 被弾ã—ãŸã¨ãÂÂã«呼ã°れるcallbackã§ãÂâ„¢.
}
// ※発射時ã«æ¼â€Ã¥â€¡ÂºÃ£â€šâ€™Ã¥â€¦Â¥Ã£â€šÅ’ãŸã„時ã«編集ã—ã¦ãÂÂã ã•ã„。
// called when this tank fires
override public function fire():void
{
// å¼¾ãŒ発射ã•れる時ã«呼ã°れるcallbackã§ãÂâ„¢.
}
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//以下修æ£ä¸Âè¦Â//////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// ※çâ€Â»Ã¥Æ’ÂèªÂã¿込ã¿çâ€Â¨Ã©â€“¢æ•°
// 通常編集ã™る必è¦Âã¯ã‚りã¾ã›ん
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);
}
// ※タンクã®å‘ãÂÂã‚’æÂÂçâ€Â»Ã£Â—ã¦ã„る関数。修æ£ã®必è¦Âã¯ã‚りã¾ã›ん。
// 毎フレームãÂâ€Ã£Â¨ã«呼ã°れるæÂÂçâ€Â»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);
}
// ※弾フラグ
private function clearGunFlag():void
{
_gunFlag = true;
}
}
}