ECMAScript準拠だからコード周り以外のコツさえ掴めば余裕ですよねー。とか思ってたらエライつまづいたので、備忘録も兼ねてメモ。
なお、製作にはFlash8+外部エディタを利用している。
1行目にthis
サンプルでソースの一行目からthis.****って書いてあって数秒思考停止したんだが、なんのことは無い。ただ単に_rootのことだった。
_root≒windowだと思いねぇ。
絶望した!正規表現が使えないAS2.0に絶望した!
RegExp class for FlashからRegExp.asを落として
#include "RegExp.as"
var str = "aabbcc12345ccbbaa";
var r = str.replace( new RegExp( "[a-z]+", "g" ), "@" );
trace( r ); //@12345@
onMouseDown
適当にムービークリップ作成。onMouseDownでマウスボタン押した際に色々実行させようとしたら、ムービークリップ領域外でも発生した。
小一時間ほど悩んだ結果、onPressというハンドラがあるらしく、onPressは領域内で押したとき、onMouseDownはステージ上、つまりFlash全体で押したときに発生するらしい。
・・・いや、領域外で取得したかったら_rootに設定すればいいと思うんだが、なぜに?
onDblClick
mc.onPress = function( ) {
var time = ( new Date ).getTime( );
if( this.lastPress && time - this.lastPress < 300 ) {
if( this.onDblClick ) this.onDblClick( );
}
this.lastPress = time;
}
こなかじ?
ライブラリに入れた画像が荒い
プロパティを開いて画質をロスレスにする。
マウス乗せた時のカーソルを指にしたい
mc.useHandCursor = true;
mc.onRelease = function( ) { };
onReleaseもつけないとダメってどっかに書いてた。
ムービークリップ ≠ Div
paddingもmarginもないのでposition:absoluteだと思って絶対配置。
_widthと_heightを操作して余白を確保しようと思ったら内容物全てが拡大された。
画像読み込んだら_widthと_heightが画像のサイズに合わせられた。
ムービークリップ1つにつき画像を1つしか読めないので、敷き詰めたかったらそのつどムービークリップを作らねばならない。
ムービークリップの大きさが変更できない
中になにもないとダメらしいので
mc.beginFill( 0xFFFFFF, 100 );
mc.moveTo( 0, 0 );
mc.lineTo( 100, 0 );
mc.lineTo( 100, 100 );
mc.lineTo( 0, 100 )
mc.lineTo( 0, 0 );
mc.endFill( );
こんな感じで塗ってやると大きさが100×100になるので、後は_widthと_heightを弄る。
asfunctionおかしくね?
asfunction≒javascript:だと思いねぇ。
apeirophobia: asfunctionの罠で解決。小一時間ハマった。
scrollPaneにムービークリップを入れられません><
blog.shimatch.jp : ScrollPaneコンポーネントで解決。外部swfか画像かシンボル入れろ、と。小一時間ハマった。
付属のヘルプよかマシなのを期待してたら・・・多少はマシだが、期待してた俺がバカだった。ってゆーかJavaScriptで作るなよ。しかも重いし。
公式がこれなので、どこぞにナイスなリファレンス本が無いか探索中。
Info
- 投稿日
- 2007年9月25日
- タグ
- flash
- このエントリの固定リンク
- http://diary/log/1557.html
- ブックマークに追加する
-
- コメント
2007
0925
Tagsflash
Flashのストレージが動かないと書いたが、状況を整理してみる。
まず、テストページは動作する。
| ブラウザ |
save2local.js |
storage.js |
| IE |
○ |
○ |
| Firefox |
○ |
× |
| Opera |
○ |
× |
これらをダウンロードして組み込み、ホスト上で動かすと動作しない。いや、正確には動作したりしなかったり、だ。何がトリガーとなって動作するかがわからない。
一応、最小構成で動作させると動いた。
そもそも、FlashとJavaScript間で直接通信するのはExternalInterfaceというらしく、これが働いていないおかげで、結果としてFlashのストレージが機能していないようだ。
というわけで幾つか策を練ってみた。検証には3ブラウザで動作したsave2localを使用する。Flashのバージョンは全て9.0.16.0だ。
DOMの汚染
真っ先に思いついたのがコレ。特殊なアプリに組み込んでいるから動作しないのではないか?
そこで、最小構成で動作するページを用意し、そのページをIFrameで呼び出し、
document.getElementById( id ).contentWindow.save2local.saveData( key, value );
こなかじに直接引っ張ってみる。
結果:失敗
まさかIFrame内まで汚染するというのか!? と思ったが、さすがにそれはないだろう。だとすると他の原因があるはずだ。しかも、動作したりしなかったりしていたということから見ても、ほんの少しの違いで動作するようなもののはずだ。
JQueryを外す
結果:失敗
とりあえずやってみた。期待はしていなかったが。
ぐぐる
同様にハマってそうな上記2エントリを発見。試しにexternalやらAllowScriptAccessを付けてみた。
結果:失敗
ウボァー
ムネンアトヲタノム
全っっっ然わからん。俺が扱うには経験値が足りなかったということか。つーわけで素直に諦め・・・ようとしたところで動いた。一箇所直しただけで。それを元に戻す。・・・動かなかった。まさか、これで確定?
テストページ
つまり、こういうことか。
Flashがdisplay:noneになっていると、ExternalInterfaceが動作しない・・・っ!
考察
なぜにdisplay:noneだと動作しないかというと、まずCSSが読み込まれて、Flashを入れるdivにdisplay:noneが設定される。
display:noneが設定されている場合、その中の要素がsrcで何がしかのソースを指していたとしても、どうせ見えないんだからとブラウザ側はダウンロードしようとしない。
つまり、ExternalInterfaceしたくてもFlashそのものが読み込まれていなかったんだよ!
動かなかった原因は明らかにこちら側のミスだったわけであり、そしてこの諦念・・・
・・・でも、それだったら、display:noneな中にFlashを指定して、FlashVarsで渡したものが動作する理由がわからん。
それに、後からdisplay:noneにした場合、既にFlashは読み込まれているから動作すると思ったんだが、動作しなかった。なぜに。
とりあえず分かったのは、noneにしなけりゃ動くっぽいことか。
先生、事件です
IEで動いたり動かなかったりしてる。
新しいタブで開く。⇒動く
↓
F5で更新。⇒動かない。
・・・なぜに初回のみ動くのだ。ってInternetExplorerなら問題無かった。Sleipnir 2.5だと初回のみだった。
あと、IEはdisplay:noneとか関係無しに動いた。さらにわけが分からなくなる。
補足
AllowScriptAccessを設定すると、値によって動作する環境が変化する。
always: ActionScript による JavaScript の呼び出しを常に許可します。
sameDomain: SWF と HTML ページのドメインが一致する場合にのみ、ActionScript による JavaScript の呼び出しを許可します。
never: ActionScript による JavaScript の呼び出しを常に許可しません。
Adobe - デベロッパーセンター : Flash Player 8 のセキュリティ機能の変更点
デフォルトはhttp://上でないと動かないので、恐らくsameDomainだと思われる。
save2local.swf.addParam("AllowScriptAccess", "always");
このようにalwaysを設定してやると、IE以外はfile://な環境でも動作した。
と思ったら
同じテストファイルをPC変えて動作させたら全ブラウザがローカルで起動しなくなった。Flashのバージョンは同じなんだが・・・
疑問
上記の方法ならばstorage.jsのほうも同じ方法で動くはずだと思ったが、動作せず。
storage.jsはテストページの時点でIEしか動作しなかったので、IE専用かと思ったが、IEもだめだった。当然display:noneは設定していない。なぜ・・・
戦い終わって ~神々の黄昏~
レイアウトが崩れるのを避けるためにdisplay:noneにしていたのが、そもそもの間違いだった。というわけで、width:0、height:0で適当な場所に転がす。んむ、動作した。
ExternalInterfaceの動作条件にはまだ分からない部分があるが、とりあえず使えるようになっただけでも大きな一歩か。だがあまりにも不安定すぎる。なんなんだこれは。
Info
- 投稿日
- 2007年3月8日
- タグ
- flash、javascript
- このエントリの固定リンク
- http://diary/log/1516.html
- ブックマークに追加する
-
- コメント
2007
0308
Tagsflashjavascript
Cookieによるデータの保存は容量が少ないのが欠点で、それを解消する為にFlashを利用してローカルとデータをやりとりするものなんだが、最小構成にしようが何しようが全く動かん。
if( navigator.appName.indexOf( "Microsoft" ) != -1 ) {
return window[name];
} else {
return document[name];
}
両スクリプトともこの部分で引っかかってるようなのだが原因がさっぱりわからん。唯一save2local.jsのテストページだけは動作したが、Firebugでゴリゴリ掘っていっても原因が掴めず。つーか、テストページ丸ごと保存してローカルで動かすとやっぱり反応しないし。ちゃんと設定パネルでセキュリティは大丈夫なようにしてるんだがなぁ・・・
で、ぐぐってみても動かないという話が見当たらない。・・・一体どこが悪いんだ。
Info
- 投稿日
- 2007年2月23日
- タグ
- flash、javascript
- このエントリの固定リンク
- http://diary/log/1513.html
- ブックマークに追加する
-
- コメント
2007
0223
Tagsflashjavascript
XBOX360のゲームはFlashで開発できるっぽい
ぬなー!?
- プレイヤーはFlashPlayer6ベース
- XBOX360本体の機能を呼び出せる、独自FSCommandを実装
- コントローラー入力はそのまま、キーボードのABXYとかカーソルと対応
- アニメ再生機能は完璧、スクリプトの解釈は癖がありハングしやすい
- 再生速度は十分に早い
アニメ再生が完璧ってことは、既存のものをハイデフ鑑賞とは言わないまでもTVスケールで鑑賞できるってことか。本体の機能を呼び出せるのでゲーム、ムービーだけじゃなくちょっとしたアプリっぽい真似も可能・・・むぅ、やるじゃんゲイツ。今後の動向次第では食指が動くかも。
Info
- 投稿日
- 2006年1月10日
- タグ
- flash、game
- このエントリの固定リンク
- http://diary/log/1288.html
- ブックマークに追加する
-
- コメント
2006
0110
Tagsflashgame
Flash でクリップボードにコピー
先日あるものを作っていたところ、クリップボードに文字列を送る必要性が出てきたのだが、JavaScript経由でクリップボードに文字列を送れるのはIEのみらしいので、どーしたもんかと悩んでいたところ、これを発見。
FlashのSystem.setClipboardを利用すれば、他ブラウザどころかSafariでも動作する。素晴らしい。ただ、URLとして渡す際にescapeする必要があるのだが、その際に+が消えるようなので、他の文字列に置き換えて、Flash側で修正する必要がある。
あと、JavaScriptでクリップボードに文字列を入れるとセキュリティの警告が出るようになっているが(設定次第では出ない。デフォルトは出る。)、Flashだとたぶん出ない(出せるかもしれないが)ので、今作ってるものではちょっと有り難い仕様。
Info
- 投稿日
- 2005年12月23日
- タグ
- flash
- このエントリの固定リンク
- http://diary/log/1273.html
- ブックマークに追加する
-
- コメント
2005
1223
Tagsflash