名古屋でホームページ制作とFlash eternity design BLOG

Tweener 1.31.70

リリースされていますね。
eternity designでも1.31.69を使っています。
Filter関連でかなり機能追加されているのでおすすめです。
Tweener

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
[code]
var myObj:MyClass = new MyClass();
[/code]
B.swf(MyClass.asが存在するとして)
[code]
import MyClass;
[/code]
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でもちょいと遊んでいましてこいつがなんだか難しい。
ちゃんと使いこなすことができれば面白いことができるのはわかってるんだけど、
どっかのサンプルスクリプトをただ使うだけでは何も得るものがないしなぁ。
日々精進でございます。

About me

名古屋を中心に、フリーランスでホームページ制作してます。 デザイン・サイト制作・Flash制作と幅広く対応可能です。 案件のご依頼・ご相談はお問い合わせよりご連絡ください。