flash on 2013-7-2
♥2 |
Line 106 |
Modified 2013-07-02 23:23:51 |
MIT License
archived:2017-03-30 22:51:25
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/wyx6
*/
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 = 320;
deb.height = 240;
addChild(deb);
limba = getSpr(0xFF, d1);
limbb = getSpr(0xFF0000, d2);
addChild(limba);
addChild(limbb);
//ok so this is not IK but more like cheat-kinematics
//only works if both bones the same length
//and only works with 2
stage.addEventListener(Event.ENTER_FRAME, onEnter);
}//ctor
public function getSpr(c:uint, d:Number):Sprite
{
var s:Sprite;
s = new Sprite();
s.graphics.lineStyle(2,0);
s.graphics.beginFill(c, 0.5);
s.graphics.drawRect(0,-4, d, 8);
s.graphics.endFill();
return s;
}//getspr
public var limba:Sprite;
public var limbb:Sprite;
public var deb:TextField;
public var cx:Number = 200;
public var cy:Number = 200;
public var d1:Number = 50; //50;
public var d2:Number = 50; //50;
public var ratio:Number = 1;
public function onEnter(e:Event):void
{
var mx:Number;
var my:Number;
var dx:Number;
var dy:Number;
var ang:Number;
var mag:Number;
var ax:Number;
var ay:Number;
var bx:Number;
var by:Number;
var dist:Number;
mx = stage.mouseX;
my = stage.mouseY;
dist = d1 + d2;
graphics.clear();
graphics.lineStyle(2, 0);
graphics.moveTo(cx, cy);
graphics.lineTo(mx,my);
dx = mx-cx ;
dy = my-cy ;
ang = Math.atan2(dy, dx);
mag = Math.sqrt(dx*dx+dy*dy);
ax = cx + Math.cos(ang)*dist;
ay = cy + Math.sin(ang)*dist;
var w:Number;
// w = 1/((d1+d2)/d1);
// w = 1 -w;
w = 0.5;
bx = cx + Math.cos(ang)*mag*w;//0.5;
by = cy + Math.sin(ang)*mag*w;//0.5;
graphics.drawCircle(ax, ay, 8);
graphics.drawCircle(bx, by, 4);
// deb.text = "mag " + mag;
var mag2:Number;
if (mag > dist) { mag = dist;}
if (mag < 1) { mag = 1; }
mag2 = dist - mag;
var kx:Number;
var ky:Number;
kx = bx+ -Math.sin(ang) * mag2;
ky = by+Math.cos(ang) * mag2;
graphics.drawCircle(kx, ky, 4);
graphics.moveTo(cx,cy);
graphics.lineTo(kx,ky);
graphics.moveTo(mx,my);
graphics.lineTo(kx,ky);
var m1:Number;
var m2:Number;
m1 = getMag(cx-kx, cy-ky);
m2 = getMag(mx-kx, my-ky);
// deb.text = "m1 " + m1 + " \n " + m2 + " \n " + (m1+m2) + "\n ratio " + ratio;
limba.x = cx;
limba.y = cy;
ra = Math.atan2(ky-cy, kx-cx);
limba.rotationZ = ra * (180/3.1415);
var ra:Number;
var rb:Number;
var rx:Number;
var ry:Number;
//rx = d1*Math.cos(ra) - d1*Math.sin(ra);
//ry = d1*Math.sin(ra) + d1*Math.cos(ra);
rx = d1 * Math.cos(ra);
ry = d1 * Math.sin(ra);
limbb.x = cx+rx;
limbb.y = cy +ry;
rb = Math.atan2(my-(cy+ry), mx-(cx+rx));
limbb.rotationZ = rb * (180/3.1415);
deb.text = "ra " + ra + "\n rb " + rb + "\n w " +w;
}//onenter
public function getMag(dx:Number, dy:Number):Number
{
return Math.sqrt(dx*dx+dy*dy);
}//getmag
}//classend
}