flash on 2013-6-21
♥0 |
Line 231 |
Modified 2013-06-24 06:07:23 |
MIT License
archived:2017-03-30 22:51:39
ActionScript3 source code
/**
* Copyright mutantleg ( http://wonderfl.net/user/mutantleg )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/y99k
*/
package {
import flash.text.TextField;
import flash.events.Event;
import flash.display.Sprite;
public class FlashTest extends Sprite {
public function FlashTest() {
deb = new TextField();
deb.mouseEnabled = false;
deb.width = 256;
deb.height = 256;
addChild(deb);
var i:int;
var num:int;
vecAct = new Vector.<xActor>(128, false);
num = vecAct.length;
for (i = 0; i < num; i++)
{ vecAct[i] = new xActor(); }
vecBul = new Vector.<xActor>(128, false);
num = vecBul.length
for (i = 0; i < num; i++)
{ vecBul[i] = new xActor(); }
for (i = 0; i < 64; i++)
{
addActor(Math.random()*465, Math.random()*465, Math.random()*(vecTeam.length));
// addActor(Math.random()*465, Math.random()*465, 2);
} //nexti
stage.addEventListener(Event.ENTER_FRAME, onEnter);
}//ctor
public function reset():void
{
var i:int;
for (i = 0; i < 64; i++)
{
addActor(Math.random()*465, Math.random()*465, Math.random()*(vecTeam.length));
} //nexti
}//reset
//using some oldschool C style actor handling game tech stuff because im bored
public var vecAct:Vector.<xActor>;
public var vecBul:Vector.<xActor>;
public var vecTeam:Vector.<uint> = Vector.<uint>([0, 0xFF0000, 0xFF, 0xFF00, 0xFFFF00, 0xFF00FF, 0x808080, 0x123456]);
public var deb:TextField;
public function findTarget(m:xActor, range:Number):xActor
{
var i:int;
var num:int;
var a:xActor;
var dist:Number;
var close:Number;
var ret:xActor;
ret = null;
close = 999999999999;
range *= range;
num = vecAct.length;
for (i = 0; i < num; i++)
{
a = vecAct[i];
if (a == m) { continue; } // self
if (a.hp <= 0) { continue; } //not exist
if (a.team == m.team) { continue; } //same team
dist = ((a.cx-m.cx)*(a.cx-m.cx))+((a.cy-m.cy)*(a.cy-m.cy));
if ( dist > range) { continue; }
if ( dist > close) { continue; }
close = dist;
ret = a;
// return a;
}//nexti
return ret;
}//findtarget
public function addActor(ax:Number, ay:Number, t:int):void
{
var i:int;
var num:int;
var a:xActor;
num = vecAct.length;
for (i = 0; i < num; i++)
{
a = vecAct[i];
if (a.hp > 0) { continue; }
a.cx = ax;
a.cy = ay;
a.vx = 0;
a.vy = 0;
a.hp = 100;
a.team = t;
a.target = null;
a.mode = 0;
break;
}//nexti
}//addactor
public function fireBul(ax:Number, ay:Number, vx:Number, vy:Number, t:int):void
{
var i:int;
var num:int;
var a:xActor;
num = vecBul.length;
for (i = 0; i < num; i++)
{
a = vecBul[i];
if (a.hp > 0) { continue; }
a.cx = ax;
a.cy = ay;
a.vx = vx;
a.vy = vy;
a.rad = 2;
a.hp = 20;
a.team = t;
break;
}//nexti
}//fire
public function onEnter(e:Event):void
{
graphics.clear();
graphics.lineStyle(2, 0);
var k:int;
var numk:int;
var i:int;
var num:int;
var a:xActor;
var b:xActor;
var dx:Number;
var dy:Number;
var alive:int;
alive = 0;
num = vecAct.length;
numk = vecBul.length;
for (i = 0; i < num; i++)
{
a = vecAct[i];
if (a.hp <=0) { continue;}
alive += 1;
if (a.reload > 0) { a.reload -= 1;}
if (a.mode == 0)
{
a.vx += (Math.random()-Math.random()) *0.1;
a.vy += (Math.random()-Math.random()) *0.1;
a.wait += Math.random() * 4;
if (a.wait >= 20) { a.wait = 0; a.mode = 1; }
/*
if (Math.random() < 0.02 && a.reload <= 0)
{
a.reload = 20;
a.ang = Math.random() * 6.28;
fireBul(a.cx, a.cy, Math.cos(a.ang)*8, Math.sin(a.ang)*8, a.team);
}
*/
} else
if (a.mode == 1)
{
a.target = findTarget(a, 200); a.mode = 2;
if (a.target == null) { a.mode = 0; continue;}
}else
if (a.mode == 2)
{
if (a.target.hp <= 0) { a.target = null; a.mode = 0; continue; }
dx = a.target.cx - a.cx;;
dy = a.target.cy - a.cy;
a.ang = Math.atan2(dy, dx);
dx = dx < 0 ? -dx : dx;
dy = dy < 0 ? -dy : dy;
if (dx > 120 || dy > 120) { a.mode = 0; continue;}
if (dx > 20 && dy > 20)
{ a.vx = Math.cos(a.ang)*0.6; a.vy = Math.sin(a.ang)*0.6; }
else { a.vx *= 0.97; a.vy *=0.97;}
//if (dx < 70 && dy < 70)
if (a.reload <= 0)
{
a.reload = 20;
fireBul(a.cx, a.cy, Math.cos(a.ang)*8, Math.sin(a.ang)*8, a.team);
}//endif2
//randomly lose interest
if (Math.random() < 0.0001) { a.target = null; a.mode = 0; continue;}
}//endif2
a.vx *= 0.99;
a.vy *= 0.99;
if (a.vx < 0 && a.cx < 0) { a.cx = 0; a.vx = -a.vx; }
if (a.vx > 0 && a.cx > 465) { a.cx = 465; a.vx = -a.vx; }
if (a.vy < 0 && a.cy < 0) { a.cy = 0; a.vy = -a.vy; }
if (a.vy > 0 && a.cy > 465) { a.cy = 465; a.vy = -a.vy; }
a.cx += a.vx;
a.cy += a.vy;
for (k = 0; k < numk; k++)
{
b = vecBul[k];
if (b.hp <= 0) { continue; } //bullet not alive
if (b.team == a.team) { continue; } //same team (or own bullet)
//aabb test
if (b.cx + b.rad < a.cx-a.rad) { continue; }
if (a.cx + a.rad < b.cx-b.rad) { continue; }
if (b.cy + b.rad < a.cy-a.rad) { continue; }
if (a.cy + a.rad < b.cy-b.rad) { continue; }
a.hp -= 30;
b.hp = -1;
}//nextk
}//nexti
num = vecBul.length;
for (i = 0; i < num; i++)
{
a = vecBul[i];
if (a.hp <= 0) { continue;}
a.hp -=1;
a.cx += a.vx;
a.cy += a.vy;
}//nexti2
num = vecAct.length;
for (i = 0; i < num; i++)
{
a = vecAct[i];
if (a.hp <= 0) { continue;}
// graphics.beginFill(a.team == 1 ? 0:0xFF0000, 1);
graphics.beginFill(vecTeam[a.team], 1);
graphics.drawCircle(a.cx, a.cy, a.rad);
graphics.endFill();
if (a.target != null)
{
graphics.moveTo(a.cx, a.cy);
graphics.lineTo(a.cx+Math.cos(a.ang)*a.rad, a.cy+Math.sin(a.ang)*a.rad);
}
//debug
/*
if (a.target != null)
{
graphics.moveTo(a.cx, a.cy);
graphics.lineTo(a.target.cx, a.target.cy);
}
*/
}//nexti2
num = vecBul.length;
for (i = 0; i < num; i++)
{
a = vecBul[i];
if (a.hp <= 0) { continue;}
graphics.drawCircle(a.cx, a.cy, a.rad);
}//nexti2
if (alive <= 8) { reset(); }
}//onenter
}//classend
}
internal class xActor
{
public var cx:Number = 0;
public var cy:Number = 0;
public var vx:Number = 0;
public var vy:Number = 0;
public var rad:Number = 8;
public var ang:Number = 0;
public var target:xActor = null;
public var mode:int = 0;
public var shape:int = 0;
public var type:int = 0;
public var team:int = 0;
public var hp:Number = 0;
public var reload:int = 0;
public var wait:int = 0;
}//xactor