/**
* Copyright mutantleg ( http://wonderfl.net/user/mutantleg )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/mhKZ
*/
package {
import flash.text.TextField;
import flash.display.StageQuality;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.display.Sprite;
public class FlashTest extends Sprite {
public function FlashTest() {
stage.quality = StageQuality.MEDIUM;
vecLine = new Vector.<xLine>(0, false);
deb = new TextField();
deb.width=320; deb.height=240;
deb.mouseEnabled=false;
addChild(deb);
var a:xLine;
var x0:Number; var y0:Number;
var i:int;
x0 = 0; y0 = 430;
for (i=0;i<32;i+=1)
{
a = new xLine(); vecLine.push(a);
a.x0 = x0; a.y0 = y0;
x0 += 16; if (i==13){x0+=128;}
a.x1 = x0; a.y1 = y0;
a = new xLine(); vecLine.push(a);
a.x0 = x0; a.y0 = y0;
y0 -= 8+Math.random()*16;
a.x1 = x0; a.y1 = y0;
}//nexti
a = new xLine(); vecLine.push(a);
a.x0 = 0; a.y0 = 120;
a.x1 = 500; a.y1 = 120;
a = new xLine(); vecLine.push(a);
a.x0 = 30; a.y0 = 0;
a.x1 = 30; a.y1 = 520;
a = new xLine(); vecLine.push(a);
a.x0 = 30; a.y0 = 0;
a.x1 = 300; a.y1 = 120;
cx= 230; cy = 100;
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMdown);
stage.addEventListener(MouseEvent.MOUSE_UP, onMup);
stage.addEventListener(Event.ENTER_FRAME, onEnter);
}//ctor
public var deb:TextField;
public function onMdown(e:MouseEvent):void { mbutton=1;}
public function onMup(e:MouseEvent):void {mbutton=0;}
public var mbutton:int = 0;
public var vecLine:Vector.<xLine>;
public var cx:Number =230;
public var cy:Number =230;
public var vx:Number =0;
public var vy:Number =0;
public var ang:Number =0;
public var vang:Number=0;
public var camx:Number = 0;
public var camy:Number = 0;
public var gang:Number = 1.57;
public var gt:int = 0;
public function getMag(ax:Number,ay:Number):Number
{ return Math.sqrt(ax*ax+ay*ay); }
public function onEnter(e:Event):void
{
graphics.clear();
graphics.lineStyle(2, 0);
//gang =0.48;
gang = 0.1;
ang = gang;
var nx:Number; var ny:Number;
nx = Math.cos(gang);
ny = Math.sin(gang);
vx+=nx*0.4;
vy+=ny*0.4;
// vang *=0.9;
// vang = vx*0.1; ang+=vang;
vx*=0.99;vy*=0.99;
//vy+=0.4;
if (vy>8){vy=8;}
var mx:Number; var my:Number;
mx = stage.mouseX; my =stage.mouseY;
if (mbutton > 0) { cx = mx+camx; cy = my+camy; }
var ta:Number;
ta = Math.atan2(my-cy, mx-cx);
vx += Math.cos(ta)*0.25;
vy += Math.sin(ta)*0.25;
if (cy > 500) { cx = 235; cy =135; vx=0;vy=0;}
// camx += ((cx-230)-camx)*0.1;
// camy += ((cy-230)-camy)*0.1;
var r:Number;
var wr:Number;
r=16;
wr=16;
wr =2;
var px:Number; var py:Number;
px =cx; py=cy;
graphics.drawCircle(px-camx,py-camy,r);
graphics.moveTo(px-camx,py-camy);
graphics.lineTo(px+Math.cos(ang)*r-camx,py+Math.sin(ang)*r-camy);
var a:xLine;
var i:int; var num:int;
var k:int;
num = vecLine.length;
for (i=0; i<num; i+=1)
{
a = vecLine[i];
graphics.drawCircle(a.x0-camx,a.y0-camy,4);
graphics.drawCircle(a.x1-camx,a.y1-camy,4);
graphics.moveTo(a.x0-camx,a.y0-camy);
graphics.lineTo(a.x1-camx,a.y1-camy);
}//nexti
var kx:Number; var ky:Number;
var u:Number;
var kx2:Number; var ky2:Number;
var t2:Number; var u2:Number;
kx2 =cx-nx*64*2; ky2 = cy-ny*64*2;
kx =cx+nx*64*2; ky = cy+ny*64*2;
graphics.moveTo(cx,cy);
graphics.lineTo(kx,ky);
t=1; t2 = 1;
num = vecLine.length;
for (i=0; i<num; i+=1)
{
a = vecLine[i];
//u = segInter(a.x0,a.y0,a.x1,a.y1, cx,cy, kx,ky);
u = segInter(cx,cy, kx,ky, a.x0,a.y0,a.x1,a.y1);
if (u<t && u > 0) { t = u; }
u2 = segInter(cx,cy, kx2,ky2, a.x0,a.y0,a.x1,a.y1);
if (u2<t2 && u2 > 0) { t2 = u2; }
}//nexti
//if (t<1 && vy>0) { vy=0; }
kx = cx+(kx-cx)*t;
ky = cy+(ky-cy)*t;
graphics.drawCircle(kx,ky,12);
graphics.drawCircle(kx+nx*-8,ky+ny*-8,6);
kx2 = cx+(kx2-cx)*t2;
ky2 = cy+(ky2-cy)*t2;
graphics.drawCircle(kx2,ky2,8);
graphics.drawCircle(kx2+nx*8,ky2+ny*8,4);
nx=-nx; ny=-ny;
var dist:Number; var dist2:Number;
dist = (cx-kx)*nx + (cy-ky)*ny;
dist2 = (cx-kx2)*-nx + (cy-ky2)*-ny;
dot = nx * vx + ny * vy;
deb.text = " d "+dist+"\n d2 "+dist2+"\n dot "+dot;
gt += 1;
var standh:Number;
standh = 64;
// if (gt & 64) { standh = 32; }
if (dist < standh && dot < 0)
{
//dot*=1.5;
vx -= nx * dot;
vy -= ny * dot;
if (dist < (standh-1) && dist2 > 32 && dot < 0)
{
dist = standh-dist;
cx += nx*dist;
cy += ny*dist;
dist2 = (cx-kx2)*-nx + (cy-ky2)*-ny;
if (dist2 < 16)
{
dist2 = 16-dist2;
cx += -nx*dist2;
cy += -ny*dist2;
}//endif3
}//endif2
}//endif
// if ( (ky-cy)<63){ vy-=0.8;}
/*
if ( (ky-cy)<64)
{
//cy = ky-64;
if (Math.abs(ky-cy)<0.1){cy=ky-64;}
cy += ((ky-64)-cy)*0.2;
if (cy < (ky2+17)){cy=ky2+17;}
}
*/
num = vecLine.length;
for (k=0; k<4; k+=1)
for (i=0; i<num; i+=1)
{
a = vecLine[i];
var t:Number;
t = getClose(px,py,a.x0,a.y0,a.x1,a.y1);
//graphics.drawCircle(closex-camx,closey-camy,wr);
var dx:Number; var dy:Number;
var mag:Number;
dx= (px)-closex;dy=(py)-closey;
mag = getMag(dx,dy);
if (mag==0){mag=0.001;}
dx/=mag;dy/=mag;
if (mag<(r+wr))
{
var dot:Number;
dot = vx*dx+vy*dy;
if (dot<0)
{
vx += -dx*dot;
vy += -dy*dot;
//vang += (((vy*dx)+(dy*vx)) / -r)*0.3;
}
/*
graphics.moveTo(closex-camx,closey-camy);
graphics.lineTo(closex-camx+dx*32,closey-camy+dy*32);
t = dx; dx=-dy; dy=t;
vx+=dx*0.1; vy+=dy*0.1;
graphics.moveTo(px-camx, py-camy);
graphics.lineTo(px-camx+dx*32, py-camy+dy*32);
*/
}//endif
}//nexti
cx+=vx; cy+=vy;
}//onenter
public var closex:Number =0;
public var closey:Number =0;
public function getClose(px:Number,py:Number, x0:Number,y0:Number,x1:Number,y1:Number):Number
{
var t:Number;
var ax:Number; var ay:Number;
var bx:Number; var by:Number;
ax = px-x0; ay=py-y0;
bx=x1-x0; by=y1-y0;
t = (ax*bx+ay*by)/(bx*bx+by*by);
if(t<0){t=0;} if(t>1){t=1;}
closex=x0+bx*t;
closey=y0+by*t;
return t;
}//getclose
public function segInter(x0:Number, y0:Number, x1:Number, y1:Number,
x2:Number, y2:Number, x3:Number, y3:Number ):Number
{ var ua:Number; var ub:Number; var bot:Number;
bot = ((y3-y2)*(x1-x0))-((x3-x2)*(y1-y0));
if (bot == 0) { return 999;}
ua = (((x3-x2)*(y0-y2))-((y3-y2)*(x0-x2))) / bot;
ub = (((x1-x0)*(y0-y2))-((y1-y0)*(x0-x2))) / bot;
if (ua > 1 || ua < 0 || ub > 1 || ub < 0) { return 999; }
return ua;
}//lineline
}//classend
}
internal class xLine
{
public var x0:Number = 0;
public var y0:Number = 0;
public var x1:Number = 0;
public var y1:Number = 0;
}//xline