Fuse Kitと複数MCの同時Tweenのお話
Fuse Kitで同時にTweenさせるにはグループ化させる必要があります。
で、これが複数のMCの場合でそのMCの個数などが動的に変化する場合、
どう記述すればいいのかわからない。
一応、下記のようにすれば動くのですが、Fuseのほうでエラー吐き出してるのが気持ち悪くてどうにかしたい。
var f = Fuse.open();
Fuse.openGroup();
// たぶん、このforでエラー出てる
for(var i = 0; i < photoAry.length; i++) {
targetMC[mcAry[i]].tween("_x", -100, 2, motionType);
}
Fuse.closeGroup();
Fuse.closeAndStart();
AS3が出てからもうかなり経過しますが、やっぱりまだまだAS2の出番は多く、Fuse Kitのお世話になることが多いのですがその度に悩んでる気がする。
まぁ、Tweenerでできちゃうんですが、負けた気がするんです。
モーションタイポとBitmap(AS2)
よくあるサイト制作案件で、とりあえずTOPページになんかFlashみたいなの多いと思いますが、そのFlashで大抵キャッチコピー的なものをモーションさせる&ちょいちょい動きつけて終わり!みたいな底辺な感じの制作でモーションタイポ?をタイムラインでやるのも面倒、特に1文字ずつ動かしたりとかやってられないなと思うのでAS2でいくつかパターンを作っておくかということで作り始めたのはいいのですが、いきなり壁に。
まずは、サンプルをご覧ください。
でも、めっちゃ重いです。覚悟してください。
サンプル1(フォントサイズ15pt)
さらに重いです。
重いというかすでにモーションしてません。
ブラウザ反応しなくなるかも。
サンプル2(フォントサイズ25pt)
で、まぁ、壁というのはこの重さなわけです。
サンプル1のほうはまだ自分のメインPCでは問題なく見れます。
やってることは、以下のとおり。
1:
空のMC生成&そこにテキストフィールド作る
2:
1のMCをBitmapData.drawしてやる。
3:
2のBitmapをベースに1ピクセルずつCopyPixelして、そのbitmapのアルファが0でなかったら、空のMC生成してそいつにattachBitmap。
4:
全部CopyPixelし終わったら、3の各MCにTweenerでaddTween。
この重さは単純にMCが多すぎて描画に時間がかかっているのだろうか。
これがAS2の限界なのだろうか。
よくわからん。
Tweenのせいではないのは確かです。
ちなみにサンプル1で1000弱、サンプル2で1500強ぐらいの1x1MCがあるようです。
とりあえず、このままでは使い物にならないのでAS3で書いてみようとは思っていますが、軽くなるのか微妙な感じがしています。
う~ん、CopyPixelは軽いって聞くし、うーん、わからん。
外部SWFのクラスとインスタンス作成
可能かどうか不明なんですが、ちょいと方法がわからない。
google先生にも見つからない。(見つけられない?)
B.swfで適当にasファイルをimportだけしておく。
んで、そのB.swfをA.swfからloadしてやって、A.swfでB.swfでimportされているクラスのインスタンスを作成したい。
A.swf
var myObj:MyClass = new MyClass();
B.swf(MyClass.asが存在するとして)
import MyClass;
B.swfでインスタンス作成しておけばA.swfからメソッドを実行できるんですが、
なんとなくA.swfのほうでインスタンス作成できるようにしておきたい。
なんで、こんな意味のなさそうなことやってるんだってことですが、
簡単に言えば、asファイルを非公開でB.swfを公開したいのです。
どなたかわかる方おりませぬかー!!
private
もーほんとわからん!
オブジェクト指向が理解できないとか記述の仕方がわからないというのとは違う次元で理解できていない気がする。
まずはサンプル。
・asファイル
class privateTest {
private var msg_flg:Number;
var msg:Number = 10;
public function privateTest() {
msg_flg = 1;
}
}
次にflaファイル。
import privateTest;
var pTest:privateTest = new privateTest();
trace(pTest.msg_flg); // 説明1
trace(pTest.msg); // 説明2
trace(this.pTest.msg_flg); // 以下、説明3
trace(_root.pTest.msg_flg);
んじゃ、説明1から
trace(pTest._init_flg);
こいつはエラーになります。
メンバーがプライベートで、アクセスできません。
だそうです。
これは自分の想定通り。
次に説明2
trace(pTest.msg);
これはmsgがpublicなので、エラーでません。
ちゃんとtrace動きます。
最後に説明3
これが問題で、何か重要なことを自分が理解していないだけなのかよくわかりませんが、privateなはずのmsg_flgが取得できてしまいます。
なんでよ。
Flash OOP的に_rootやthisをそこに使うんじゃねーよ!とかいうのがあるのかどうか知りませんが、もしそうだとしても取得できちゃったらまずいでしょ。
getter/setterとか用意する必要なくなっちゃうじゃん。
ここのところ、自分がプログラマー脳じゃないってことを晒してるエントリーが多くなってるのは気のせいでしょうか。
命名規則
ここのところFLASH OOPを購入してオブジェクト指向プログラミングを勉強しております。
OOPの話はまた別の機会として、ちょいと基本から見直してみようと思ったのか、本を読んでいて気になったのかは忘れましたが、クラス名や変数名の命名の仕方が気になりだして、今後はなるべくAS2.0の命名規則に沿った方法にしようと思ったので、自分のための覚書も含めてメモ。
自分の場合、ASだけでなくPerl、PHPでも、UnderBar記法というものを使用しております。
これは単語間をアンダーバー(_)を使用するものです。
なんでこうなったのかは覚えていないけど。
でもって、AS2.0の命名規則は大体以下の通り。
・変数
先頭は小文字で始め、文字の連結は大文字で。(ex: myFont)
・定数
すべて大文字で指定。文字の連結はアンダーバー(_)。(ex: BASE_URL)
・ブール型
isから始める(ex: isLogin)
・関数とメソッド
変数と同様
・クラスとオブジェクト
先頭は大文字で始め、文字の連結も大文字。()(ex: NewMember)
ASの場合、接尾辞の"_mc"のこととか他にもいろいろあるので、
もうちょい細かいのですが、詳細はここを見ていただくとして、自分のやり方はAS的にはなんか変数と定数が混ざってしまっているような感じでちょっと微妙な気がします。
まずは書き直しから始めて脳に叩き込もう。
しかし、一番の問題は命名に使う単語をどうしようというところだったりします。
なんかローマ字は嫌だし、かといって英単語がスムーズに出てくるわけでもないし、
まともに記述しちゃうと長くなったりして読みにくくなるし、ここを解決する方法はないのか!!
onEnterFrame
先日更新した上部のFlashメニューですが、右のAmashと合わせて異常に重い!
メインPCのCore2Duoだとまったく気付かなかったんですが、初代MacBook(CoreDuo)上で見たら気付きました。
これはまずいなということで早速原因の特定と修正を行いました。
おそらく原因は2点。
1、
"HOME"や"Flash Counter"などのコンテンツへのリンクとなるMCですが、
実はステージ外に位置を移動させているだけで常にステージ上には存在していました。
各MCにはonEnterFrameでフィルタや移動などをやらせていたわけですが、必要のない(表示されていない)ものはremoveMovieClipでステージから消してしまい、必要なものだけattachMovieで配置してやることにしました。
最初はこれで軽くなったと思ったんですが、どうも効果は微妙。
2、
ステージ上に存在するMCのonEnterFrameが動きっぱなしでした。
いや、まさかこれでそれほど負荷がかかるとは思ってもいなかったので、ずっと動作させていたわけですが、delete this.onEnterFrameで止めて(消して)、MacBookで確認してみたら明らかに負荷が減ってる。
ということで、動く必要のないときはonEnterFrameを止め、必要なときはthis.onEnterFrame = 関数名;として再び設定してやることに。
これで負荷が激減しました。
他にも効果が微妙な修正を行いましたが、やっぱり非力なPCではフィルタはきつい。
あと、FirefoxのFlash Playerは重いということもわかった。
onEnterFrameは必要ないときは止めてしまいましょう!
Flash Filter
ここのところまったっく触ってなかったFlashですが、先週末ぐらいからちょいと触ってます。
上部のFlashメニューにFilterを利用するように変更しました。
Filterを使うこと自体は初めてではないのですが(Amashとか)、ひとつのMCに2種類以上のFilterを使ったことはなかったなぁと触り始めてから気付きまして、ちょいとしたミスで変な表示になってたりと無意味に時間がかかってしまった。
今回の場合、BlurとGlowを使ってます。
import flash.filters.BlurFilter;
import flash.filters.GlowFilter;
var myBlur:BlurFilter = new BlurFilter(10, 10, 2);
var myGlow:GlowFilter = new GlowFilter(0x4083ff, .5, 10, 10, 5, 3, false, false);
this.filters = [myGlow, myBlur];
こんな感じですね。
リファレンスそのままでわざわざ書く必要もない気もします。
DisplacementMapFilterでもちょいと遊んでいましてこいつがなんだか難しい。
ちゃんと使いこなすことができれば面白いことができるのはわかってるんだけど、
どっかのサンプルスクリプトをただ使うだけでは何も得るものがないしなぁ。
日々精進でございます。
FlashとXMLとFlash Board plus
Flash Board plus Version 3を開発しているとかなり前にエントリーで書きましたが、開発を中止することにしました。
Ver3の目標として「わかりやすさ」という点を重視して管理画面スキンの仕様変更やFlashに返すログの形式にプレーンテキスト(&や=を使うもの)だけじゃなくXMLでも出力できるようにしようと考えていたのですが、実際にXML部の開発に入った際にログの出力だけXMLというのも中途半端な感じがしたのでFlashからの投稿もXMLで処理できるようにしようと思ったんですが、そうすると今までのデータ受け取り方法(POSTで処理)とまったく違う方法になってしまう。
両方に対応するとなるとかなりプログラムを書き換えないといけなくなるし(これは大したことではないが)、XMLにすることでFlash制作は楽になるのか疑問に思えてきて、
さらに、XMLとFlashでやり取りするならMovable Typeという素晴らしいツールがあるではないかと。
(Flashフォームからの投稿とかは無理ですが)
こんな感じで考えているうちにテンションが下がってきたりでVer3作るならもう一度機能を考え直そうと思い、開発を中止することにしました。
これで本サイト更新のネタがなくなった。
ActionScript1.0から3.0
世間ではPS3の発売ということでなにやらちょっと騒がしいようなそうでもないような今日、まったくPS3とは関係ない久しぶりなFlash関連のエントリーです。
ActionScript1.0から3.0への書き換えなどを解説しているコンテンツです。
Flash 9 ActionScript 3.0 Previewのイベントリスナーとクラス定義
自分はActionScriptのバージョンを気にしてプログラム書いてないような気がする。
でも、ActionScript3.0使うと早くなるとか利点もあるので、ちょっと勉強してみたいという方にはおすすめ。
解説はF-siteとかで有名な野中文雄さんです。
軽く読んでみた感じ記述やらが厳密になっていて面倒だ。
でも、勉強しないといけないんだろうな。
YouTubeAPIとFlash
Flash Player 9
リリースされています。
ActionScript 3.0になったのが主な変更点なのでしょうか。
2.0でさえよくわかっていませんが、3.0。
知らないうちに使っていそうな2.0であったり。
まぁ、勉強が足りないってことですね。
(こういう細かいことは気にしない、想定した動きが実現できればなんだっていいのだ)
FileReference.upload
2006の初投稿。
FileReference.uploadの続き。
ieHTTPHeadersでHTTPヘッダで確認しても、
やはりプログラムに2回アクセスしている。
一度目のアクセス時のHTTPステータスコードは完全に無視されている。
当然、2度目のアクセスで500エラーを返してやると、onHTTPErrorイベントリスナーで
検知できます。
これだけ書いていると予想できるかと思いますが、
次の公開素材はFlash Uploaderです。
まぁ、Flash製作者のツールとして使っていただければと思います。
でも、今日、思い出したことが。
仕事があるんだった・・・
FileReference
ActionScriptのお話。
FileReference.uploadメソッドですが、
どうも2度プログラムにアクセスしてる気がする。
サーバーのログ見ても短時間での連続アクセスになってるので、
ほぼ間違いないかと。
仕様なのかバグなのか知りませんが、
1度目のアクセスではファイルの送信は行われていなくて、
2度目で正常に取得できてる。
自作のプログラムのほうでファイルが取得できなかった場合に、
エラーログを出力するようにしていたら、
ずっとエラーが出力されていて、最初は原因がわからなかった。
しかし、ファイルを保存するディレクトリを見たらちゃんとファイルがあった。
これで余計に?な状態に。
そこで、プログラムの最初で処理開始のログを出力するようにしたら、
見事に2つずつ記録されていたので、気づいた。
自作のFlashが原因かとも思ったが、Flash8付属のサンプルでも試したら同様の動作が。
プログラムのほうが面倒なことになりそうです。
ASが動かない理由
onCompleteイベントリスナーの中で、Alert.showをすると
なぜかActionScriptが原因で処理が重くなってるみたいな警告が出てとまる。
なぜなのかさっぱりわからない。
どちらもimportして使っているせいなのかも知れないけど、これは違う気がする。
こーゆー原因を見つけられないところが自分はプログラマーではないなぁと感じる点であったりします。
わかる人いたら教えてください。
そもそもAlertはコンポーネントですが、まともにコンポーネントを使うのも初めてだったりします。
手抜きのつもりで使ってみたけど、実際はそれほどでもなかった。
いやー、実際に触ってみないとわからないことが多いですねー。
