BreakとReturn

  • 2009 年 12月 7 日
  • kosuke

Progression 4 にある中断コマンド、BreakとReturnについて、その違いをメモ。

シーン /index/a/1 から シーン /index に移動する時、
シーン /index/a/1 のGotoで Breakの場合とReturnの場合で試します。

protected override function atSceneGoto():void{
	this.addCommand(
		new Break(),  // ←これを使う場合と
		new Return(), // ←これを使う場合の違い
		new Trace( "a/1 - atSceneGoto" )
	)
}

Breakを使った場合
new Trace( “a/1 – atSceneGoto” ) は実行されないが、その後はシーン遷移に基づき シーン /index まで実行される。
つまりBreakの場合、処理中のコマンドリストはBreak実行された時点で完了となり、その後のコマンドリストは引き続き処理される。

試しに、Gotoを以下にした場合、

protected override function atSceneGoto():void{
	this.addCommand(
		new SerialList( {
				onComplete:function():void{
					trace("onComplete");
				}
			}, 
			new Break(),
			new Trace( "SerialList" )
		),
		new Trace( "a/1 - atSceneGoto" )
	)
}

new Trace( “SerialList” )は処理されないけど、
trace(“onComplete”)
new Trace( “a/1 – atSceneGoto” )
は実行される。

Returnを使った場合
new Trace( “a/1 – atSceneGoto” ) は実行されず、Returnが実行された時点でシーン遷移が停止する。

Breakの時と同様以下を試すと

protected override function atSceneGoto():void{
	this.addCommand(
		new SerialList( {
				onInterrupt:function():void{
					trace("onInterrupt");
				}
			}, 
			new Return(),
			new Trace( "SerialList" )
		),
		new Trace( "a/1 - atSceneGoto" )
	)
}

new Trace( “SerialList” )
new Trace( “a/1 – atSceneGoto” )
とも処理されず、
trace(“onInterrupt”)は実行される。つまり中断になるわけです。
ちなみに、Progressionクラスの stop() メソッドもReturnと同じっぽい。
試しに以下を実行した場合も結果は同じだった。

protected override function atSceneGoto():void{
	this.addCommand(
		new SerialList( {
				interruptType:CommandInterruptType.SKIP,
				onInterrupt:function():void{
					trace("onInterrupt");
				}			}, 
			function():void{
				manager.stop();
			},
			new Trace( "SerialList" )
		),
		new Trace( "a/1 - atSceneGoto" )
	)
}

“BreakとReturn” に 2 件のコメント

  1. Gravatar Icon taro より:

    Returnしたあとの再開って簡単にできるのでしょうか?

  2. Gravatar Icon kosuke より:

    taroさん、コメントありがとうございます。

    僕の知る限り一発で再開みたいなことは恐らく出来ないと思います。
    Returnした場合に再開用の処理を用意しておくとかじゃないでしょうか。
    僕の勉強不足だったらスミマセンがご参考までに。

    override protected function atSceneInit():void {
    	addCommand(
    		new Trace( "1" ),
    		new Return( {
    			onInterrupt:function():void{
    				//中断したら残りのコマンドを新しいコマンドリストに入れる。
    				var parentList:SerialList	= this.parent;
    				var list:SerialList			= new SerialList();
    				for( var i:uint=parentList.position; i<parentList.numCommands; i++ ){
    					list.addCommand( parentList.getCommandAt( i ).clone() );
    				}
    				//マウスダウンで残りのコマンドを実行
    				stage.addEventListener( MouseEvent.MOUSE_DOWN, function( e:MouseEvent ):void{
    					e.currentTarget.removeEventListener(e.type, arguments.callee );
    					list.execute();
    				});
    			}
    		} ),
    		new Trace( "2" ),
    		new Trace( "3" ),
    		new Trace( "4" )
    	);
    }
  3. コメントをどうぞ