In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

Tween24Sort

バブルソートもコムソートも使わなくても、
正の数字のソートも出来るんです。
そうTwee24ならね。

parallel処理のonCompleteに頼らない版がこちら
http://wonderfl.net/c/qfSW
Get Adobe Flash player
by masamunet 12 Sep 2012
  • Related works: 1
  • Talk

    masamunet at 11 Sep 2012 19:33
    一連の処理(シリアル化されたwaitとfunc)をグループとしてgetGroupTweenでパラレル実行させてonCompleteにコールバックさせてるんだけど、たまに実行されない(?)ときがあるのかソート後に足りないデーターが出てくるぜ?
    a_24 at 12 Sep 2012 06:30
    50回くらい試してみましたが数回くらい変に表示される時がありますね。多分パラレルの仕様で、子トゥイーンの中で一番timeが長いものにonCompleteのトリガーを持たせているんですが、ソートする数値が10付近に密集した場合に、例えば同じエンターフレームで最後の2つのトゥイーンが同時にcompleteする場合、1つめのトゥイーンがトリガーを持っていると2つめのトゥイーンがcompleteする前にグループのonComplete()が呼ばれてしまうとか、そんな感じの現象な気がします。説明が難しいですが、とりあえず仕様ってことでw
    masamunet at 12 Sep 2012 06:53
    なるほどなるほど、最後のへんに似たような時間のtweenが集まっちゃうと、enter_frameのタイミングで同時にonCompleteトリガーが発生しちゃう感じですね。 処理の高速化のための仕様ですね。 それがわかっただけでもこの無駄ソート書いた甲斐がありましたwあとで手が空いたら解決版も作ってみます。

    Tags

    Embed
/**
 * Copyright masamunet ( http://wonderfl.net/user/masamunet )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/mCs2
 */

package  {
	
	import flash.display.Sprite;
	import flash.events.Event;
	
	/**
	 * ソートテスト全体の進行を管理するクラス。
	 */
	public class FlashTest extends Sprite {
		private var _startData:String;
		private var _message:Message;
		private var _tween24Sort:Tween24Sort;
		
		/**
		 * constructor
		 */
		public function FlashTest() {
			const MARGIN:Number = 10;
			_message = new Message();
			_message.width = stage.stageWidth - (MARGIN * 2);
			_message.height = stage.stageHeight - (MARGIN * 2);
			_message.x = _message.y = MARGIN;
			addChild(_message);
			
			var randomData:Vector.<Number> = RandomData.create(10);
			_startData = _format(randomData);
			_tween24Sort = new Tween24Sort(randomData);
			_start();
		}
		
		/**
		 * テスト開始
		 */
		private function _start():void
		{
			_tween24Sort.addEventListener(Event.COMPLETE, _complete);
			addEventListener(Event.ENTER_FRAME, _proccessing);
			_message.text = _startData + "\rソートスタート";
			_tween24Sort.start();
		}
		
		/**
		 * テスト中実行
		 */
		private function _proccessing(e:Event):void
		{
			var message:Array = [_startData
								 , ""
								 , "ソート中" + Proccessing.enter()
								 , ""
								 , _format(_tween24Sort.data)
								 ];

			_message.text = message.join("\r");
		}
		
		/**
		 * テスト完了
		 */
		private function _complete(e:Event):void
		{
			_tween24Sort.removeEventListener(Event.COMPLETE, _complete);
			removeEventListener(Event.ENTER_FRAME, _proccessing);
			var lastData:Number = _tween24Sort.data[_tween24Sort.data.length - 1];
			_message.text += "\r" + String(lastData) + "\rソート終了";
		}
		
		/**
		 * データーを表示しやすいように整形
		 */
		private function _format(v:Vector.<Number>):String
		{
			return v.join("\r");
		}
	}
	
}
import a24.tween.Tween24;
import flash.events.EventDispatcher;
import flash.events.Event;

/**
 * ソートアルゴリズムを使わず、Tween24のみで正の数値をソートするクラスです。
 */
class Tween24Sort extends EventDispatcher
{
	private static const _TWEEN24_GROUP_NAME:String = "sortGroupId";
	private var _target:Vector.<Number>;
	private var _data:Vector.<Number>;
	
	/**
	 * constructor
	 */
	function Tween24Sort(target:Vector.<Number>):void
	{
		_target = target;
	}
	
	/**
	 * ソートを開始します。
	 */
	public function start():void
	{
		_data = new Vector.<Number>();
		for each(var n:Number in _target){
			_addData(n);
		}
		/*
		group化されたTween24.serialをparallelで実行
		*/
		Tween24.getGroupTween(_TWEEN24_GROUP_NAME).onComplete(function(){
			/*
			すべて処理が終わればEvent.COMPLETEをdispatchする。
			*/
			dispatchEvent(new Event(Event.COMPLETE));
			Tween24.disposeGroupTweens(_TWEEN24_GROUP_NAME);
		}).play();
	}
	
	/**
	 * ソートアイテムをTween24.serialでまとめる
	 */
	private function _addData(n:Number):void
	{
		if(isNaN(n)){
			return;
		}
		if(n < 0){
			return;
		}
		/*
		n秒待ってpush
		*/
		Tween24.serial(
			Tween24.setTimeScale(0.1),
			Tween24.wait(n),
			Tween24.func(function(){
				_data.push(n);
			})
		).group(_TWEEN24_GROUP_NAME);
	}
	
	/**
	 * ソート中のリアルタイムデーターです。
	 */
	public function get data():Vector.<Number>
	{
		return _data.concat();
	}
}




/**
 * ランダムデーターを作るクラスです。
 */
class RandomData
{
    public static function create(length:int):Vector.<Number>
    {
        var ret:Vector.<Number> = new Vector.<Number>;
        for(var i:int = 0; i < length; i++){
            ret[i] = Math.random() * length;
        }
        return ret;
    }
}

import flash.text.TextField;
import flash.text.TextFormat;

/**
 * メッセージ表示用クラス
 */
class Message extends TextField
{
	function Message():void
	{
		super();
		var tf:TextFormat = new TextFormat("_ゴシック", 12);
		tf.leading = 2;
		defaultTextFormat = tf;
		wordWrap = true;
		multiline = true;
	}
}

/**
 * プロセス実行中の細かい処理を行うユーティリティ
 */
class Proccessing
{
	private static const _MARK:String = '・';
	private static const _MAX_LENGTH:int = 10;
	private static var _process:String = "";
	
	public static function enter():String
	{
		if(_process.length > _MAX_LENGTH){
			_process = _MARK;
		}else{
			_process += _MARK;
		}
		return _process;
	}
}