カテゴリー別アーカイブ: プログラミング

AS3でのフルスクリーン時の座標その後

AS3でのフルスクリーン時の座標」でハマった件、実は中途半端だったことがわかりました。ということで追加のメモ書き。

気づきの発端は、せっかくオプションscaleをnoscaleにしているから、ムービーのサイズをHTMLで変更してやれ、と思って変更したことに始まります。

最初ムービーサイズを320×240で制作していたのですが、ビデオプレイヤーの作り上、サイズに依存せず、動的にstage.stageWidthなどで値を読み取って、レイアウトを可変するようにしていたわけです。よってHTMLでwidthとheightを変えれば、すんなり変わってくれるだろう、と思いました。

ところが、実際に変えてみると、640×480の領域の真ん中、320×240の領域に、640×480に拡大されたビデオの左上の320×240の部分だけが表示されてしまうのでした。

そこで、なにかオプションがあるはず、と思って探した結果、salignというオプションでTL(上端と左端にあわせる)という指定を加えることで、見事に640×480の表示がきれいにできました。やれやれ。

ではついでに、最大化も試そうと、最大化ボタンを押したところ、こんどはフルスクリーンには変わったものの、動画全体が左上からはみ出ているような格好になりました。

ピンときました。

フルスクリーン時に真ん中に来るのは、salignのデフォルトの中央配置が生きている時だけなんだ、と思いました。

HTMLでのsalignの指定は、stage.alignで読み取れます。stage.align==””のときには、無指定なので、真ん中に来ているから画面左上座標の補正をする、ってことでいいのではないでしょうか。

ということで、画面の左上、原点の座標(ox,oy)を求めるには、以下のようにする(あらかじめノーマル時のscreenWidth,screenHeightをnormalWidth,normalHeightに代入しておく)。

とりあえずTLで試したら、上記のやり方でうまくいきました。よかったよかった。他のsalignは試していません。

AS3でのフルスクリーン時の座標

またハマったわけではないけど、ちょこっとハマったので覚え書き。

Flashでフルスクリーンにするとき、通常であればステージ幅とステージ高さがそのままで、単純に全体を拡大して表示されるんですが、パブリッシュ設定で拡大縮小を無効に設定してからフルスクリーンにすると、ステージ幅とステージ高さは、最大化したスクリーンの画面サイズになる。

実はこうやって最大化したとき、画面左上いわゆるスクリーンの原点は(0,0)にならないのです。これでしばらくハマりました。で、調べてみると、オリジナルの画面を最大化した画面の真ん中に配置しようとするため、このようなことがおこるらしい。

ということで、画面の左上、原点の座標(ox,oy)を求めるには、以下のようにする(あらかじめノーマル時のscreenWidth,screenHeightをnormalWidth,normalHeightに代入しておく)。

フルスクリーンになったときや、ノーマルに戻ったときは、FullScreenEvent.FULL_SCREENイベントが発生するので、これをとらえたときに上記のように原点を求めて再配置すればよいんではないでしょうか。

なにをやってるか、っていうと、YouTubeみたいなプレイヤーを作っています。アニメーション全部を最大化すると、ボタンまででっかくなっちゃうのに、YouTubeの最大化は、ボタンの大きさは変わっていなかったので、いろいろ調べていました。

NetConnectionにハマる

今やっているプログラムで、ちょっとハマったので覚え書き。

NetConnectionクラスを使って、ビデオプレイヤーを作っています。

対象のデータがストリーミングサーバからの動画なのか、ローカルの動画なのかを判断しようと、NetConnection.uriメンバ変数を使おうとした。ローカルではconnect(null)とするため、uriはnullになるのではと思ってた。実際にtrace(nc.uri)とすると画面には「null」と表示されるので、何の疑いもなく「if(nc.uri==null)」と書いてた。

だけど挙動を見ると様子がおかしい。結果false。trace(nc.url+”,”+(nc.url==null))としてみると

null
false

ってなぜー!

ふと思ってtrace(typeof nc.uri)と書いてみると、なんとstringだと。nullになってたんじゃなくて、文字列の「”null”」が入っていた。なんじゃそりゃー。

「if(nc.uri==”null”)」と書き直したらうまくいった。どういう仕様だ。ぷんぷん。