/**
* Copyright applicott ( http://wonderfl.net/user/applicott )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/5DNh
*/
package
{
/*
*
クリックするたびに動きます。
上手く可視化出来なかった。。。
シャッフル > BubbleSort > Shuffle > SelectionSort >>>....
*/
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.filters.GlowFilter;
import flash.ui.Keyboard;
import flash.utils.Timer;
import flash.utils.setInterval;
import frocessing.color.ColorHSV;
import org.libspark.betweenas3.BetweenAS3;
import org.libspark.betweenas3.core.tweens.groups.SerialTween;
import org.libspark.betweenas3.easing.Bounce;
import org.libspark.betweenas3.easing.Cubic;
import org.libspark.betweenas3.tweens.IObjectTween;
import org.libspark.betweenas3.tweens.ITween;
[SWF( backgroundColor="0x000000", frameRate="40")]
public class Main extends Sprite
{
private var n:int=0;
private const NUM:uint = 30; // 配列の個数
private var slist:Vector.<Sprite> = new Vector.<Sprite>(NUM, true);
private var kankaku:int=20; // Barの間隔
private var delay:Number=0; // アニメーションのdelay
private var nagasa:Number=3; // barの長さ
private var ss:Sprite = new Sprite;
private var ss2:Sprite = new Sprite;
public function Main()
{
stage.quality = StageQuality.HIGH;
stage.scaleMode=StageScaleMode.NO_SCALE;
stage.align=StageAlign.TOP_LEFT;
//ゴミ
// //赤い線
// ss.graphics.beginFill(0xff0000);
// ss.graphics.drawRect(0,0,1,NUM*3*nagasa);
// ss.graphics.endFill();
// ss.y=150;
// addChild(ss);
// //青い線
// ss2.graphics.beginFill(0x0000ff);
// ss2.graphics.drawRect(0,0,1,NUM*4*nagasa);
// ss2.graphics.endFill();
// ss2.y=150;
// addChild(ss2);
for(var i:int =0; i< NUM;i++){
var hsv:ColorHSV = new ColorHSV((i*8.5),1,1);
//var mat:ColorMaterial = new ColorMaterial(hsv.toRGB().value);
var sp:Sprite = new Sprite();// (mat,5,5*i+0.1);
var angle:Number = (i / 100) * 360 * Math.PI / 180;
sp.graphics.beginFill(hsv.toRGB().value);
sp.graphics.drawRect(0,0,1,(i+1)*nagasa);
sp.graphics.endFill();
sp.x=i*kankaku;
sp.y=300;
slist[i]=sp;
addChild(slist[i]);
}
stage.addEventListener(MouseEvent.CLICK,click);
}
//セットインターバル
private function click(e:MouseEvent):void{
switch( n++%4){
case 0: shuffle();
break;
// case 1: qsort(cList,0,cList.length-1);
// break;
case 1: bsort();
break;
case 2: shuffle();
break;
case 3: ssort();
break;
}
}
//シャッフル
private function shuffle():void{
var i:int=slist.length;
while (--i) {
var j:int = Math.floor(Math.random() * (i + 1));
if (i == j) continue;
var k:Sprite = slist[i];
slist[i] = slist[j];
slist[j] = k;
slist[i].x=i*kankaku;
anime(i,j);
}
}
//選択ソート
private function ssort():void{
var min:int=0;
var k:Sprite;
for(var i:int=0;i<slist.length;i++){
min=i;
for(var j:int=i+1;j<=slist.length-1;j++){
if(slist[min].height>slist[j].height) min=j;
}
k = slist[i];
slist[i] = slist[min];
slist[min] = k;
anime(i);
}
}
//バブル
private function bsort():void{
var delay:Number=0.0;
for(var i:int=0;i<slist.length-1;i++){
for(var j:int=slist.length-1;j>i;j--){
if(slist[j-1].height>slist[j].height){
var k:Sprite = slist[j];
trace(k.x, slist[j].x);
slist[j] = slist[j-1];
slist[j-1] = k;
anime(j,j-1);
}
}
}
}
// swap アニメーション
private function anime(i:int,j:int=-1):void{
var d:Number=0.1;
//i
var t0:ITween = BetweenAS3.serial(BetweenAS3.delay(BetweenAS3.tween(slist[i], {y:250}, null,d,Cubic.easeInOut),delay),
BetweenAS3.delay(BetweenAS3.tween(slist[i], {x:i*kankaku}, null, d,Cubic.easeInOut),delay),
BetweenAS3.delay(BetweenAS3.tween(slist[i], {y:300}, null, d,Cubic.easeInOut),delay));
if(j!=-1) {
//j
var t1:ITween = BetweenAS3.serial(BetweenAS3.delay(BetweenAS3.tween(slist[j], {y:250}, null, d,Cubic.easeInOut),delay),
BetweenAS3.delay(BetweenAS3.tween(slist[j], {x:j*kankaku}, null, d,Cubic.easeInOut),delay),
BetweenAS3.delay(BetweenAS3.tween(slist[j], {y:300}, null, d,Cubic.easeInOut),delay));
}
//ただの再描画// slist[i].x=i*kankaku; // if(j!=-1)slist[j].x=j*kankaku;
// 引数ひとつの場合 t0だけ実行するため 処理重くなるなこれ
if(j==-1) t1 = t0;
var t2:ITween=BetweenAS3.parallel(t0,t1 );
t2.onComplete = onComplete;
t2.onCompleteParams = [t2];
t2.play();
// 1つのアニメーションのdelay 増やすとゆっくり動く selectionSortはdelay遅くてもいいけど、 bubbleはアニメーションが多くなるからはやめに。
delay+=0.02;
}
//ゴミ
private function animeRed(sp:Sprite,i:int):void{
var t0:ITween = BetweenAS3.delay(BetweenAS3.tween(sp, {x:i*kankaku}, null, 6,Cubic.easeInOut),delay);
t0.onComplete = onComplete;
t0.onCompleteParams = [t0];
t0.play();
}
//同期とるため アニメーション終了処理
private function onComplete(t:ITween):void
{
t.stop();
}
}
}