メイン

Flash アーカイブ

2006年08月31日

リサイズハンドルをつけたMCのサンプル

先日作ったFlashをちょこっと修正して恥ずかしげもなく公開。
ソース汚くても、かっこわるくても別にいいや。



縮小方向へドラッグするとちょっとおかしいけど、まぁ愛嬌ってことで。条件判定がおかしいんだろうけど、もういいや。背景画像は特に意味はないです。

単純にリサイズするのは簡単だけど、リサイズハンドル(矢印)がちゃんと追従するってのがポイントかな。

もっとスマートな作りかたがあったら教えてください。
(あ。カーソル変更したほうがよかったかな・・)

ソースはコチラ(marking.zip)
Flash 8で作ったけどMXでもOKのはず。

2006年09月21日

ソロモンの鍵 高速クリア

すばらしい。小学校5〜6年のころ、お年玉でこのソフトを買ったので、よく覚えてる。45〜6面あたりまでは自力でいけたんだけど、さすがに小学生にはむずかしかったと思う。

↑の動画は、エミュを使って、攻略してるんだろうけど、けっこう微妙なテク(敵のあたり判定ギリギリで避けるとか)があって、驚いたけど、まぁ、普通にプレイする場合は絶対無理だなって感じ。

でも、懐かしくて、30分弱の動画を、忙しい中、ぼーっと観てしまった。

感慨にふけってしまうってことは、それなりに年を取ってしまったってことかなぁ。

「懐かしい」というのは、やっぱりいいモノだけれど、なにが懐かしいというのは、個人的な思い入れがあればあるほどいいわけで、たとえば、山笠の動画が有ったとしても、今年の山笠より、20年前の山笠の動画のほうが、懐かしいと思うわけで、パーソナリティに依存するコンテンツというのは、やっぱり難しいなぁとか思うわけで・・。

2006年09月27日

ブログシールとか

タロアウト氏制作のブログシールのテスト


・・・・・で?


各CUBEを車が行き来するのはわかったけど、、、???
セミナーで構想を聞いたときはすげぇ面白そうだけど、実際使ってみると、退屈かもなぁ・・

そもそも、ブログシールに求められるものってなんだろうか。
個人的には観賞系は、向いてないと思うんだよねぇ。そもそも自分のサイトを恒常的に見てる人っているのだろうか。

となると、やはり「読みに来た」人向けのコンテンツでなければならない。
検索エンジンから流れてきた、いわゆるイチゲンさんが愉しめるものがいいだろうなぁ。なんだろうなぁ。ドリコムでフィードを表示させてるサイトが山ほどあるけど、正直、好きではない。スパムぽいし。

なんかないかな。

2006年11月22日

すごすぎて悔しいflash

ROXIK | PICTAPS

すごい。むちゃくちゃ面白い。
で、技術的にもそうとうすごい。

仕事する気がおきないくらい悔しい。


しょうがないので自分でも描いた。

ROXIK | PICTAPS
ROXIK | PICTAPS

やっぱり面白いし、すごい。


くっそぉぉ〜〜〜〜〜〜〜〜〜バーロめ

2007年01月16日

FLV表示について

FlashでFLVを表示する時のメモ。

Flash中でFLVデータを表示する方法はいくつかある。

1)MediaDisplay + MediaControllerコンポーネントを使う方法

 利点:簡単。見た目もそう悪くない(よく使われているUI)
 欠点:UIを変更できない。UIまわりのイベントを制御できない。
 
2)MediaDisplay + 自作コントローラを使う方法

 利点:UIは自分のすきなものにできる。イベントを細かく制御できる。
 欠点:コントローラ部分のハンドリングを全部書かないといけないので、非常に面倒である。
 
3)FLVPlayBack + 標準スキンを使う方法

 利点:UIの配置を替えられたり、デフォルトでいくつかスキンがあるが、、デザインがもう一つ。ただし、スキンのURLを指定できるので、スキンをちょくちょく切り替えたい人には便利。またはそういうサービスとか。
 欠点:Player8以上が必須。

4)FLVPlayBack + 自作スキンを使う方法

 利点:コントローラのハンドリングをコーディングする必要がないので、楽ッちゃ楽。
 欠点:スキン作成のルールを覚える必要あり。Player8以上必須。細かいイベントの制御・ハンドリングはできない。あくまで、UIのカスタマイズ向けという感じ。

3・4の共通の問題として、たとえば、シークバーをドラッグしても、無視されるなどの動作を、変更することができなかったり。
スキンにより見た目を代えることはできないが、デフォルトのパーツの動作を代えることができないのは結構ストレスが溜まる。

結局、2番の、UIもコントローラも自作するのが一番かな・・・。


2007年03月10日

ExternalInterfaceにハマる

Flash8から、標準でJavaScriptとswfが通信するための機能が付いている。

ExternalInterfaceである。
これを使えば、JavaScript中から、swf中のActionScriptの関数をコールしたり、逆に、ActionScriptから、JavaScriptの関数をコールすることができる。

使い方については、ドキュメントがそこそこあるのでここには詳しく書かないけれど、、これが、なぜか変な挙動で、ものすごくハマる。

現象としては、swf中で設定したJavaScript用のコールバック関数が、Firefoxに限って、JavaScriptからコールできないのである。

ネット上で調べた限り、Safari,Firefoxでは動くが、IEでは動かないという症状はたくさんあるが、Firefoxでは動かないというものがない。


IEやSafariでは動いているので、ActionScriptや、JavaScriptには問題ないと思われる。firebugでトレースしてみるも、やはりswfオブジェクトにコールバック関数が登録されてないような挙動である。うーん。分からない。

キャッシュの線かと思ったが、cacheをdisableにしてもダメ。

ActionScript中からのcallback処理は、trueが返ってきてるので、関数の登録は正常に行われてるはず。実際、IEやsafariからはコールできてるし。

なぜ、firefoxだけダメなんだろう。

firefoxに潜在的なバグがあるのか、、、と思いきや、ExternalInterfaceのチュートリアルを掲載してるサイトをfirefoxでアクセスすると、正常に動いている。

うーん。くやしい。どうして3行たらずのコードが動かないのか。


例えば、にゃあプロジェクト - ウェブログ - ExternalInterfaceを使ってみる (3)

は、こちらのfirefoxでアクセスしてもちゃんと動く。

firebugのコンソールで、

swfTarget("externalInterface").setMenu

と入力すると、ちゃんと
function()

と返ってくる。

しかし、こちらで作ったものだと、

swfTarget("externalInterface").setMenu is not a function

と、なるのである。
しかし、IEやsafariではちゃんと動く。謎だ。謎すぎる。なにが違うのか。

まったく分からない。だれかたすけて〜〜!

【解決!】ExternalInterfaceにハマる

わかったぞぉぉぉっぉおおぉおお!!!!

やぁあああっとわかった。原因が。

ExternalInterfaceにハマるにて、Firefoxのみ、ExternalInterface.callbackで登録した関数をコールできない原因(not a function になる)が。

HTML,JavaScriptの編集は、Dreamweaver8で行っている。
当然、swfを挿入すると、IEのクリックしないとアクティブにならないやつに対処するための、AC_FL_RunContent()というのが、自動的に挿入される。つまり、Objectタグ、embedタグを動的に出力して、それを回避するのである。

ExternalInterfaceを動かす場合、html中に挿入したswfに対して、
objectには、idを、embedにはname属性を付け、その名前を用いて、swf中の関数にアクセスする。例えば、

thisMovie('fla').fla_func();

(※thisMovieについては、このあたりを参照されたし)

で、AC_FL_RunContentを使うと、

<object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" name="fla" width="200" height="200" id="fla" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" > <param name="movie" value="example.swf" /> <param name="loop" value="false" /> <param name="quality" value="high" /> <embed name="fla" width="200" height="200" id="fla" src="example.swf" loop="false" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" ></embed> </object>

といったコードが生成される。
これがガンだったのだ。(※noscriptの中も同様)

AC_FL_RunContentでは、objectタグに、idとnameの両方が設定されてしまい、これがFirefoxでは問題となるようだ。

FIrefoxにおいては、objectタグには、idを。embedタグにはnameをだけを設定しなければならないようだ。(IE,Safariでは重複していてもOK)


ならば、AC_FL_RunContentを使わなければいいのか?といえば、object/embedを動的に出力しないとIEでswfがクリックされるまでアクティブにならないという問題を回避できない。

解決策としては、
1)AC_RunActiveContent.jsを改造し、objectにはidを、embedにはnameを出力するようにする。
2)AC_FL_RunContentの代わりにSWFObjectを使う。

SWFObjectはAC_RunContentより高機能だけれど、いちいちコードを書くのが面倒だしなぁ。。
AC_RunContentで足りてるっちゃ足りてるので、こちらを修正する方向で考えよう。

参考サイト
にゃあプロジェクト - ウェブログ - ExternalInterfaceを使ってみる (3)
Adobe - デベロッパーセンター : 外部APIを使用したFlashとJavaScriptの接続
第35回 FlashムービーとJavaScriptを連携させてみよう:ITpro

2007年03月14日

display:none状態ではExternalInterface不可

先日から、JavaScriptからswf中のactionscriptを呼び出す処理を作っていて、何故かFirefoxのみ、関数がコールできないという現象にハマる。

結果的に、AC_FL_RunContent()から出力されたobject,embedタグに付けられるid,nameが正しくマッチしてなかったというところにたどり着き、AC_FL_RunContent()内の処理を修正することで対応。

しかし、さらにトラップが仕掛けられてあった。

そのObject,embedで埋め込まれているswfのブロックの非表示(つまり、CSSでdisplay:none)になってると、ActionScript内の関数をコールできないのだ。

DOM的には存在してるブロックなので、単に表示されてないだけなのは別に問題ないとおもったら、そうはイカの外套膜。

例えば、まずはswfが入ってるブロックが表示されてる状態でページが表示されたとする。
このタイミングでは、swf内の関数にアクセス可能。

swf内の関数(ExternalInterface.calback()に登録された関数ね)にアクセスできたのを確認して、swfが含まれるブロックを、display:noneしてやると、あら不思議。その状態では、swf内の関数にアクセスできないのだ。

これは明らかにブラウザの挙動がおかしいと思う。

だって、display:noneは単に見た目の問題で、DOM的には存在してるから。


まぁ、でもブラウザがそうなってるんだったら、我々下僕はそれに従うしかない。


ActionScriptとJavaScriptで相互に関数をコールできるのは、両方のオブジェクトが存在するhtml中において大変便利。

しかし、罠が多いので気をつける必要がある。

以下の2点に気をつけるべし。

【問題1】マクロメディアのデフォルトのAC_RunActiveContent.jsを使ったAC_FL_RunContentにてObject/Embedを出力すると、ID,Nameの都合で、FirefoxがExternalInterface.callback()で登録された関数にアクセスできない。

【対策】AC_RunActiveContent.jsを修正し、Objectタグには、IDを、Embedタグには、Nameを割り振るようにする。
※Objectタグに、ID,Nameの両方が付いてるとダメ
または、SWFObjectなどを用いて、Object,Embedタグを出力する。(コチラは試してないので、誰かよろしこ)


【問題2】
ExternalInterfaceにてアクセスしたいSWFが入ってるブロック要素が、display:noneにより、表示されてない場合、ActionScript側にアクセスできない(not a functionとなる)

【対策】
display:noneしない。それしかない。
しかし、最初は非表示で、どこかをクリックしたタイミングでSWFが入ってるブロックを可視可(display:block)し、同時にSWF内の関数にアクセスする必要がある場合、JavaScriptのsetTimeoutなどを用いて、タイミングをズラしてアクセスする必要がある。僕が試した感じでは、ブロック要素が表示されて200msecくらい後じゃないと、アクセスできないみたい。
(この辺はswfの中身や、クライアントサイドのPCの負荷にもよると思う)


同じような問題で悩んでる人がいるとは思えないが、まぁ、1人でも2人でも参考になれば。

About Flash

ブログ「Nega Diary」のカテゴリ「Flash」に投稿されたすべてのエントリーのアーカイブのページです。新しい順番に並んでいます。

前のカテゴリは2chです。

次のカテゴリはMac・FileMakerです。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type