Flash テクニック

ここでは、知っておくと得するFlashの特性について解説しています。
古いバージョンのFlashに関するものばかりで、最新のFlashにはほぼ無関係です。
とりあえず、消さずに放置します。

ビットマップ画像の1ドットズレを回避する方法
ビットマップ画像の誤差について その1
ビットマップ画像の誤差について その2
HighColor(15bit,16bitカラー)時の色ズレを回避する方法
HighColor(15bit,16bitカラー)じゃないのに色ズレ?
tabキーで隠しボタンが見つかってしまうのを回避する方法
ActionScript の実行順序について
やってはいけない
その他Tipsいろいろ




■ビットマップ画像の1ドットズレを回避する方法


左側のムービーだけ、右辺と底辺の輪郭線が完全に絵を囲っていないです。
パブリッシュ設定を Flash6 及び、それ以前のバージョンにした場合の不具合です。
パブリッシュ設定が Flash8 以後の場合、この問題は解消されました。
パブリッシュ設定が Flash7 の場合、若干改善されていますが、ここで紹介する方法だと絵の上端と左端に不具合が出ます。
Flash7の場合は基準点を左上にするのが一番正確に表示されます。(拡大縮小時の位置誤差が小さい)

普通に作ると左側のムービーのようになってしまいます。
(Flash5時代にアルファを適用した時はピクッと1dotズレていたのを再現するためにアルファ変化をつけています)

これを右側のように正確なムービーにするにはどうすれば良いかを説明します。

まず、Flashで扱うビットマップ画像を作るときはサイズを縦横共に偶数にしておきましょう。

ビットマップオブジェクトをドロップしたらすぐに、挿入→シンボルに変換
MX2004では、修正→シンボルに変換



名前:そのままでも良いです
タイプ:グラフィック
基準点:右下


そのまま今度はプロパティパネルのカラーを 高度な設定 に合わせて、設定ボタンを押します。
MX2004では、「詳細」になっています。




設定する値は、以下の通りです。Aの部分のみを+1にします。
この設定は、16bitカラーモード時の不具合を回避するもので、ビットマップのズレとは関係ありませんが、やっておきましょう。
以前はBを+1する方法を紹介していましたが、Flash8以降で不具合が出るようになりました。
(絵同士が重なる時に不具合が起こるバグ→こんな感じ


これで、基準点が右下にあるグラフィックオブジェクトが出来上がりました。
扱いやすいように、中心点は中央に変更しておくのも良いでしょう。
配置位置が、xyともに整数になっていることも確認しておきましょう。
これで、Flashのバグ(仕様?)のいくつかを回避することができます。


Flash5の場合はちょっと面倒です。
グラフィックオブジェクトの編集に入って基準点を右下に変更した後、元に戻って位置を直します。
高度な設定は効果パネルにあります。






■ビットマップ画像の誤差について その1

ムービーのサイズが原寸(100%)でない場合はステージ上の各ビットマップ画像の位置に誤差が出てしまいます。
必ず 100% 表示になるように固定しておきましょう。

この2行のスクリプトによって 100% 表示に固定されます。 FlashMX ( FlashPlayer6 ) 以上で有効です。
Stage.showMenu = false;
Stage.scaleMode = "noScale";

Flash5 時代のこのやり方だと、swf を直接ブラウザで開いた時に機能しません。
fscommand ("showmenu", "false");
fscommand ("allowscale", "false");

原寸(100%)以外で誤差なく正確に表示したい場合はこちらをご覧ください。
→更に正確なFlashのビットマップ表示




■ビットマップ画像の誤差について その2

ビットマップにアルファが二重以上にかかると、若干暗くなります。

<例1>
アルファ値を設定したシンボルを含むシンボルに対し、更にアルファ値を指定した場合。
対策:
アルファが二重にならないように構造を考え直しましょう。
どうしようもなければ、直線的な境界が目立たないようにビットマップ画像の輪郭を透明で抜いておきましょう。

<例2>
透明や半透明部分を持ったビットマップにアルファ値を付けた場合。
対策:
ビットマップのプロパティで圧縮をロスレスにし、半透明部分の面積をなるべく減らしましょう。
半透明部分が必要でなければ完全になくしましょう。
完全に透明な部分は暗くなりませんので目立たなくなります。
透明にしたい部分が単純な形状の場合はアルファ付きビットマップをやめて、マスクレイヤーで対応すると完璧です。




■HighColor(15bit,16bitカラー)時の色ズレを回避する方法

アルファゼロでも輪郭が見える、マスクレイヤーの範囲外でも輪郭が見える、同じ色を使っているのに違って見える。
これらはHighColorの時にディザが自動的に付いたり付かなかったりするからです。
(この場合のディザとはHighColorでは発色できない微妙な色の違いを点描によって擬似的に表現するものです)
ディザは付かないようにするよりも強制的に付ける方が簡単なので、全てにディザを付けて解決します。

解決方法は、
常に表示範囲全体を覆うグラフィックシンボルをアルファゼロで置いておく。
です。

最上層のレイヤー(表示が一番優先されるレイヤー)に表示画面と同位置で同サイズの長方形を描きます。
これをグラフィックシンボルに変換して、アルファをゼロにします。
このレイヤーは作業中に邪魔なのでロックして非表示にしておきます。

この方法は少し表示処理に負担がかかりますが、ビットマップを扱うシンボルも効果A+1をやらずにディザを付けることができます。

検索エンジン用ワードセット:16ビットカラー 15ビットカラー 変色 色ずれ




■HighColor(15bit,16bitカラー)じゃないのに色ズレ?

ビットマップで同じパラメータの色を使用していても微妙な色ズレをすることがあります。
縮小すると極わずかに暗くなるバグです。(Flashplayer9で確認)
「等倍表示、拡大表示」と「縮小表示」ではなぜか色が変わるのです。
同一画面内で同じ色であることが必要な場合は、拡大縮小率が同じになるようにしましょう。

検索エンジン用ワードセット:縮小時の色ずれ 縮小時に暗くなる




■tabキーで隠しボタンが見つかってしまうのを回避する方法

ゲームのようなコンテンツを作る場合に、tabキーのフォーカスコントロールが邪魔になりますよね。
Flash5以降で可能な方法を紹介します。

tabキーを受け付けるダミーボタンを作る方法です。
tabキー入力はそのダミーボタンが受け取って即無視してくれます。

常に表示しているオブジェクトがあれば、それをボタンオブジェクトに変更します。
ボタンオブジェクトのヒットフレームに空白キーフレームを挿入します。
もしも、常に表示しているオブジェクトが無い場合は、表示物が全く無いボタンオブジェクトを作ってステージに配置します。
これがダミーボタンになります。
ダミーボタンオブジェクトのアクションに以下のようなスクリプトを書きます。

on (keyPress "<Tab>") {
tab_dummy = 0;
}

中の代入式は何でも良いです。

もちろん他にも方法はありますが、Flash5でも可能なものではこれが一番簡単な方法ではないかと思います。




■ActionScript の実行順序について

ActionScript を使うにあたってスクリプトの実行順序を意識しないと正常な動作が期待できない場合があります。

1.フレームアクション
2.onClipEvent(load)
3.onClipEvent(enterFrame)
これらのスクリプトが、_root, _root 直下のMC, 子MC, 孫MCにおいてどのような順序で実行されているかを説明します。

ムービーの構成が以下の場合、
_root
 +mcA ( _root の子ムービークリップ )
  +mcB ( mcA の子ムービークリップ )
   +mcC ( mcB の子ムービークリップ )

1フレーム間のアクションスクリプト実行順は、
↓_root の フレームアクション
↓  mcA の onClipEvent(load)
↓  mcA の フレームアクション
↓    mcB の onClipEvent(load)
↓    mcB の フレームアクション
↓      mcC の onClipEvent(load)
↓      mcC の フレームアクション
↓      mcC の onClipEvent(enterFrame)
↓    mcB の onClipEvent(enterFrame)
↓  mcA の onClipEvent(enterFrame)
このようになります。

例えば、mcB のフレームアクションで、
mcC.gotoAndPlay(10);
を実行しても、
mcC のフレームアクションや、onClipEvent(enterFrame) に
gotoAndPlay(1);
が書いてあると、最終的に1フレーム目に行ってしまうのです。

ありがちなのは、mcC の 5フレーム目に
gotoAndPlay(1);
を書き、1フレーム目〜5フレーム目の繰り返し処理をさせている時、
mcB のフレームアクション中の何らかの条件で、mcC の10フレーム目に処理を移したい場合等にこの罠にハマります。

stop(); に関しても注意が必要です。
mcBのフレームアクションで、mcC.gotoAndPlay(10); を実行したとしても、その時にたまたまmcCのフレーアクションに
stop();が書いてあった場合、mcCの10フレーム目には飛びますがストップします。
gotoAndStop(10); と書いた覚えがないのに10フレーム目でストップするので慣れないうちは原因不明のバグと思ってしまいます。

あとは、変数の参照等にも影響してきます。
mcB の onClipEvent(enterFrame) で設定した変数の値は、mcA では onClipEvent(enterFrame) 内でしか反映確認できず、
mcC では次のフレームの処理になるまで反映確認できないことになります。




■やってはいけない

個人的な意見ですが、やらない(使わない)方が良いことを書きます。

with(name){ } を使ってはいけない
withを使うと便利そうに見えますが、実は読みにくくなります。
長いパス指定を何度も書く必要がある場合は一時的なオブジェクトを使いましょう。

例:
var object1 = _root.mc1.mc2.mc3.mc4.mc5.mc6;
object1._x = 10.0;
object1._y = 20.0;
object1._rotation = 45.0;


シーンを分けてはいけない
シーンを分けて扱うのはアクションスクリプトを使わずに単なる映像作品を作る場合のみにしましょう。
Flash5以降のアクションスクリプトはシーンを扱うように作られていません。
シーンを分ける代わりに1つ1つをムービークリップオブジェクトとして制御しましょう。


1フレーム目に音を入れてはいけない
ムービークリップ等の1フレーム目に音を入れると、表示していないつもりでも音だけなってしまうことがあります。
音は2フレーム目以降に入れましょう。


短い効果音をストリーミングにしてはいけない
ストリーミング指定で音を鳴らすと、鳴らした瞬間に処理が重くなり、ほんの一瞬止まります。
何度も鳴らす短い効果音はイベント指定にしましょう。





■その他Tipsいろいろ

IEで動作が遅くなる
パブリッシュ設定のHTMLタブのウィンドウモードの指定を 「不透明表示」 にしましょう。

this. は省略しても良いか?
thisを省略してはいけないアクションは、
ラベル指定の gotoAndPlay, gotoAndStop です。
thisを付けないと、Flash4時代のgotoAndPlay(シーン名,フレーム)と誤認識されてしまいます。
(この関連でややこしいから with(name){ } も使わない方がいいですね)

.fla のファイルサイズが不自然に大きい
通常の保存は手抜き気味の保存(高速化のため)なので消したはずのシンボルなどがセーブデータに残ったままになっています。
たまに別名保存しましょう。
FlashMX2004以降では、「保存して最適化」を実行しましょう。

静止テキストは分解しないと他人のマシンで正常に表示されない?
静止テキストはデバイスフォント(_付きのフォント名)以外なら正常に表示されます。
使用している分だけのフォントの曲線データが swf に取り込まれているからです。

プロジェクタでメニューバーを非表示にすると上下に空白ができてしまう
この順番に実行してやると解決します。(情報源:macromedia.japan.flashフォーラム)
fscommand ("fullscreen", true);
fscommand ("showmenu", false);
fscommand ("fullscreen", false);

特定のムービークリップ専用にサウンド制御
unloadでstopするのを忘れずに。
onClipEvent(load){
    sobj = new Sound(this);
}
onClipEvent(unload){
    sobj.stop();
}

setInterval() の注意点
loadMovieNum()で _level0 以外に読み込んだ swf 内で setInterval()を使用する場合、指定ファンクション内で _root が正常に参照できないようです。
_level を使うか、ファンクションの引数に this を渡して _parent で相対指定する必要があります。




< トップページに戻る

[スポンサーPR] 動くエロ漫画フルボイスモーションコミック