Posts Tagged “progression”

Progression コマンド実行順序を調べてみる

via:コマンドについて色々書いてみる – Is It So Easy?

this.addCommand(
new Trace("コマンドスタート"),
function ():void{
trace("コマンド2")
this.parent.insertCommand(
new Trace("コマンド3"),
function(){
this.parent.addCommand(
new Trace("コマンド4")
);
this.parent.insertCommand(
new Trace("コマンド5")
)
}
)
trace("コマンド6");
},
new Trace("コマンド終わりよ")
);

実行結果:
コマンドスタート
コマンド2
コマンド6
コマンド3
コマンド5
コマンド終わりよ
コマンド4

はてさて。
まず、コマンド2は上から来てるコマンドの最初なので、2番目に実行されるのはOK。さらに、コマンド4がaddCommandなので、コマンド終わりの次にくるのはOK。
コマンド6は、insertCommandの次ですが、functionの中身と考えると3番目に来るらしい(ここからややこしい)。その中でさらにinsertCommandしているのでコマンド5はfunctionの最後で実行される。ここまでがひとつの Func。で、コマンド終わりよ。と表示される。

すべてが一つのaddCommand内で、insertCommandを重ねて作るやり方をよくやるんですが、これがややこしやの元凶なのか! というメモ。

Progressionでクイズゲームを作ろうとして挫折したメモ

1.XMLを読み込んで、質問を表示。(XMLには質問とYES/NOの答え全部載ってる)
2.YESボタン、NOボタンを画面に表示。
3.ボタンをクリックすると答えを表示。
4.一定時間、1~3を繰り返し。
5.条件を満たすとクリアの画面が出る。
というゲームを作っていて、「XMLを読むのがカンタンだからProgressionを使おう」「問題画面とクリア画面をシーンにすればいいかな」と思って(バカ)進めていたんですが、3,4,5でつまづきました。
以下、やっちまったことメモ。
まずXMLを読み込むのはLoadURLでサラッと完了。
XMLをパースして、問題を画面に表示。
で、画面にYESNOボタンを表示。new AddChildですよ。ここでつまづいたこのテクを見て、AddChildの次にfunctionでtimeOut=0;dispatcher=yesno_mc;eventType=MouseEvent.CLICK;を設定したんですが、yesno_mcのYESボタンとNOボタンのどっちがクリックされたのかが判定できません。致命的。なんとかstage.mouseXとmouseYでクリックエリアを取得して、まぁいいか、という感じで完了。
次に答えを表示する部分では、答えの表示は答えと説明を出したかったので、XMLをパースするつもりでwhile文中でyesタグまたはnoタグの内容を引っ張ろうとしました。ここでつまづいた:functionの中でinsertCommandが実行されるのはどうやら遅いっぽくて、ループでひとつずつ実行されるのかと思ってたらループが終わったときにまとめて実行されてるっぽいので、答えと説明が同時にテキストエリアを埋めるという怪奇現象に遭遇。ここはnew Wait(3000)とかで十分な時間を取り、なんとか完了。
そしてクリアするまで上記を繰り返す操作がしたかったんですが、ここでつまづいた:1~3のコマンドをコピーして延々実行するというところで、そのやり方がわからない。ほっとくとどんどん実行され続けるし。
で、この辺で気付きました。
これ、Progressionでやることじゃなくね?と。
そもそもクイズゲームを作ったことがないのでどんな構成にしたらいいのかが分かってないのが問題だとは思うんですが、クリック待ちはできるけどボタンを待つことができない、とか、ひとつのシーン内で同じ処理を繰り返すのが向いてなさそう、とか、どうやら間違ったことをやっていた、ということが分かりました。

コマンド順序のメモ

タイムラインスタイルにて。

var xml:XML = new XML(
<txml>
<serif>あいうえお</serif>
<serif>かきくけこ</serif>
<serif>さしすせそ</serif>
<serif>コニャニャチハ</serif>
<serif>がっちゃまーん</serif>
<serif>しょっきんぐ</serif>
</txml>
);
scene.onInit = function():void {
this.addCommand(
function():void{
for(var i:uint=0; i<xml.serif.length(); i++){
this.parent.insertCommand(
new Trace(i),
new Trace(xml.serif[i]),
new Wait(600)
)
}//end for
}
);
};

みたいなことをやってみたとき、Trace結果はこのようになります。

5
しょっきんぐ
4
がっちゃまーん
3
コニャニャチハ
2
さしすせそ
1
かきくけこ
0あいうえお

本当は0から順に表示したかったのです。
つまり、コマンドを追加するときにforループを使うと、大きいものから実行されてしまうんですね。
var i:uint=xml.serif.length()-1; while(i– >=0){…}でやってみると順番になりました。

ループの落とし穴でした。