最近のPV3D2.0 GreatWhite

1ヶ月ほど前になるけど、Camera3Dがめっちゃ変わった。
(Revision645からかな)

正直、面倒な仕様変更なので実際にコード書いて確かめたわけじゃないけど、FreeCameraとかFrustumCamera3Dがなくなった。
というと正確じゃないけど、Camera3DがFreeかFrustumみたいになったというべきか。
Canera3Dのパラメータもすごく変わってます。

BasicView使う人はデフォルトでは前のCamera3Dと同じ動作になるようになっている。
(たぶん、TARGETって、それっぽい名称だし)

var myBasicView:BasicView = new BasicView(width, height, scaleToStage, interactive, cameraType);

このcameraTypeパラメータが指定するところで、値は以下が使える。

CameraType.TARGET
CameraType.FREE
CameraType.DEBUG

BasicViewではデフォルトで「CameraType.TARGET」が指定されているけど、普通にnew Camera3Dすると「CameraType.FREE」になってるんじゃないかなという気がする。

んじゃ、BasicView使わないときはどうやってcameraType変更するんだってことになるけど、これまたよくわからない。
PV3DScene3Dクラスにpublicな変数でcameraTypeがあるから、これだろうか。
ここで"Free"と指定されているから、上記の気がするという件の根拠なんだけども。
[追記]
PV3DScene3Dクラスでnew Scene3D、new Viewport3Dしてる。
ほんとにすごい変わったなぁ

asdocもRevision677で出力しようとするとXSLTエラーとかでて、生成されないし。
コマンドラインとか勘弁してよ。

Flash Player10用のPV3Dも出てますよ。


PV3D ReflectionView その2

ちょっと前に紹介したPV3DのReflectionViewですが、紹介だけでは悲しいので制作者さん(?)のサイトで紹介されているサンプルコードにちょっと追加してみたものと簡単な解説です。

サンプルSWF
(MTでSWF貼るのにいい方法ないだろうか)

で、続いてちょっと手を加えたサンプルコード。

WCAN mini AS vol.7行ってきたよー

WCANのイベント初参加です。

もっとも自分のやりたい方向+なんとか話についていけるんじゃないかと思われるAS miniです。
次回開催予定のDesignとかよりは遠くない。

内容はWCANとかのサイトを見ていただくとして、感想。

よかったです。
本当に楽しかった。

やっぱり、各スピーカーの方たちは次元が違うと思った。
(わらびもちの方とは違う意味で特に)

初参加な上に、予定になかった2次会への突然参加も許していただき、ありがとうございます。

また、多くの方に名刺も交換させていただいて、少しずつですがお話もさせていただいていろいろと参考になりました。

あとで気づいたんですが、プリントミスした名刺を抜くの忘れて持っていって、それを誰かに渡してしまった。受け取った方、申し訳ないです。
しかも、普通にインクジェットプリンタで印刷したものなので、たぶん、色移りします。気をつけてください。
なんか、「デザイナーさんですか?」ってすごい聞かれたけど、どうしてだろー?
デザインもちょっとするだけ、CSSだって書きます。
「デザイナーです!」と大声で言えるほど自信がない、Flash方面でがんばりたい、肩書きが必要ならクリエーターとしておきたい自分です。

名古屋AS会のTOPに君臨する(自分の中で)ll_koba_llさんにご挨拶できた。
もうなんかたぶん人種が違う。

参加前より、さらにASがんばろうという気になった。
まずは、つまらない動きの今のサイトのほうをリニューアルしないと。
今のところ、Webな人間だけど、AIRとかもやっておいたほうがいいのかなぁ・・・

ApplicationDomain

ApplicationDomain
前の続き

珍しく調べちゃいました。

といっても、ActionScript 3.0 のプログラミング を調べただけですが、簡単にまとめると下記の感じかな。

親と子のクラスを共存させたい場合
context.applicationDomain = new ApplicationDomain();
これは前のエントリと同じ指定。
これだと、親と子で同じクラス名で動作が違うとかでも共存できます。

親と子でクラスを共有したい場合
context.applicationDomain = ApplicationDomain.currentDomain;
この指定の場合は、親にないクラスが子にあった場合は追加され、その追加されたクラスは親からでも使える。(詳細

親と子でクラス共有だけど、子のクラスは独立
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
親と子でクラス名が重なる場合、親のものが使用される。
子のクラスを親は使えない。
これが何も指定しない場合と同じ状態な気がします。

こんなところでしょうか。

なんの打ち合わせもなく複数人でSWF制作したときなんかは、1の指定をしておいたほうがトラブルは回避できそうですね。


親SWFと子SWFと同名クラス

問題の発覚から解決まですべてをエントリするので、無駄に長いです。

親SWFから子SWFを読み込むFlash(だから、親子なんだけども)
当然、親と子のSWFを別々に制作するわけですが、
それぞれのSWF自体の動作は確認して完成!と思っていたら
どうも親から読み込んで表示したときの子SWFの動作がおかしい。

原因はライブラリに登録してあるMCのクラス名がかぶっていて、親と子でほぼ同じ動作なんだけど、微妙に違うっていう感じだったので、制作のときは同名のクラスをそれぞれ別のasファイルを参照するようにしていたんですが、親からLoader使って子SWFを読み込んだときだけ親クラスと同じ動作をして困った。

まぁ、こうなるんだろうから、これがFlashの仕様なんだろうけど、これがどういう仕組みなのかさっぱりわからない。

簡単に解決するなら、親か子のどちらかのクラス名を変えてやるだけです。
また、頭のいい人はどちらでも動作するようなコードを書けるんだと思います。
(今回のクラスの場合は、ROLL_OVER時に親SWFのドキュメントクラスにあるfunctionを呼び出していただけなんですが、当然、親と子では親にあるfunctionへのアクセス方法が変わる。なので、なんか頭いいコードで回避できる方法もあるのかもしれないけど、自分にはわからん!)

続きに解決編。


PV3D ReflectionView

Papervision3D 2.0 GreatWhite revision 641 でReflectionViewってのが追加されてる。

サンプルとか詳しいことはこちら。

まぁ、こーゆーの今までだと、自分で実装しないといけなかったので楽にはなるんだけど、
Effectとしての追加ならAppleとかみたいに、フェードアウトして表示されるオプションもほしいな。

こういう感じの↓
reflection_hope.gif

Papervision3D 2.0とGreat WhiteとEffects

1ヶ月ほどAS2のほうで仕事やってて、それも一段落して久しぶりにAS3の世界に舞い戻るのにPapervision3D触ろうと思って状況確認してみたら、EffectsがGreat Whiteのほうに統合されてた。

基本的には、それぞれのObjectのuseOwnContainerをtrueしてやればあとはDisplayObjectと同じ方法でfilterやらalphaやら使えるようになります。

p.useOwnContainer = true;
p.filters = [new BlurFilter()];
p.alpha = 0.5;

blendModeも使えるようなんですが、revision629だと、エラー出る。

他にもいろいろとEffectsから追加されているけど、getChildLayerとかよくわからない。
サンプルコードのコメントによるとオブジェクトが大量のときに使うと早くなるみたいなことが書いてあるけど詳細がわからない。

サンプルコードとか詳しいことはこちら

そろそろPV3DのASDocで出力しただけでない、まともなドキュメントほしいな。
できれば日本語で。

Papervision3D 2.0 Effects

Papervision3D 2.0 Effects

Papervision3D 2.0 Effectsのお話。

GreatWhiteにはできないと思われるPrimitiveなオブジェクト(というかDisplayObject3Dと MaterialObject3D)に直接フィルタ効果を適用できるバージョンってことでいいんだろうか。

GreatWhiteと異なる部分だけ解説。
(エフェクトかけるところ以外は完全に同じですが)

まずは、エフェクトの設定

effectLayer = new EffectLayer();
effectLayer.addEffect(new LayerEffect(new DropShadowFilter(distance, angle, color, dsAlpha, blurX, blurY, 1, quality)));
Filterの複数指定はaddEffectを指定すればよいだけ。

Viewport3Dにエフェクトレイヤーの適用

viewport.addRenderLayer(effectLayer);

各オブジェクトにエフェクトの適用

p.renderLayer = effectLayer;

詳しくはココ。


しかし、この方法、TweenerによるFilterのTweenができないんじゃないだろうか。
1.x系だとAS標準的なやり方でFilterの設定ができるのでTweenerで問題なさそうだけど。

なぜGreatWhiteとEffectsと分かれてるのかとか、1.7Betaがすでに2月から修正加えられていなかったり、Flash Player 10の登場でPV3Dもいろいろと変更が出てくるだろうし、どうなるんだろうか。

Flash Player 9対応の2.0だけはちゃんとリリースしてほしいところです。

あ、alphaもお願いします。
なんか方法ないかなぁ・・・

Papervision3D 2.0 と alpha

わ~か~ら~ねぇ~。

WORKSコンテンツでPV3Dを利用しようとして触り始めたPV3D 1.5。

ベースな部分はできたんですが、どうしてもPlaneに張ったテクスチャの歪みが気になるのでsegmentsの値を歪みを許せる値まで大きくしたんですが、ぎりぎり我慢できる値でも重い。

しかし、PV3D1.7だとPrecise~系のMaterialが追加されており、2.0だとMaterialそれぞれのオプションで設定できるものがあり、これを利用すると歪みが少なくなる。

ということで2.0用にASを書き換えていたんですが、今度は2.0でalphaプロパティの設定方法がわからない。
1.x系でいう下記のもの。

// Planeの場合
Plane.container.alpha = 0.5;

2.0だとPlaneなどのprimitivesクラスに直接addEventListenerできたりと1.x系に比べると、わかりやすくはなってるんだけどなぁ。

scaleやらは使えるのにalphaはどこいった?

Tweener 1.31.70

リリースされていますね。

eternity designでも1.31.69を使っています。

Filter関連でかなり機能追加されているのでおすすめです。

Tweener

MacMouseWheel

MacMouseWheelです。
リニューアル前から存在は知っていましたが、JSが絡んでくるという時点で何か面倒そうという意味不明な思い込みから後回しにしていましたが、導入しました。

やってみたら、あほみたいに簡単でした。


注意点は上記の配布サイトのものではIEでJSエラーが出て動作しないので、修正する必要があります。

こちらのサイトによると下記のとおり。

if ( !mac ) return null;

の箇所を

if ( !mac ) return {
    registerObject: function () {}
};

と修正。

あとはASのほうをちょいちょいと記述してやるだけっす。

FlashとThickBox

FlashからThickBoxを呼び出す方法。

以下、AS3の場合

// いろいろと省略してますよ。
package {
    import flash.external.ExternalInterface;

    public class viewThickBoxBtn extends MovieClip {
        public function viewThickBoxBtn() {
            addEventListener(MouseEvent.CLICK, clickBtnEvent);
        }
        private function clickBtnEvent(e:Event) {
            ExternalInterface.call("tb_show", thickBoxTitle, thickBoxUrl);
        }
    }
}

とExternalInterface.callでtb_showを指定します。
引数にタイトル、URL(画像やらHTMLや)と指定します。
URLの部分はHTMLでThickBox用のリンクを記述するときと同じものです。

tb_showには3つ目の引数もあるのですが、
こいつはたぶん、画像のグループ化です。
でも、SWFObjectなどを使って裏でHTMLのコードでThickBox用のリンクを記述しておかないと
動作しないんじゃないかなと思います。たぶん。試してないけど。

グループ化以外は普通にASに記述するだけで使えます。

また、Flashの上にHTMLレイヤーが置かれることになるのでwmodeの指定をしないとだめかと思われます。
wmodeを利用することの弊害も考える必要があるかと思います。


久しぶりにそれなりの内容のエントリでした。

AS3のTweenクラス

右にあるAmashをAS3標準のTweenクラスからTweenerに変更しました。

Amashの場合、商品のMCをクロスフェードで切り替えています。
同時に2個のMCのアルファがtweenされているのですが、なぜかそのtweenが途中で停止する現象が出ていました。
特定の商品というわけでもなく、必ず発生するというわけでもないので原因が不明です。
Tweenerではまだその現象は確認できていないので、Tweenクラス、またはその使い方に問題があるとは思うのですが。

同様の現象が上部のメニューにも出ていますが、こちらはブラウザでFlashを見ると、その発現率が落ちる。
(というか、一度も確認していないのですが)
開発環境では、頻発していたので、ますます謎。

モーションタイポとBitmap(AS3)

こちらの続き。

後日、ASのどの処理の箇所で重くなっているのか調べてみたらcopypixelsの箇所でした。

これでAS3でやれば軽くなる確信を得たので(その根拠は?といわれると困る)AS3化してみることに。

で、コレ

ASで生成したテキストフィールド、それを別のMCにDrawしたものはそのまま表示させています。

1x1のMCの数は約1400個。
前回のエントリの25ptのほうが同じような数のMCなので、AS3すごい!
初めてAS3のすごさを感じました。

以下スクリプト。

addEventListenerとfunctionと引数

AS3に限らないとは思いますが、addEventListenerに指定するfuncに引数を使えるようにする方法です。
この方法でないといけない理由はないとは思いますが、まぁ、便利なので。

addEventListener(MouseEvent.CLICK, func(a));
private function func(a:Type) {
    return function(event:Event) {
        // うにゃうにゃコード
    }
}

どうもサンプルというか例のコードとしては書き方がよくないですが、そのあたりは脳内で補完してやってください。

で、これで引数渡せるのですが、これを利用したaddEventListenerはremoveができない。

何か方法ないかなぁ。

AS3でのsetIntervalは?

AS3で制作するときにAS2からいろいろと変わりすぎてて、AS2からAS3に記述が変わったかどうかを確かめる→プログラム書く→調べる→書くという感じの流れになっております。

なんだか効率悪いような気もしていますがどう変わっているのかわからないから仕方ないのかな~。
とりあえず、必ず見るページ

LiveDocs検索が機能していないのは早く修正してほしい。
PDF版がほしい。

で、本題。

今回はAS2ではsetIntervalとしていたものがAS3では?というお話。

var timer:Timer=new Timer(duration,0);
timer.addEventListener(TimerEvent.TIMER, func);
timer.start();

durationがミリ秒指定です。
funcが指定間隔で実行する関数の指定。


AVM2MovieとAVM1Movie

AVM2Movie(AS3で書かれたFlash)からAVM2Movieをロードした場合、親のSWFから子のrootを参照するにはLoader.contentを利用します。

ただし、親がAVM2Movieで子がAVM1Movie(AS2orAS1)の場合、参照ができないようです。
ここに書いてあることを自分なりに解釈するとたぶんそーゆーことです。

しかし、このリファレンス使いにくい。
まず検索が機能してないですよね?

AS3でムービー全体のプリローダー

ActionScript 3.0でムービー全体のプリローダーです。
ムービー全体というか、rootというか、ムービー自体というか。

PreLoader.asファイル

package {
    import flash.display.MovieClip;
    import flash.events.*;
    import flash.display.LoaderInfo;

    public class PreLoader extends MovieClip {
        // プライベートインスタンス変数
        private var totalBytes:uint;
    
        public function PreLoader()  {
            totalBytes = this.root.loaderInfo.bytesTotal;
            addEventListener(Event.ENTER_FRAME, loadEnterFrame);
        }

        function loadEnterFrame(eventObj:Event) {
            if(this.root.loaderInfo.bytesLoaded == totalBytes) {
                // ロード完了
            }
        }
    }
}

ライブラリに適当にMC作ってプロパティのクラスに"PreLoader"を指定。
MCを配置して完了です。


AS3でenterframe

ほぼ自分用メモ。

AS2では以下のように記述していたものですが、

this.onEnterFrame = function() {
    // 処理
}

AS3では、

addEventListener(Event.ENTER_FRAME, myEnterFrame);
function myEnterFrame(eventObj:Event) {
    // 処理
}

という感じになります。

ActionScript 3.0

Flash CS3も入手したので、ActionScript 3.0の勉強を始めました。

とりあえずは、実際にFlash作らないと理解できないだろうということで、このサイトの上部メニューをAS3化してやろうと思ったのですが、いわゆるプリローダーでいきなり壁にぶち当たった。

AS2で外部asを利用する場合、ライブラリのMCやらのクラスに直接指定するのは嫌いでして、ほぼ必ずimportしてからクラスのインスタンスを作成して。。。という感じでやっていたのですが、AS3で同じ方法でroot(ムービー全体という方がわかりやすいかな)のbytesTotalの取得方法がわからない。

this.root.loaderInfo.bytesTotal

ライブラリのMCにクラスを指定した場合は上記の記述で取得できるんですが、インスタンス経由(というのか?)だと「TypeError: Error #1010: 条件は未定義であり、プロパティがありません。」と言われます。


まだAS3触り始めたばかりですが、AS2に比べてなんだか変に難しくなっちゃってる感じがします。
AS2以前でいう_rootの参照も、this.rootとかなんか面倒だし。

FuseKit使って楽になるので感動していた自分には合わないよう気がしています。


CS3

届きました。
DESIGN PREMIUMにしました。

AS3のドキュメントがないです。

現時点だとこのあたりだけなのかな。

ActionScript 3.0 Language and Components Reference

Programming ActionScript 3.0

Using ActionScript 3.0 Components


日本語のドキュメントが無いです。

いつ公開なのかなぁ。

2007.06.23追記
日本語版公開されていますね。

ActionScript 3.0のプログラミング

ActionScript 3.0コンポーネントリファレンスガイド

ActionScript 3.0コンポーネントガイド

AUTHOR

名古屋でひっそりと活動中。
ホームページ制作、Flashコンテンツ制作など制作依頼がありましたらお気軽にご連絡ください。
ご希望の方には制作実績も同時にお伝えいたします。

TAG CLOUD