ParaFla!(パラフラ)やSuzuka(すずか)で注意したい事。
PalaFla!(パラフラ)やSuzuka(すずか)でアクションスクリプトを開発する際に注意したい事を挙げておきます。
- パラフラやすずかに限らず、アクションスクリプト開発で注意したい事も挙げておきます。
- 一部批判めいた記述と取られ得る箇所もあるかも知れませんが、実際に制作者が体験したトラブルを基にして書いた事ですので、ご勘如を請います。
論理和と論理積が混在する条件式では、論理積も必ず括弧で囲みましょう。
アクションスクリプトやJAVAスクリプトのベースとなっているECMAスクリプト, 或いはJAVA, Perl, PHPなど C/C++ の文法を真似ている言語では、条件式に以下の論理演算子が使えます。
&&
… 論理積。左右双方の条件式が真値(非零)である場合に限り真値とする。左式が偽値(零)の場合は右式は評価しない。||
… 論理和。左右の条件式のうちどちらかが真値(非零)である場合を真値とする。左式が真値(非零)の場合は右式は評価しない。!
… 論理否定。論理式の真偽を反転する。
さて、論理和・論理積も通常の数式の和と積同様、積の方が結合順位が高くなっております。
従って、
条件式1 || 条件式2 && 条件式3
と言う論理式は、
条件式1 || (条件式2 && 条件式3)
と同義となる筈です。
ところが、パラフラやすずかで用いられているアクションスクリプトコンパイルエンジン・aclib.dllでは、このような評価をしません。
従って、論理積と言えども、括弧で囲んでおかないと、どのような評価となるかは分からなくなってしまいます。
もし、論理和と論理積を混在させた論理式を用いていて、思ったように動作しないと思ったら、論理積の部分を括弧で囲んでいるかどうかを確認し、必ず論理積の部分も括弧で囲むようにしてください。
return文の値に函数呼出は使えません。
例えば、
return (func(param1, param2));
と書いても、パラフラのスクリプトコンパイラが書き出すコードは正常に函数 func() を実行してくれない場合があります。
その場合、当然期待通りの動作とならない事でしょう。
面倒ですが、一旦使っていない変数に当該函数の帰し値を入れて、それを返すようにしましょう。
すなわち、件の例は
v=func(param1, param2);
return (v);
とすれば、正常に動作します。
- return文の返し値を、いちいち函数みたいに括弧で囲んでおりますが、これは制作者のコーディングでの癖のようなものですので、悪しからず。
全角文字に注意しましょう。
全角文字をそのままコードのトークンとして取扱える高級言語は殆どありません。
例えば、以下のような記述では、多くの処理系は容赦なくエラーを吐き出すでしょう。
a=1234;
ところが、パラフラやすずかで用いられているアクションスクリプトコンパイルエンジン・aclib.dllでは、このような記述をエラーとしてくれませんが、正当な半角文字にしてくれる訳でもありません。
数字なら一目で間違いと分かる場合が多いでしょうが、流れ制御節を閉じる }
など、エディタに依っては半角と全角の区別が付き難い文字だと、なかなか原因が特定出来ないと言う事態になる事もあります。
注釈を日本語で入れたり、日本語の文字列リテラルを打ち込む事の多い方は、充分気をつけましょう。
特にパラフラのスクリプトエディタは文字が小さく、文字に依っては全角と半角の区別が付き難い場合が多いので、スクリプトは手持ちのエディタで書いて、書き上がったらパラフラのエディタに貼り付けると言う方法も考えられます。但し、パラフラのエディタにも注意すべき点があります。
パラフラのスクリプトエディタで注意したい事。
パラフラのアクションスクリプトエディタには、保存するコマンドがありません。
この事は、一度書換えてしまうと、間違いに気づいても元に戻せない事を意味します。
特にスクリプトを書換えたいフレームを間違えると悲惨な事になります。
制作者は使い始めの頃には(実は今も?)これで何度も無駄で悲惨な時間を費やしてしまったので、充分注意しましょう。
gotoAndPlay() 函数を実行しても、そのフレームの処理が終わる訳ではありません。
- この節の記述は恐らくパラフラやすずかに限らず、他のフラッシュオーサリングツールでも起こり得ると思われます。
アクションスクリプトでは、フラッシュとしての流れ制御は gotoAndPlay()
函数など、限られた函数に依存しなければなりません。
ところで、初心者の方には、gotoAndPlay()
函数は実行し終わると、直ちに指定されたフレームに飛んで、後のコードは実行されないと思っている方も多いかも知れません。
実際には、gotoAndPlay()
函数が行う処理は当該フレーム内のコードを実行し終えた後に次に進むべきフレームを指定する動作だけであり、従ってgotoAndPlay()
函数より後に書かれたコードも実行される事となるのです。
ですから、gotoAndPlay()
函数を実行して別フレームに飛んだ後に実行されると拙いコードが直後に続いていると、実行されてしまい拙い結果となる訳です。
例えば、
if (
条件式) {
… (必要な処理) …gotoAndPlay(
飛び先);
}
… (飛び先に飛んだ場合に実行されては困る処理) …
と言う処理の場合は、以下のように書かないとバグの原因となります。
if (
条件式) {
… (必要な処理) …gotoAndPlay(
飛び先);
}
else {
… (飛び先に飛んだ場合に実行されては困る処理) …}
特に分岐が複雑になる場合には注意しないと思わぬバグに噛まれる事になるでしょう。