簡単なASをもっと使ってみよう

gotoAndPlay()、gotoAndStop()、prevFrame()、nextFrame()、ASを書く時のマナー




いらいらまうす。
棒だと名前がやばそうというか、そもそも棒じゃないので。
ドラッグ突破防止のため、マウスの左を押すと自爆します。
右クリックでの強行突破は勘弁してください。
これまでのASじゃ封印できないので。




と、変な始まり方をしました、AS講座第04回です。
今回は、今までに比べると楽だと思います。
テーマも「その他」みたいな感じですしね。

ちなみに、上のゲームは、今までやったplay()とstop()、
onイベントハンドラ、パス、そして今回やる内容以外にASは一切使ってません。
難しいASなんてつかわなくてもこの程度はできるんですよ。
なお、制作時間は、画像の用意とかあわせて約1時間。
慣れてる私でこれですから、みなさんはもっと時間がかかるかもしれませんが、
今回の内容を終えたら、このゲームはみなさんにも作れないものじゃないはずです。

今回はテーマを3つにわけて、分割してやっていきましょう。
それぞれ独立した内容ですが、一応順番どおりに読むの推奨。








gotoAndPlay()、gotoAndStop()

まず1つ目のテーマ。
今までフレーム移動系のことはplay()とstop()、
つまり、再生と停止しかできませんでした。
これじゃあ、一度止めても、次の再生はそこからしかできません。

「今いるフレームと関係なく、どこかのフレームから再生」とか、
「今いるフレームと関係なく、どこかのフレームで停止」とか、
欲しいですよね。

ダン☆おにでいえば、「ライフがなくなった時点でゲームオーバー画面へ移動」
「Tキーを押したらゲーム中断してタイトル画面へ移動」あたりです。

そこで、今回の最初のテーマは、「『ラベルへジャンプ』をASで書いてみよう」です。

ラベルへジャンプならAS使わなくてもできるじゃん、と思うかもしれませんが、
マウスが乗ったらラベルへジャンプ、とかはAS使わないと出来ませんよね。
まして、他のMCをラベルジャンプさせようと思ったらなおさら。

やり方は簡単です。
そのラベルへジャンプしたあと再生してほしいなら、パス.gotoAndPlay("ラベルの名前")
停止してほしいなら、パス.gotoAndStop("ラベルの名前")、これだけです。

実際に使ってみましょうか。





色の名前クリックでおにぎりの色が変化。
勘違いされないように先に言っておきますが、
これは色を変化させるASではありませんので。
あくまで色つきおにぎりを各フレームにおいて、
そのフレームを移動してるだけ
です。

説明するよりソース見てもらった方が早いですかね。

今回使うソースをダウンロード

04_00.pflです。
今回は赤と黄色はすでに書き込んであります。
なので、プレビューすれば赤と黄色だけはすぐ動くはず。
で、仕組みの核はID:0002のスプライトですね。
1フレームごとにいろんな色のおにぎりがおいてあります。


ここからしばらくASと関係ないことなので、興味ない人は一気にその先へどうぞ。
「AS関係ない話ここまで。」って書いてあるところからが続きです。


悲しいことに、どうもこの色のつけ方は、ダン☆おに界では、
使われ方どころか機能の存在すら知らない人がほとんどなようです。
「描画位置」の右のほうに、「詳」ってボタンがありますよね。
そこをクリックして、「カラーの変化」にチェック。
枠が2個ずつ4行、計8個あると思います。
これらは上から順に、赤の強さ、緑の強さ、青の強さ、不透明度を表しています。
R=1×R+0とかありますよね。
これは、赤みをどう変化させるか、という式です。

赤みは0〜255であらわされます。
0だと赤みが全くなし、255だと赤みマックス。
左辺のRは表示する赤み、右辺のRはもとの絵の赤み。
この式を例えばR=0.5×R+0とかにすると、全体的に赤みが減った絵を表示できます。
あるいはR=0.5×R+128とかすると、
今度は全体的に(特に赤みがなかった部分が)赤みがかったような絵を表示できます。
R=0×R+0にすれば全部赤みを抜くことができますし、
R=0×R+255なんてすれば、絵全体赤みマックスです。
こう書くと勘違いされそうですが、
R=0×R+255でも青みや緑みが普通なら「絵全体が赤一色」なんてことにはなりません。
赤みがマックスでも、青みや緑みによっては白になったり黄色とか紫になったりするわけですから。
G(緑み)、B(青み)も同じように設定すれば、絵の色調を変えた絵ができます。
ちなみに、カラーの変化にチェックを入れた場合、
いつもの不透明度設定箇所は無効になるので、こっちで不透明度を変えてください。

で、これが便利なのは、1つは今回みたいに同じ絵をいろんな色で置きたいときですね。
その絵のモノクロ画像を用意します。(白、黒の他、グレーもいけますよ。)
で、それをたくさん置いて、各々の「カラーの変化」を設定。
右の四角は0のままでいいでしょう。
左の3つ(不透明度も変えるなら4つ)の四角の中をいじりましょう。
R=1×RG=1×GB=1×Bでそのままの色。
R=1×R、G=0×G、B=0×Bだと青みと緑みを全部抜くので
R=0×R、G=1×G、B=0×Bは当然です。
R=1×RG=1×G、B=0×Bにすると、+黄色くなります。
光の三原色を思い出してくださいね?
R=1×R、G=0×G、B=1×Bだと+紫(マゼンタ)ですね。
R=0×R、G=1×GB=1×Bだと水色(シアン)
さて、少々やっかいなのがです。
R=0×R、G=0×G、B=1×Bで青、というのは正解なんですが、
黒背景の場合、この青は非常に見にくいんですよね。
そこで、緑みをちょこっとまぜましょう。 R=0×R、G=0.4×GB=1×B見やすい青
さっきからの青文字は全部この青で書いてます。
緑みを混ぜる具合は各自色を見てみて判断してください。

これくらい知っておけば、あとは何とかなります。
黄緑が欲しいと思ったら、
黄色R=1×RG=1×G、B=0×Bで、がR=0×R、G=1×G、B=0×Bなんですから、
間をとってR=0.5×RG=1×G、B=0×Bくらいで黄緑ができそうですよね。
オレンジ色も、黄色を知っているのですから作れるでしょう。

これができると、いろんな色の同じ絵を表示したい時に
色別に全部画像ファイル用意しなきゃ!なんてことになりません。
ダン☆おにの矢印の色だって、画像ファイルは白で用意しておいて、
各矢印のMCの「カラーの変化」をいじれば、
pdrファイルを毎回いじることなく好きな色の矢印おけますよ。
「カラーの変化」を変えて同じASを書いた矢印のMCを途中で置きなおせば
途中から色を変えることだって(たぶん)簡単にできますし。
矢印の中を塗ってる人は別ですけど。

おまけ。カラフルな絵を置いて、
R=-1×R+255、B=-1×B+255、G=-1×G+255とすると
ネガポジ反転もできます。

AS関係ない話ここまで。


脱線する前の文をもう1回書いてから再開しますね。

今回は赤と黄色はすでに書き込んであります。
なので、プレビューすれば赤と黄色だけはすぐ動くはず。
で、仕組みの核はID:0002のスプライトですね。
1フレームごとにいろんな色のおにぎりがおいてあります。

で、各フレームにはラベルがつけてあります。
ボタンを押したときに、このラベルを指定してそのフレームへ移動することで、
色が変わったように見えるわけですね。

例えば、をおしたら、赤いおにぎりが置いてある、redというラベルのあるフレームへ。
で、次々と色が変わったらこまるので、ジャンプ後は停止してほしいです。
念のため移動先に「停止」がありますが、スクリプトも停止用のものを使いましょう。

こんな感じ。ソースに既に書いてありますけど。



_root.onigiriというところまでは前回やったパスですね。
絶対パスならややこしい問題は発生しないので、
今回は絵をボタンにして<スクリプト>にonイベントハンドラを書いています。
相対パス使う場合はMCに入れてくださいね。

で、その後のgotoAndStop("red")というのが、
さっきもちらっと紹介したラベルへジャンプのASです。
大文字小文字が複雑なので注意してください。
基本的にASでは、2単語以上をつなげて書く場合、2つめ以降の頭文字を大文字で書きます。
今回だと go to and stop なので、AndとかStopというように大文字が混ざります。
toだけなぜToにならないのかは謎ですが。
あと、英文法なら、go to "red" and stop が正しそうですが、
ASの文法ではこの"red"が最後にあって欲しいので、
単語の順番が多少変ですが、まあ、こういうものだと覚えてしまいましょう。

ともかく、gotoAndStop("ラベルの名前")でそのラベルにジャンプして停止します。
ジャンプしたあと再生したい場合は、gotoAndPlay("ラベルの名前")。
セットで覚えましょう。








Training



今回は内容が少なめなので、Trainingが来るのも早めです。

今、04_00.pflは赤と黄色しか動きません。
これを、青と白も動くようにしてください。
もちろん、勉強のためですから、
赤のをコピーしてラベル名だけ書き換えるとかしないでくださいね?
実際いろいろ作る時はそれでもいいんですけど、
今それをやると勉強にならないので。

余裕がある人は、
green.pdrも用意してあるので、それを使って緑色もつけてみてください。









Training



2つめ。やや難。
わかんない人は、掲示板で助けを求めましょう。
どこまではわかって、どこでどう悩んでるのか書いてもらえると、
答える側も答えやすいのでお願いします。

ダン☆おにのオプションのボタン的なものを作ってみましょう。
丸なり四角なり、ボタンっぽいものがあって、
マウスが乗っている間だけ色が変わる。
そしてクリックすると音が鳴る。

表示を変えたり設定を変えたりはまだできないので考えなくてかまいません。
サンプルは要りませんよね?
各ダン☆おにについてるんですから。


ボタンの画像はParaDrawで各自作りましょう。
1つのpdrで2色表現できるようにしてくださいね。
効果音は自分で作るのは大変なので、
ザ・マッチメイカァズ(OSAさん)とかで、好きな効果音を探しましょう。
音を鳴らすASというのはかなり難しいですが、
その音を入れたMCとgotoAndPlay()をうまく使うことで、
実は音を鳴らすASを使わずに効果音を鳴らすことができます。
方法の正解が知りたい人はtanishiさんのソースあたりを参照。
それでもわからなきゃ掲示板へどうぞ。

さて、Trainingも2つ終わったところで、次の話にいきたいところですが、その前に。
gotoAndPlay()やgotoAndStop()にはもう1つ使い方があります。
()の中に、"ラベル名"ではなく、数字を入れると、
その数字のフレームへジャンプできます。
例えば、_root.gotoAndPlay(3);と書けば、
「3フレーム目へジャンプして再生」となります。

が、このやり方はものすごくお勧めできません。
なんでかっていうと、フレーム数って、わりとちょっとしたことでずれるんですよ。

例えば、ダン☆おにの結果表示のフレーム数。
曲を変えたらシャッターのフレーム数が変わり、
その後にある結果表示画面のフレーム数も当然変わります。
そこで例えばゲームオーバーした後の結果表示で、
_root.gotoAndStop(8263);とかやってたら、曲が変わるごとに、
結果画面に飛ぶASを全部書き換えなきゃいけません。
でもgameOverってラベルを置いて、_root.gotoAndStop("gameOver");なら、
ラベルの位置もいっしょに動いてくれるので、ASは書き換えなくてすみます。

これはまだ注意してればめんどくさいだけですみますが、
例えばMCのどこかに停止を1フレーム入れた場合。
例えばMCのどこかに<スクリプト>を入れた場合。
例えばMCの1フレーム目の停止がプレビューだと動かないから、
後からその前に「何もしない」を入れた場合。
これらの拍子に1フレームだけずれるなんてのはよくある話です。
こういう場合に目的とするフレームが気づかないうちに1つずれた結果、
バグ発生なんて泣けますよね。
ですから、バグを出したくないのであれば、
gotoAnd系を使う場合は、飛びたい先にラベルを用意して、
必ずジャンプ先をラベル指定しましょう。


ただし、1つだけ例外、つまりフレーム数指定の方がいい場合があります。
正確にはフレーム数指定しか使えないんですけど。
第05回以降の内容が入るので、詳細はPlusOneで。








ASを書く時のマナー

これまでASをいろいろ書いてきたわけですが、
こういうことをみなさん一度は感じたことがあると思います。

「なんか見にくいなぁ・・・」

特に、onイベントハンドラの中に5つも6つも命令を書くようなのになると、
自分の中でルール決めて改行とか入れないと、やってられなかったと思います。

が。

みんながみんな「自分流のルール」でASを書くと、
他人の書いたASを見たときに見づらくてかないません。
そこで、ASを書く時のマナーみたいなものが暗黙の了解として存在します。
ここではそれについて勉強してみましょう。

まず、ASを書く時のルールからです。
第01回でやったルール以外に、見やすくするためのルールが存在します。

まず、これは以前もちょこっと言いましたが、
半角スペースは見やすいように好きに入れてかまいません。
というのは、「ここは半角スペースをいれなきゃだめ!」ってところ以外の
半角スペースはParaFla!は無視してSWFを作ってくれるからです。
なので、
on(release){}
でも
on (release) {}
でも、全く同じSWFができあがります。
まあ、半角スペースはそこまで多大な問題じゃないので好きにいれてください。
あ、とは言っても、パスの途中とか命令の途中とか、
そういう無茶なところには入れないでくださいね。
_roo t.p la y() ;
とかやると動かないと思います。
動いたとしても見にくいのでやめましょう。

で、重要なのはここから先の2つです。
まず1つめ。
TABキーの字下げも半角スペースと同じように、
ParaFla!は無視してSWFを作ってくれます。

TABが何かは、AS書くところでTABキーを押してみればきっとすぐにわかります。
それを行の先頭に入れるのがTAB字下げ。
そしてもう1つ。
改行もやっぱりParaFla!は無視してくれます。
が、この2つには暗黙の了解で入れる場所が決まってます。

まず、改行。セミコロンで1つの命令が終わったあとに入れましょう。
これはおそらくみなさんも自分流ルールでやってたんじゃないかと思います。
が、もう1つ。
これ超大事。
どれくらい大事かというと、
あまりに大事すぎてわざわざテストで問題として出されることすらないくらい大事。

{ } というカッコが始まった後、つまり { の後では改行します。
そして、次の行から、つまり { } の中の最初の命令以降全ての行でTAB字下げをします。
で、カッコが終わる前、つまり } の前の命令の最後のセミコロンで改行をした後、
TAB字下げをやめます。
で、 } の後ろでまた改行。


と書いてもよくわからないと思うので、例を挙げますね。
左がAS、右が解説。何のASかはよくわかりませんが。

on(release){          {があるので改行、次の行から行頭にTABを入れる
	_root.mc1.play();   行頭にTABを入れる。セミコロンが来たので改行
	_root.mc2.play();   行頭にTABを入れる。セミコロンが来たので改行
	_root.mc3.play();   行頭にTABを入れる。セミコロンが来たので改行
}               }が来たので、ここからはTABの字下げをやめる。}で改行。
-               さっき字下げをやめたので、普通に先頭から書く
on(keyPress"z"){        {があるので改行、次の行からまた行頭にTABを入れる
	_root.stop();     行頭にTABを入れる。セミコロンが来たので改行
}               }が来たので、ここからはTABの字下げをやめる
こんな感じです。
これの最大最強のメリットは、 { } の対応関係がわかりやすいことです。
{ と } はかならず対になるわけですが、長いASになると、
どの { を閉じてるのがどの } なのか分かりにくくなりがちですが、
こうすると { } の対応関係はTABの字下げを見れば一目瞭然です。

え?そんなのなくてもわかる?
じゃあこれわかりますか?
私のソースで実際に使われてるASを一部省略したものです。
TAB字下げと、セミコロン直後以外の改行は全部消しました。
ASの内容がわかるかじゃなく、 { } の組み合わせがわかるかどうかですからね。

on(release){if(_root.replayview!=2){_root.replaycopy="";

	//中略(リプレイデータを生成して_root.replaycopyに代入)

_root.replaycopytxt=_root.musictitle+"/\r\n";
_root.copiedlength=0;
do{_root.replaycopytxt+=_root.replaycopy.substr(_root.copiedlength,80)+"\r\n";
_root.copiedlength+=80;
}while(_root.copiedlength<_root.replaycopy.length);
System.setClipboard(_root.replaycopytxt);
this.gotoAndStop("ok");
}}


字下げがあればわかりやすいでしょ。ほら。

on(release){
	if(_root.replayview!=2){
		_root.replaycopy="";

		//中略(リプレイデータを生成して_root.replaycopyに代入)

		_root.replaycopytxt=_root.musictitle+"/\r\n";
		_root.copiedlength=0;

		do{
			_root.replaycopytxt+=_root.replaycopy.substr(_root.copiedlength,80)+"\r\n";
			_root.copiedlength+=80;
		}while(_root.copiedlength<_root.replaycopy.length);
	
		System.setClipboard(_root.replaycopytxt);
		this.gotoAndStop("ok");
	}
}


あ、そうそう、 { } の中に { } が入ることがあるって言い忘れてましたね。
そういう場合は上のやつみたいにTABの数を増やします。
で、 } のところでTABを1つ減らす、と。
下から6行目くらいのところで } が来ても改行してないのは
ちょっと例外的なことなので、今は気にしないでください。
そのうち説明します。

そういえば、第00回で、「ASってこんな感じですよー」って出したのも、
ちゃんとそれにしたがって書いてありますね。



当時はちんぷんかんぷんだったこのASも、
今なら半分くらいは何が書いてあるのかわかるんじゃないでしょうか。
みなさんの成長の証です。
この項目と関係ないですけど。



さて、ASを見やすく書くためのルール、最後にもう1つあります。
//と、スラッシュを2つ書くと、その行の//以降はまとめて無視されます。
その行ってのは、次の改行までです。はい。
これが何に役立つかというと、
なんと、ASにメモ書きができます。
無視されるってことは、日本語書いてもエラーにはなりませんからね。
ちなみにこれをコメントアウトと言います。

on(release){                   //MCをクリックしたら
	_root.mc1.play();      //mc1を再生
}
これ、右のやつごと書いてもエラーしません。
//のおかげで、そこから先は無視されますからね。
ただし、スペース空けるのも無視してもらわなきゃいけないので、
半角スペースかTABで右へ移動してくださいね。
全角スペースで右へいくと、そのスペースは無視されず、変なことになります。

まあ、本当にいちいち書いてると逆に見にくい気もしますが、
AS1箇所毎にどんなASなのかをメモしておくと、
あとからAS読み解かなくても何が書いてあるのかわかって便利です。
他にもダン☆おにの譜面台みたいな超長いところにいろんなASがある場合、
どこからどこまでが何のASかをメモしとく、なんて使い方もありますね。

便利以外にも、他人がそのASを見ることがある場合は、
そのASを書いた意図も伝わりますし、
コメントはなるべく書いておくことをお勧めします。
ええ、強くお勧めします。


番外編。
ASにトラブルが発生して、一時的に一部ASを消したい、
でも消してまた書き直すのはめんどくさい、ってときに、
そのASがある行の最初に//を入れてコメントアウトしてしまえば、
消したのと同じ効果になります。
もちろん戻すには//を削除。すごく便利。


最後ちょっと脱線しましたが、
これからASを書く時は、ぜひこのルールに従って書きましょう。








prevFrame()、nextFrame()

順番的にはgotoAnd系と並べて書くべきだったかもしれませんが、
ここでASをわかりやすく書くための練習も兼ねてもらおうってことで、
あえて順番を逆にしました。
gotoAndStopが理解出来てる人ならこの項目は楽勝だと思います。

prevFrame()は、簡単に言えば、gotoAndStop("1フレーム前")
nextFrame()は、簡単に言えば、gotoAndStop("1フレーム後")
になります。
PlayじゃなくStopなことに注意してくださいね。
prevというのは、previous(以前の)という単語を省略したものです。
previousFrame()じゃ長いですからね。
あと、かっこは忘れないでください。
play()やstop()のと同じように、かっこを忘れると動きません。

これがどういうときに便利かというと、ボタンでコマ送りするときに便利です。
例えばこんな。





ソースのうち、大事なとこだけ抜き出したのが04_01.pflです。
今回は最初から全部スクリプトは書いてあります。
どういう風になっているか、わかりますか?
くるっとまわるおにぎりの半回転したところにいきなりgotoAndStopしてますが、
これは下準備。
メインのASは、3フレーム目にある、2つのpflファイルに書かれたスクリプト。
文字通りのコマ送りなのがおわかりいただけるでしょうか。
右を押したら1つ次のフレームで停止。
左を押したら1つ前のフレームで停止。
忠実にコマ送りです。

一応、これだけだと右は半周したところで止まっちゃいますし、
左もなんか半周回ったらもとの向きにもどっちゃったりしてます。
これは回転数をスタートするフレームの前後それぞれで
十分な回転をするようにすればいいのですが、
それでも無限にってわけにはいきません。
無限にまわすにはどうするか。
私は04_02.pflのようにしましたが、いろいろなやり方があると思います。
あなたなら、どうやりますか?
面白い案があったら掲示板まで。








Training



本編でprevFrame()もnextFrame()も使わなかったので、
ここで使ってみましょう。

こんなのをつくってみましょう。
これが出来ると例えばダン☆おにでは
オプションの設定の選び方をちょっと便利にできるかもしれませんね。
オプションの場合は同じことを別の方法でもできますけど。




左や右が押せない条件で消えるのが難しいかな?
これの場合も赤丸の位置を記憶して色変化ASでなんちゃらとかできますが、
prevFrame()やnextFrame()の練習なので、これ使ってくださいね。









中間試験



さて、初級編もここでほぼ半分です。
言ってみれば、1学期の半分。
そこで、1学期の中間試験を行いたいと思います。
かなり難しいですが、がんばってください。
制限時間なし、目標時間5時間。
時間があるときに一気に仕上げるなり、
毎日ちょっとずつ進めるなり。



こういうゲームを作ってみましょう。
最初にあったやつですね。

素材は提供しようかと思いましたが、
それだと本当にこの作品の劣化verにしかならないので、
私が使った絵の一覧を用意するので、各自pdrファイルを用意してください。

  • いらいらまうす
  • くりあ!
  • ミス時の爆発
  • たいむあっぷ!
  • すたーと
  • ごーる
  • 遊ぶ!
  • もっかい
  • Time
  • 10×10の白い四角
以上10点。
四角を引き伸ばしたりしてコースを作るのがめんどくさい人は、
コースの壁のpdrを別に用意してもいいでしょう。
その場合でも、残りタイム表示用に四角は用意してください。

「すたーと」とか「遊ぶ!」とか「もっかい」に相当するものを
1つの絵でまとめてやる場合は当然数は少なくなりますし、
他に何か要素入れたい場合は絵の数は増えるでしょうし、
そこらへんは臨機応変に。

使うASは今までにやったことだけです。
というか、これを作れるような順でやってきたというのが正解ですが。 今回のTrainingで効果音を鳴らしたような
ちょっとひねった使い方も特にしないので、
今の自分の実力を知るにはいいテストだと思います。

ASの使い方、どこでどのASを使うべきかの判断、
そして、「どの順番で作っていくかの判断」、 すべてが要求されます。がんばってください。
あ、テストって言っても、学校のテストとは違うので、
今までの講座のカンニング可、まわりの人と相談可。
掲示板で質問するのなんかもありです。
ダン☆おにの中規模の改造をするくらいには難しいので、
まわりにアドバイスを求めることは恥じゃないですからね。

正解とか一番効率がいい作り方とかは、 掲示板で要望が出ない限りは用意しません。
いっぱい要望があった場合は、
番外編で「実際にゲームを作ってみよう」というページを用意しますが。

あと、せっかくゲームを作ったんなら、
みんなに遊んでもらわなきゃもったいないです。
ゲームができたらぜひ意見・感想・雑談等スレに投下してくださいね。
投下してみんなのリアクションから学ぶこともあるでしょうし。









今回はPlusOneも3つあります。
3つの内容それぞれに対応してるわけではないんですが、
フレーム移動系ASはいろいろと使用上の注意があるので、
それに関しての話が1つめと2つめ。
一応PlusOneになってますけど、できたら読んで欲しい内容です。
3つめは本編で予告したやつですね。
こいつだけはAS講座のこれから先の内容を使うんで、
この講座で初めてASやる人は
先に行ってから読んだ方がいいかもしれません。








PlusOne:スクリプト実行中断?



まず1つめは、うっかりすると
作ったSWFでバグが発生しかねないお話。
スクリプトというのは、複数の命令がある場合、
上の行から実行します。
まあ、書いた順通りですね。

ところが、一度実行されると必ず最後まで実行されるかというと、
絶対にそうというわけではありません。
gotoAnd系のASやnextFrame()とかで、
自分自身が、そのスクリプトがあるフレームから移動してしまう場合、
または親MCがフレーム移動して自分自身が消えてしまう場合、
そこより先のASが実行されないことがあります。


「ことがあります」というのが厄介で、
先のASが実行されることもあります。
条件は謎です。

とにかく、そういうことが発生するのは絶対に避けなければなりません。
自分自身の、あるいは親MCのフレーム移動がASに含まれる場合、
その命令は一番最後の行に書きましょう。

でないと、とんでもない目にあうかもしれません。








PlusOne:gotoAnd系に関するバグ2つ



このgotoAnd系のASは、単独で使った場合でも、
SWFのバグを引き起こすことがあります。
よくあるバグを2種類紹介します。

症例1:gotoAndで飛んだフレームが微妙に違う。

これは「停止」を置いてあるフレームにgotoAndPlay("")で飛んだ場合に
よく発生するようです。
言われたことを忠実にこなすコンピューターが、
「あそこへ行って再生!」と言われたのに、
いざそこへ行ったら「再生するな!」と言われるのですから、
変な挙動してしまうのも無理もない話です。

対策は簡単です。
停止が置いてあるフレームに飛ぶには、
gotoAndPlay()じゃなく、gotoAndStop()を使いましょう。

そもそもこの2種類の使い分けが正しく出来てないことが原因ですしね。

症例2:gotoAndでフレーム移動したら、本来消えるはずのMCが消えない。

これは半分はParafla!のせいでもあります。
ただ、これを変に防止されるとたぶん別のところで困ります。残念。
ということで、このバグの防止は、SWF制作者が気をつけなければなりません。

バグ発生の条件としては、
「gotoAnd系で、フレームをさかのぼった時」に、
「移動前と後で同じ深度に別のMCがいる」と発生します。

例えば、最初に深度10にAというMCがあり、途中では同じ深度10にBというMCがあり、
最後のほうにはやはり深度10にCというMCがあったとします。
Aが表示されてるフレームからBがあるフレームへ移動しても何もバグはおきません。
が、逆をやった場合。
つまり、Bが表示されているフレームから、Aがあるべきフレームにさかのぼった場合。
なんと、さかのぼったあと、Aは表示されず、かわりにBがずっと表示され続けます。
CからBに戻ればBのかわりにCが表示され続けますし、CからAでも同様です。

このバグを起こさない対処法としては、
フレームがさかのぼる可能性がある箇所ではMCの深度を全部変える ということをしなければなりません。
まあ、使うMC全部深度ずらせば完璧です。
ですが、単純なことゆえにけっこう忘れがちで、
バグがでてから「あ、しまった」というのを私はよくやります。
とにかく、気をつけてください。








PlusOne:gotoAndStop(フレーム数)の使い道



使い道があるのは、変数の中身をフレーム数として表示する場合です。
あ、変数は次回の内容になるんで、分からない人は先に次回以降をどうぞ。
ダン☆おにでは、例えば、ライフゲージに使われてます。
ダン☆おにじゃなくても、ゲームに出てくる○○ゲージの多くは、
そんな方法がとられていると思います。

ようするに、四角がだんだん長くなるMCを作って、
「"今のライフ"フレーム目に飛んで停止」というのをやることで、
ライフが多ければ長い四角が表示され、
逆に短ければ四角が短くなる、という寸法です。
あ、やりかた書いてませんでしたね。
gotoAndStop(_root.life)って感じで、
フレーム数に対応するところに変数名を書くだけです。
""でくくると、_root.lifeって名前のラベルに飛べ、になっちゃうので注意してくださいね。
あと、何らかの方法でライフの数字が
ライフゲージ用MCのフレーム数を越えないようにするようにしましょう。








以上、ごった煮のAS講座第04回でした。
次回以降はがらっと毛色がかわって、
「ASでないとできない複雑な処理」のお話になります。





戻る   掲示板へ