12月 25

時間の処理には、trick7さんのTeraClockを使わせてもらいました。

キモは、

(TextArea).verticalScrollPosition = (TextArea).maxVerticalScrollPosition

だけです。

デバッグ用に、TextAreaに変数とかを表示させたいときに、スクロールバーが付いてこないと非常に見づらいので、上の1行を追加すると便利です。


Actionscript:
  1. package 
  2. {
  3.     import fl.controls.Button;
  4.     import fl.controls.TextArea;
  5.     import flash.display.MovieClip;
  6.     import flash.events.*;
  7.    
  8.     import com.trick7.utils.TeraClock
  9.     /**
  10.      * ...
  11.      * @author IRONHEARTS
  12.      */ 
  13.     public class Main extends MovieClip
  14.     {
  15.         private var _ta1:TextArea;
  16.         private var _ta2:TextArea;
  17.         private var _reset:Button;
  18.         private var _tc:TeraClock;
  19.  
  20.         public function Main():void
  21.         {
  22.             addEventListener(Event.ADDED_TO_STAGE, init);
  23.         }
  24.        
  25.         private function init(e:Event = null):void
  26.         {
  27.             removeEventListener(Event.ADDED_TO_STAGE, init);
  28.            
  29.             _ta1 = TextArea(getChildByName("ta1"));
  30.             _ta2 = TextArea(getChildByName("ta2"));
  31.             _reset = Button(getChildByName("reset"));
  32.            
  33.             _reset.addEventListener(MouseEvent.CLICK, resetHandler);
  34.            
  35.             _tc = new TeraClock;
  36.            
  37.             _tc.addEventListener(TeraClock.SECONDS_CHANGED, secListener);
  38.  
  39.         }      
  40.         private function resetHandler(e:MouseEvent):void
  41.         {
  42.             _ta1.text = _ta2.text = "";
  43.         }      
  44.         private function secListener(e:Event):void
  45.         {
  46.             var s:String = _tc.hours2 + ":" + _tc.minutes2 + ":" + _tc.seconds;
  47.            
  48.             _ta1.text += s + "\n";
  49.             _ta2.text += s + "\n";
  50.    
  51.             _ta2.verticalScrollPosition = _ta2.maxVerticalScrollPosition;
  52.         }
  53.     }
  54. }

ソース必要な人はドウゾつtascroll.fla,Main.as

Popularity: 7% [?]

written by ANN

12月 18

一つ前のエントリーの続きで、Flashでテキストエディタを作成中。編集したテキストおよびTextFormatをXML形式に変換して、サーバにPOSTし、保存する処理を作成中に、上記のエラーが発生。

Flash側からPHPへのPOSTについては、

AS3とPHPの連携 - 基礎 - memo.at sonic

を参考にさせてもらう。たしかに、load()でPOSTするというのには違和感を感じるが、これしかないのでしょうがない。(Socketベースで通信する場合はセキュリティポリシーファイル/サーバが必要でさらに面倒)


Actionscript:
  1. // テキストフィールドのフォーマットをXMLに落とし込む
  2.  var txtxml:TextField2XML = new TextField2XML(_targetText);
  3.  var v:URLVariables = new URLVariables();
  4.  v.body = txtxml.getXML();
  5.  var req:URLRequest = new URLRequest("ポスト先のURL");
  6.  req.data = v;
  7.  req.method = URLRequestMethod.POST;
  8.  var loader:URLLoader = new URLLoader(req);
  9.  loader.dataFormat = URLLoaderDataFormat.VARIABLES;
  10.  loader.load(req);

PHP側は、$_POSTで受信したデータをDBに保存する処理を記述。


PHP:
  1. $data = $_POST["body"];
  2. // ~DBに書き出す処理・省略~

で、FlashIDE上でプレビューしてみると、

Error: Error #2101: URLVariables.decode() に渡される文字列は、名前/値のペアを含む、URL エンコーディングされたクエリー文字列でなければなりません。

という、エラーが発生。おかしいなぁ。ちゃんとURLVariablesで値を渡していて、URLエンコーディングされたクエリー文字列が生成されてるんだけどナーと思い、悩むこと30分。

やっと分かった。

呼び出し時にエラーになってるんじゃなく、呼び出した後にエラーになっている。つまり、


Actionscript:
  1. loader.load(req);

で、呼び出すURLからのレスポンスが、key=value形式になってないとエラーになるのである。

しかし、POSTしても別にレスポンスを見ないケースもあるだろうにネー。

しょうがないので、php側でexitする前に echo "ret=true";とダミーのレスポンスを返すことにする。コレでエラーは無くなった。

TextField2XMLのソースは、まだ調整中なので公開できないけど、XMLの読み書きが完了したら、サンプルとして公開する予定。

それにしても、as3になってから、URLへのGET,POSTや、FlashVarsへのアクセスが煩雑になって面倒この上ない。だれかas2互換のラッパー関数とか作ってないかな。ついでにJavaScript互換関数とかPHP互換関数とかあると嬉しいな。

知っていたら教えてください。

Popularity: 18% [?]

written by ANN

12月 10

flash-texteditor1

JavaScriptベースのエディタは沢山あるが、最終的に編集した結果を画像として出力したいので、Flashで作ってみることにした。最終的に目指すのは、

●編集結果を画像(jpeg)として保存できるようにする。
●編集内容もMySQLに保存しておき、再編集できるようにする。

とりあえずは編集できるTextFieldと、フォント・サイズ・色の選択を作ってみた。

>>>>>続きを読む

Popularity: 6% [?]

written by ANN

10月 02

先日、とあるサイト内のFlashのデモを作成する。手元のマシン・ブラウザでは問題ないが、先方のPCだと、Flash部分が空白もしくは、1回だけ表示されるというような不安定な動作に。

ムービーとしては,A1.swf,A2.swfとファイルが2つあり、メインのswfが、その2つを交互に読み込んで再生。片方の再生が終わったら、もう片方を再生・・・と、特に難しいところも無いはず。

作成する時間が無かったので、loadMovieでswfを読み込んで、rootのonEnterFrameで再生フレームをチェックするという方法をとっていた。
手元では問題なかったので、そのままアップしたが、、なぜか先方では表示されないとの連絡あり。

Playerのバージョンの問題かと思ったがそうでもない。凝ったことはしてない故、原因が分からなくてしばしハマる。

nabeさんとSkypeで相談しながら、MovieClipLoaderに置き換えてみる。AS2.0はリスナーとスコープがAS3に比べてややこしいので、マンドクセ(´A`)手を抜いたのがトラブルの元だった。

MovieClipLoaderに修正したものは、先方のPCでもちゃんと表示された。
詳しく聞いてみると、以前のものでは、Flash部分が空白で、CPU負荷・メモリ消費も上がり、どうも暴走してるような感じだった・・・と。

詳しく検証してないけれど、この現象から想像するに、loadMovie後のフレームのチェックが、ロードが終わらないうちにやってしまい、正常に判断できず、(ロジック的に)次々のloadMovieされてしまい、無限にロードされてしまったような動きになったんじゃないかと思われる。

A1.swfもA2.swfもファイルサイズが小さかったので、ロードは一瞬で終わるだろうと高をくくっていたのがマズかった。
ロードが終わってないうちに次のロード、そのまた次のロードと、延々繰り返していたようだ。

ソースコードは恥ずかしすぎるので非公開です(///

教訓。

 忙しくても(手を抜いて)loadMoiveは使ったりしない。
 ちゃんとMovieClipLoaderを使おう!

Popularity: 23% [?]

written by ANN

7月 03

くぅー!まんまとハマってしまった...。

FlashPlayerのバージョンは8以降を対象にしようと思って、AS2.0でSWFを作成していた。その際、パブリッシュの設定でFlashPlayerのバージョンを8にするのを忘れて、9のままで作成していた。

作ってプレビューした時には問題なかった。その後、Playerのバージョンを確認したら9になっていたので8に設定してパブリッシュしたら、今まで削除されていたMCが削除されない!Playerのバージョンを変更した際には他にもいくつか変更していたので、原因の究明にとまどった。後でPlayerを9にするとちゃんと削除されるなーと思いながら、8でも削除されるように修正しなくちゃならないので、いろいろ調べたところ...

[FLASH CS3のヘルプ]より

メモ : バージョン2 のコンポーネントを使用している場合は、このメソッドを使用しないでください。ステージまたはライブラリにバージョン 2 のコンポーネントがあると、getNextHighestDepth() メソッドの戻り値が 1048676 になることがあります。この深度は、有効な値の範囲外です。バージョン 2 のコンポーネントを使用している場合は、バージョン 2 のコンポーネントの DepthManager クラスを必ず使用してください。

むむむ!attachMovie()するときにgetNextHighestDepth()使ってますよ。んで、削除しようとしているMCの深度を調べると見事に1048676。バージョン2のコンポーネント...、ああ、はじめ使ってました、今は使ってないけど...。何だよー、Buttonコンポーネントがライブラリにあるだけで、こんなことになるのかよー。

Buttonコンポーネントをライブラリから削除するとまったく問題なく削除された。こんな罠作るなよー...。

他の対処方法としては、getNextHighestDepth()を使っていて、且つバージョン2のコンポーネントがライブラリにある場合は削除対象のMCをswapDepths()を使って、-16383~1048675内の深度に再設定してremoveMovieClip()するか、removeMovieClip()を使わずにunloadMovie()を使う。

FlashPlayer9だと深度が1048676でも削除されていたのは、9の場合は有効な深度が広がっているってことかなー?

Popularity: 20% [?]

written by joy-pop

6月 05

[ActionScript3.0] Sprite/MovieClipとかをランダムに動かす(徘徊させる) | moriBlogさんの動きを使わせてもらって、ちょっと作ってみた。


※クリックしてください。

虫っぽいのが動いたあとに、軌跡を付けたかったんだけど、ビットマップとかマスクとかがいまいちわかってなくて挫折。
その辺が完成したらソース載せます。

Popularity: 19% [?]

written by ANN

6月 04

一つ前の[AS3.0]Yahoo ASTRA LayoutContainersを使ってフォント一覧パネルを作るに、フォントサイズを変更するためのスライダーを付け、ソース内の不要なコードを消した物を作りました。


直リンはこちら。font_pane2.swf

ドキュメントクラス(fontPane.as)と、ヘッダ部分(fontHeader.as)と、フォント一覧(fontMenu.as)と、プレビュー部分(fontRightArea.as)にて構成されているけれど、ポイントはBorderPaneを継承したドキュメントクラスなので、その部分のソースのみ掲載。(全ソースはページ最下部にてダウンロードできます)

>>>>>続きを読む

Popularity: 23% [?]

written by ANN

6月 03

Yahoo! Developer Network - Flash Developer Center - ASTRA Flash Componentsのコンポーネントって、結構便利と思うんだけれど、本家のドキュメント以外にほとんどドキュメントがない。

みんな自分でがりがり書いてるんだろうか。それともFlexだとちょちょいのポンなんだろうか。
素のFlashは、いわゆるGUIのコンテナとしての機能が低すぎると思う。

ということで、YahooのLayoutContainersを使ってなにかできないかーと考えていて、とりあえずフォント一覧を作ってみた。

フォント一覧であれば、別にYahoo LayoutContainersを使わなくても割と簡単にできるけど、Yahoo LayoutContainersを使う利点としては、

●レイアウトの変更を柔軟にできる。定番なものであれば、座標していせずとも、だいたいレイアウトできる。
●ステージの拡大縮小への対応が簡単。
●HTMLでいうところのDIVみたいな間隔で、まさにコンテナとして使える
●その他いろいろあると思うけど、また勉強中。

で、まだかなり完成度低いけど、できたのがこちら。

swf単体で開くと、リサイズにも対応してるのが分かると思います。
font_pane.swf

今回使ったのは、
・BorderPane
・HBoxPane
・VBoxPane
の3つ。

あと、フォントサイズの変更機能と、クラスのコードを整理したらソースアップしようと思う。
というか、Yahoo のコンポーネント使ってる人いないのかなぁ~

[ 追記 ]
スライダーでフォントサイズを変更できるもの+ソースを追加しました。
[AS3.0]Yahoo LayoutContainersでフォント一覧・改良&ソース

Popularity: 25% [?]

written by ANN

5月 29

昨日書いた[AS2.0]Tweenerを使ってチョ~簡単に彩度・明度・色相・コントラストを変更する!のAS3.0版だよ! ゆっくりしていってね!

まずは同じく結果のswfから。

AS2版と違うのは、値の変更がNumericStepperから、Sliderに変更になったこと。それによってコードもちょっと変わった。
しかし、実際、Slider使ってみると、コレ、かなり使い勝手悪いね。マウスが反応するエリアが小さいし、最小値・最大値、現在の値などの数値を表示させたい場合、手動でやんないとだめ。だれかもっと便利なスライダー作って~

AS2.0の時にあったバインディング機能があったら、超ラクなんだけどなー。なんでバインディングとかDataSetとか無くしちゃったんだろう。

上のswfのソースはこちら。

>>>>>続きを読む

Popularity: 52% [?]

written by ANN

5月 29

MovieClipのアルファ値は、そのままのプロパティがあるので変更は簡単なんだけれど、明度や色相・コントラストを変更したい!という場合、知ってる人は知ってると思うけど、知らないと結構大変。

実は超簡単な方法がある。Tweenerを使うのである。
まずは、AS2.0の場合を作っちゃうぞ!

さっそく、結果のswfをチェキラ!

数値を変更すると、上の画像の

  1. 彩度(saturation)
  2. 色相(hue)
  3. コントラスト(contrast)
  4. 明度(brightness)
  5. 明度(濃さ?)(tinBrightness)

を変更できます。

たとえば、グレイスケールに変換したい場合、彩度のNumericStepperをゼロにすると、簡易的にグレースケールに変更することができます(実際にはもっと調整した数値のほうが綺麗なグレイスケールにはるけどここでは省略。詳しくは
ColorMatrixFilterで画像をグレースケールにする(AS2.0)

明度(Brightness)と明度(濃さ)ではけっこう違う。実際にはtinBrightnessのほうを使いそう。

具体的な方法としては、Tweener 1.31以上から導入されたColorShortcutsを使うと超簡単です。
ライブラリのimport・初期化を除くと、1行でできます。

上記swfのソースは、

>>>>>続きを読む

Popularity: 66% [?]

written by ANN