Progression Forum
9月 03, 2010, 02:37:12 午前 *
ようこそゲストさん。まずは、ログインするか、ユーザ登録してください。
アクティべーションメール送られて来ませんでしたか?

ユーザ名、パスワード、クッキー保持期間を入力してログインして下さい。
お知らせ:
 
   ホーム   ヘルプ 検索 ログイン 登録  
ページ: [1]
  印刷  
投稿者 スレッド: コマンドの中断について  (参照数 6089 回)
bao_bao
初心者
*
投稿: 9


web業界に片足を突っ込んだ人。


プロフィールを見る サイト
« 投稿日:: 6月 18, 2009, 01:03:35 午後 »

コマンドの中断処理で、つまずいてしまったので投稿させてください。
以下のコードは、Waitコマンド(id:"wait1")を実行中にステージをクリックすると、
Waitコマンドの終了を待ってから、コマンドを中断させます。
コード:
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
import jp.progression.commands.*;
import jp.progression.core.commands.Command;
import jp.progression.events.CommandEvent;

public class CancelCommand extends Sprite
{
public function CancelCommand()
{
var list:SerialList = new SerialList(null,
new Trace("Command1", { id:"id_Trace1" } ),
new Wait(5000,{id:"wait1"}),
new Trace("Command2", { id:"id_Trace2" } )
);
list.execute();

stage.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent):void
{
if (list.getCommandById("wait1").running) {
var command:Command = list.getCommandById("wait1");
command.addEventListener(CommandEvent.COMMAND_COMPLETE, function(e:CommandEvent):void
{
list.interrupt(true);
trace("interrupt Command");
});
}
});
}
}
}

出力は以下のようになります。
コード:
Command1
Command2
interrupt Command

Command2(Traceコマンド)は、Waitコマンドの後に実行されるはずなのですが、
interruptメソッドを実行後にCommand2は実行されてしまっている状況です。

正しく中断させる方法をどなたか、教えていただけないでしょうか。
よろしくお願いいたします。

●環境
・Windows Vista
・Progression ver 3.1.62
IP記録
flabaka
コミッター
新参メンバー
*****
投稿: 90



プロフィールを見る サイト
« 返信する #1 投稿日:: 6月 18, 2009, 04:05:16 午後 »

>bao_baoさん

こんにちは、flabakaです。

runningの間は他の処理を中断させるようにすればいいんじゃないのかな? と思いましたので、EventListener内をこんな風にしてみました。
コード:
stage.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent):void{
    if (list.getCommandById("wait1").running) {
        var command:Command = list.getCommandById("wait1");
        var command2:Command = list.getCommandById("id_Trace2");
        
        //wait1が走っている間は、command2を中断しておく
        command2.interrupt(true);
        trace("interrupt Command");
        command.addEventListener(CommandEvent.COMMAND_COMPLETE, function(e:CommandEvent):void{
            trace("restart Command");
        });
    }
});
これを実行すると、以下のようになります。
コード:
Command1
interrupt Command
Command2
restart Command
Command1が表示された後に、ステージをクリック→interrupt Commandが表示される→5秒経過→Command2とrestart Commandが表示される

これで意図した動きになっていますでしょうか?
ご確認頂ければと思います。
IP記録
bao_bao
初心者
*
投稿: 9


web業界に片足を突っ込んだ人。


プロフィールを見る サイト
« 返信する #2 投稿日:: 6月 19, 2009, 02:07:47 午前 »

>flabakaさん

すばやい返信ありがとうございます。
--
Waitコマンド(id:"wait1")を実行中にステージをクリックすると、
Waitコマンドの終了を待ってから、コマンドを中断させます。
--
上記の「コマンドを中断させます。」というのはWaitコマンド(id:"wait1")の終了タイミングでSerialListを中断させて、Waitコマンド(id:"wait1")以下の処理を実行させない意でした。
僕の質問の分かりづらい表記、申し訳ありません。

flabakaさんのやり方は非常に参考になりました。ありがとうございます。


1.Waitコマンド(id:"wait1")実行中にクリック
2.Waitコマンド(id:"wait1")が完了を待つ
3.Waitコマンド(id:"wait1")が完了後にSerialList中断
4.Waitコマンド(id:"wait1")以降に登録されたコマンドは実行されない。

という処理をおこないたいと思っています。

コード:
var list:SerialList = new SerialList(null,
new Trace("Command1", { id:"id_Trace1" } ),
new Wait(5000,{id:"wait1"}),
new Trace("Command2", { id:"id_Trace2" } ),
new Trace("Command3", { id:"id_Trace3" } ),
new Trace("Command4", { id:"id_Trace4" } ),
new Trace("Command5", { id:"id_Trace5" } )
);
list.execute();
最初のポストと同様のイベントリスナーを登録しています。
コード:
stage.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent):void
{
var command:Command = list.getCommandById("wait1");
command.addEventListener(CommandEvent.COMMAND_COMPLETE, function(e:CommandEvent):void
{
list.interrupt(true);
trace("interrupt Command");
});
});

とするとして、僕の意図した動きとしては、
コード:
Command1
interrupt Command

実際は、以下のようになってしまいます。
コード:
Command1
Command2
Command3
Command4
Command5
interrupt Command

いろいろ試した結果、Waitコマンドや、DoTweenerを挟んだりすると、以下の結果になりました。
コード:
var list:SerialList = new SerialList(null,
new Trace("Command1", { id:"id_Trace1" } ),
new Wait(5000,{id:"wait1"}),
new Wait(300,{id:"wait2"}), //or  new DoTweener(this,{alpha:0,time:0.3})
new Trace("Command2", { id:"id_Trace2" } ),
new Trace("Command3", { id:"id_Trace3" } ),
new Trace("Command4", { id:"id_Trace4" } ),
new Trace("Command5", { id:"id_Trace5" } )
);
list.execute();
出力
コード:
Command1
interrupt Command

Verbose.enabled = trueにして、ログを見てみると、
コード:
[WARNING] デバッグ接続に失敗しました。
[LOG]   <SerialList : command_7> コマンドを実行。
[LOG]     <Trace : id_Trace1> コマンドを実行。
Command1
[LOG]     <Wait : wait1> コマンドを実行。
[LOG]     <Wait : wait2> コマンドを実行。
[LOG]   <SerialList : command_7> コマンドを中断。
[LOG]     <Wait : wait2> コマンドを中断。
interrupt Command
結局wait2は、実行されているので、そういう仕様なんだなと思いました。
IP記録
flabaka
コミッター
新参メンバー
*****
投稿: 90



プロフィールを見る サイト
« 返信する #3 投稿日:: 6月 19, 2009, 09:34:51 午前 »

>bao_baoさん

すいません、勘違いしていました。

Command1が表示→ステージをクリック→以後の処理は行われない
コード:
Command1
interrupt Command
という感じになればいいんですよね?
なるほど、なるほど。

コード:
package{
import flash.display.Sprite;
import flash.events.MouseEvent;
import jp.progression.commands.*;
import jp.progression.core.commands.Command;
import jp.progression.events.CommandEvent;

public class Main extends Sprite{
public function Main() {
var list:SerialList = new SerialList(null,
new Trace("Command1", { id:"id_Trace1" } ),
new Wait(5000,{id:"wait1"}),
new Trace("Command2", { id:"id_Trace2" } ),
new Trace("Command3", { id:"id_Trace3" } ),
new Trace("Command4", { id:"id_Trace4" } ),
new Trace("Command5", { id:"id_Trace5" } )
);
list.execute();

stage.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent):void{
if (list.getCommandById("wait1").running) {
var command:Command = list.getCommandById("wait1");
trace("interrupt Command");
//list(SerialList)を中断する
list.interrupt(true);
command.addEventListener(CommandEvent.COMMAND_COMPLETE, function(e:CommandEvent):void{
trace("interrupt Command Complete!!");
});
}
});
}
}
}
Command1が表示→ステージをクリックすると、以下のような感じになります。
コード:
Command1
interrupt Command
CommandCompleteした際のinterrupt Command Complete!!や、Command2~Command5も出力パネルに表示されません。
これで、クリックしたら、SerialListの処理を中断するということになっているかと思いますが、どうでしょうか?

list.interrupt(true);

↑このようにして、list(この場合はSerialList)自体をinterruptしてしまえば、OKかと…

果たしてこれがベストな選択か? の問いには疑問符がつきますが…(何せ、僕の回答ですので…)
IP記録
bao_bao
初心者
*
投稿: 9


web業界に片足を突っ込んだ人。


プロフィールを見る サイト
« 返信する #4 投稿日:: 6月 19, 2009, 10:05:23 午前 »

>flabakaさん

ご返信ありがとうございます。

上手くいったかな、と思ったのですが、Waitコマンドの5秒間を中断して、SerialListを中断させているので、僕の意図した動きにはなりませんでした。
Waitコマンド処理の開始終了が視覚的に分かりづらいので、DoTweenerに変えてみました。
コード:
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
import jp.progression.commands.*;
import jp.progression.core.commands.Command;
import jp.progression.core.debug.Verbose;
import jp.progression.events.CommandEvent;

public class CancelCommand extends Sprite
{
public function CancelCommand()
{
var sp:Sprite = addChild(new Sprite) as Sprite;
sp.graphics.beginFill(0xff0000);
sp.graphics.drawRect(0, 0, 100, 100);
sp.graphics.endFill();

var list:SerialList = new SerialList(null,
new Trace("Command1", { id:"id_Trace1" } ),
new DoTweener(sp,{alpha:0,time:3},{ id:"tween" }),
new Trace("Command2", { id:"id_Trace2" } ),
new Trace("Command3", { id:"id_Trace3" } ),
new Trace("Command4", { id:"id_Trace4" } ),
new Trace("Command5", { id:"id_Trace5" } )
);
list.execute();

stage.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent):void
{
var command:Command = list.getCommandById("tween");

command.addEventListener(CommandEvent.COMMAND_COMPLETE, function(e:CommandEvent):void
{
list.interrupt(true);
trace("interrupt Command");
});
});
}
}
}
・DoTweener中にステージクリック
・DoTweenerの処理が終了したら、SerialListを中断させる
・DoTweener以降に登録されたコマンド(Traceコマンド達)は処理をしない
という処理をさせたいのです。

意図する出力(DoTweener以降に登録したコマンドは実行しない)
コード:
Command1
interrupt Command

現状の出力(DoTweener実行中に中断処理をしているけど、Traceコマンドが走ってしまう)
コード:
Command1
Command2
Command3
Command4
Command5
interrupt Command

お手数なのですが、よろしくお願いします。

« 最終編集: 6月 19, 2009, 11:18:56 午前 by bao_bao » IP記録
flabaka
コミッター
新参メンバー
*****
投稿: 90



プロフィールを見る サイト
« 返信する #5 投稿日:: 6月 19, 2009, 11:42:33 午前 »

>bao_baoさん

CommandEvent.COMMAND_COMPLETEのtrace("interrupt Command");が表示される前に、SerialListのCommand2~5が表示されてしまうんですねぇ…

かなりの力業ですが、こんな方法を試してみました。

コード:
package{
import flash.display.Sprite;
import flash.events.MouseEvent;
import jp.progression.commands.*;
import jp.progression.core.commands.Command;
import jp.progression.core.debug.Verbose;
import jp.progression.events.CommandEvent;

public class CancelCommand extends Sprite
{
public function CancelCommand()
{
var sp:Sprite = addChild(new Sprite) as Sprite;
sp.graphics.beginFill(0xff0000);
sp.graphics.drawRect(0, 0, 100, 100);
sp.graphics.endFill();

var list:SerialList = new SerialList(null,
new Trace("Command1", { id:"id_Trace1" } ),
new DoTweener(sp,{alpha:0,time:3},{ id:"tween" }),
new Trace("Command2", { id:"id_Trace2" } ),
new Trace("Command3", { id:"id_Trace3" } ),
new Trace("Command4", { id:"id_Trace4" } ),
new Trace("Command5", { id:"id_Trace5" } )
);
list.execute();

stage.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent):void{
var command:Command = list.getCommandById("tween");

trace("Stage Click!!");

//次に登録されているコマンドは何か、確認してみる([Trace id="id_Trace2" name="command_2" group="null"])
trace(command.next);

//そこで、かなりの力業ですが、新しいSerialListを作成
var sList:SerialList = new SerialList(null,
new Trace("Tween Complete!!"),
function():void{
list.interrupt(true);
}
);
//insertCommandを使って、 id:"id_Trace2"の前にsListを挿入し、実行させる
list.insertCommand(sList)
})
}
}
}
command.nextで次に実行されるコマンドを調べてみると、Trace id="id_Trace2" name="command_2" group="null"と表示されます。

それならば、これが実行される前に、処理を割り込ませればいいのではと考え、新たにSerialListを作成しました。
そこに、list.interrupt(true);を記述しています。

そして、insertCommandを使って、現在実行されているコマンド(この場合はtweenですが)の次に、今作成したsListを登録してあげます。
これにより、Trace id="id_Trace2"の前に、sListが実行されることになります。

これを実行してみると…
コード:
Command1
Stage Click!!
[Trace id="id_Trace2" name="command_2" group="null"]
Tween Complete!!

となり、ステージをクリック→3秒経過→Tween Complete!!が表示され、Command2~5の処理は中断されます。

もっといい方法があるよな~と思いますので、今後も色々試してみることにします。
IP記録
bao_bao
初心者
*
投稿: 9


web業界に片足を突っ込んだ人。


プロフィールを見る サイト
« 返信する #6 投稿日:: 6月 19, 2009, 01:34:07 午後 »

>flabakaさん

ご返信ありがとうございます。
このやり方なら、僕の意図した動きになります。

ありがとうございました スマイリー
IP記録
flabaka
コミッター
新参メンバー
*****
投稿: 90



プロフィールを見る サイト
« 返信する #7 投稿日:: 6月 19, 2009, 03:03:47 午後 »

>bao_baoさん

お役に立てたようで、良かったです~!
IP記録
flabaka
コミッター
新参メンバー
*****
投稿: 90



プロフィールを見る サイト
« 返信する #8 投稿日:: 6月 22, 2009, 01:03:28 午後 »

SerialListを使わないでも同様のことが出来たっぽいので、投稿しておきます。

当初、これでいけるんじゃないのかなぁ…なんて思って試してみたのが、これ。
コード:
package{
import flash.display.Sprite;
import flash.events.MouseEvent;
import jp.progression.commands.*;
import jp.progression.core.commands.Command;
import jp.progression.core.debug.Verbose;
import jp.progression.events.CommandEvent;

public class CancelCommand extends Sprite
{
public function CancelCommand()
{
var sp:Sprite = addChild(new Sprite) as Sprite;
sp.graphics.beginFill(0xff0000);
sp.graphics.drawRect(0, 0, 100, 100);
sp.graphics.endFill();

var list:SerialList = new SerialList(null,
new Trace("Command1", { id:"id_Trace1" } ),
new DoTweener(sp,{alpha:0,time:3},{ id:"tween" }),
new Trace("Command2", { id:"id_Trace2" } ),
new Trace("Command3", { id:"id_Trace3" } ),
new Trace("Command4", { id:"id_Trace4" } ),
new Trace("Command5", { id:"id_Trace5" } )
);
list.execute();

stage.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent):void{
var command:Command = list.getCommandById("tween");
var command2:Command = list.getCommandById("id_Trace2");

trace("Stage Click!!");

//次に登録されているコマンドは何か、確認してみる([Trace id="id_Trace2" name="command_2" group="null"])
//trace(command.next);

//Commandクラスのafterメソッドで、現在処理中のコマンド(tween)が終了したら、trace文を実行させる
command.after(function():void{trace("Tween Complete")});
                   //Commandクラスのbeforeメソッドで、id_Trace2の直前に、listを中断させる処理を実行させる
command2.before(function():void{list.interrupt(true)});
})
}
}
}
で、これを試してみたら、以下のようになりました。
コード:
Command1
Stage Click!!
Tween Complete
Command2
ありゃりゃ、Command2が実行されてしまいました。
なので、以下の様に変更。
コード:
package{
import flash.display.Sprite;
import flash.events.MouseEvent;
import jp.progression.commands.*;
import jp.progression.core.commands.Command;
import jp.progression.core.debug.Verbose;
import jp.progression.events.CommandEvent;

public class Main10 extends Sprite
{
public function Main10()
{
var sp:Sprite = addChild(new Sprite) as Sprite;
sp.graphics.beginFill(0xff0000);
sp.graphics.drawRect(0, 0, 100, 100);
sp.graphics.endFill();

var list:SerialList = new SerialList(null,
new Trace("Command1", { id:"id_Trace1" } ),
new DoTweener(sp,{alpha:0,time:3},{ id:"tween" }),
new Trace("Command2", { id:"id_Trace2" } ),
new Trace("Command3", { id:"id_Trace3" } ),
new Trace("Command4", { id:"id_Trace4" } ),
new Trace("Command5", { id:"id_Trace5" } )
);
list.execute();

stage.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent):void{
var command:Command = list.getCommandById("tween");

trace("Stage Click!!");

//次に登録されているコマンドは何か、確認してみる([Trace id="id_Trace2" name="command_2" group="null"])
//trace(command.next);

//Commandクラスのafterメソッドで、現在処理中のコマンド(tween)が終了したら、trace文を実行させる
command.after(function():void{trace("Tween Complete")});
list.insertCommand(function():void{list.interrupt(true);});
})
}
}
}
これを実行してみると…
コード:
Command1
Stage Click!!
Tween Complete
こんな感じでも、一応、出来るっぽいです。
« 最終編集: 6月 22, 2009, 08:42:33 午後 by flabaka » IP記録
bao_bao
初心者
*
投稿: 9


web業界に片足を突っ込んだ人。


プロフィールを見る サイト
« 返信する #9 投稿日:: 6月 22, 2009, 05:28:51 午後 »

>flabakaさん

スマートにかけるようになって素敵です。
ありがとうございました。 スマイリー
IP記録
ページ: [1]
  印刷  
 
ジャンプ先:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS!