ばね運動を内接多角形へ適用
//--------------------------------------------------------------------------
//
// 内接多角形へのイージングの適用
//
//--------------------------------------------------------------------------
function Polygon()
{
// 描画先
var target:MovieClip;
// 頂点の数
var vertexLength:Number;
// 半径
var radius:Number;
// 最大半径
var maxRadius:Number;
// 半径速度
var radiusVelocity:Number = 0;
// ばね定数
var spring:Number = 0.02;
// 摩擦
var friction:Number = 0.95;
// タイマー
var timer:Number;
// 初期化 : 描画先, 頂点の数, 初期半径, 最大半径
this.initPolygon = function(argTarget, argVertexLength, argRadius, argMaxRadius)
{
target = argTarget;
vertexLength = argVertexLength;
radius = argRadius;
maxRadius = argMaxRadius;
};
this.startInterval = function()
{
timer = setInterval(drawSpring, 24);
};
// 多角形の描画 : 頂点の数, 半径
var drawSpring = function ()
{
// 最大半径との距離
var radiusDistance = maxRadius - radius;
// 半径加速度
var radiusAccel = radiusDistance * spring;
// 半径速度
radiusVelocity += radiusAccel;
// 最大化判定
if (Math.abs(radiusAccel) < spring && Math.abs(radiusVelocity) < spring)
{
clearInterval(timer);
}
else
{
// 摩擦
radiusVelocity *= friction;
// ばね運動
radius += radiusVelocity;
}
var cosArr:Array = new Array();
var sinArr:Array = new Array();
for (i = 0; i < vertexLength; i++)
{
// 0≦radian<2π
var radian = Math.PI * 2 * i / vertexLength;
cosArr[i] = Math.cos(radian);
sinArr[i] = Math.sin(radian);
}
// 終点の角度はMath.PI*2
cosArr[cosArr.length] = Math.cos(Math.PI * 2);
sinArr[sinArr.length] = Math.sin(Math.PI * 2);
// 多角形描画
target.clear();
target.lineStyle(1, 0x000000, 100);
target.moveTo(cosArr[0] * radius, sinArr[0] * radius);
for (var i = 0; i < vertexLength; i++)
{
target.lineTo(cosArr[i + 1] * radius, sinArr[i + 1] * radius);
}
};
}
var o = new Polygon();
var target = _root.createEmptyMovieClip('target', _root.getNextHighestDepth());
target._x = Stage.width / 2;
target._y = Stage.height / 2;
// Polygonの初期化 : 描画先, 頂点の数, 初期半径, 最大半径
o.initPolygon(target, 8, 50, 100);
// 多角形の描画
o.startInterval();
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。