ラベル Flash の投稿を表示しています。 すべての投稿を表示
ラベル Flash の投稿を表示しています。 すべての投稿を表示

2010-07-17

ニコニコ動画でswfファイルをうpするときのメモ

今回はじめてニコ動にswfをうpしたけれど、swfの場合は他の形式と違って、いくつか注意しないといけないことがあった。
とりあえず、基本的な仕様は以下のサイトを見ればすぐわかる。

SWFとは (スウィッフとは) - ニコニコ大百科: http://dic.nicovideo.jp/a/swf

ニコ動にswfを投稿するには、ニコニコムービーメーカー(以下、NMM)を使う必要がある。
投稿するだけなら無料版でも利用可能。

で、ここから、3つほど、自分がハマったこと。


1.サウンドの設定はストリーミングにする
サウンドはイベントサウンドがダメだが、設定をストリーミングにすれば問題ない。
設定はFlashCSシリーズなら配置したサウンドを選択後、プロパティで変更可能。

2.パブリッシュは、FlashPlayer9、またはそれ以下(ニコニコプレイヤーバージョンv4)
ニコニコプレイヤー以前に、NMMでアップロードしようとするとサーバーにはじかれる。

しかも、そのエラー内容が何も表示されないので、原因を探るのに苦労した。
インターネット社どうにかしてください(;^ω^)
FlashPlayer10でパブリッシュ出来ないということは、当然モーションプリセットは使えない。


3.「こいつ動くぞ」をサウンドでやってはいけない!
そもそも、ニコ動の、止めても「こいつ動くぞ」は、ステージのタイムラインしか制御しないというニコニコプレイヤーの仕様による副作用。
ステージ上にMovieClipをおき、そのMovieClipの中のタイムラインで動かすことで簡単に実現できる。
しかし、それと同じことをサウンドやることはオススメしない。

確かに、これをやるとニコニコプレイヤーで止めても、サウンドは確かに止まらなくなる。
しかし、2回目以降の再生、具体的にはサウンドのキーフレームまで戻るとそのサウンドは2重再生される
これは、ループ再生した場合やニコスクリプトやニワン語でタイムラインを移動した場合も適用される。
Flashはたしか32チャンネルあるので、最大32重再生…耳が死ぬw
もはやテロ動画…でも、こんな動画があげられること自体が問題な気がするんですけど…

2010-07-14

ニワン語でミク充動画作ってみた





ニワン語を使って、分岐する動画を作ってみた。
かなり癖があって、苦労した。
あとで調べたことをまとめおこう。

ちなみに、上の動画はコメントを入力しないと先に進まないので注意です。
なので、↓のURLで実際にコメントしてみてください。
【ニコニコ動画】ニワン語でミク充動画作ってみた

2010-06-03

Ribbon3Dで遊んでみた:wonderflのforkテスト

カメラ操作
・回転:ドラッグ
・平行移動:[Space]キー
・拡大:マウスホイール画面ドラッグで回転。

Flash 3Dの本に載っていたので使ってみる。

Ribbon3Dを作った人のブログ
http://blog.soulwire.co.uk/code/actionscript-3/papervision3d-ribbons

短いコードでこれだけ面白いの作れるとはなぁ。すばらしい。

ランダムな動きはTweener使ってます。

var ribbon:Ribbon3D = new Ribbon3D(マテリアル, リボンの幅, リボンの高さ);
container.addChild(ribbon);
こんな感じにマテリアル、リボンの幅、高さを引数にnewして、addChildするだけ。
あとは、描画時に
ribbon.draw();
とすればいいだけ。簡単。

2010-06-01

wonderflでPaperVision3Dを使ってみる

カメラ操作
・回転:ドラッグ
・平行移動:[Space]キー
・拡大:マウスホイール

注意)ブログ上だと、マウスホイールがブラウザ優先になる場合あり。
上のwonderflのリンク先で操作すると分かるかも。

ソースはこちら→http://wonderfl.net/c/e08v

wonderflの垢取っていたんだけど、まともに今まで使ってなかったので勉強の意味を含めて使ってみる。

とりあえず、PaperVision3Dも対応しているそうなので、カメラ操作するだけのやつを作ってみた。

wonderflでは、1つのFlashにつき、1つファイルのファイルで完結させないといけない。
そのため、1ファイルに複数クラスを書く必要が出てくる。
その場合、
package
{
   import flash.display.Sprite;

   public class TestFlash extends Sprite
   {
      // メインクラス
   }
}

// ここに他のクラスで必要なものをimport

internal class hogehoge {
   // hogehogeクラスの中身
}
ていう感じで書くといいらしい。

importがpackageで区切られているので、TestFlashとhogehogeで同じクラスが必要な場合でも、当然2回記述しないといけない。

・・・これなんとかなんないのかな(;´∀`)

2009-10-30

Funnel I/Oでフィジカルしてみた【Flash】

どうも、ゆとりです。



フィジカルコンピューティングをするにあたり、

どのハードウェアを使おうか、かなり前から悩んでいた。



悩んだ挙げ句、今回は、Funnel I/O使うことにした。

��>funnel.cc | Hardware / FIO



Funnel I/Oは、日本の方が開発されたボード。



「LilyPadを元に開発したArduinoコンパチブルボード」

ということで、ベースはLilyPad Arduino。

さらに、XBeeによる通信機能、USBポートを使った電力供給と充電機能がついている。



自分としては、無線は必須だと思っていたのでちょうどいい。

ArduinoからXBeeの通信をしようとすると、XBeeの本体とは別にシールド(拡張ボードみたいなもん)が必要となるので、めんどくさいと思って。



今回は、最初のセットアップとFlashからの制御テストをやってみた。



メインで参考にさせていただいたブログはこちら。

��>Funnel Set up! - labo

でも、ちょっと記事が古くて微妙に違っているところがあったのでちょっと補足。





[手順1] Funnel I/Oを手に入れる



特に部品については変更点なし。

ただ、Funnel I/Oは充電機能がついているはずなので、参考サイトに書かれている「リチウムイオン電池充電器」は購入する必要はない。



CA3C0183.JPG

▲左からFunnel I/O、XBeeエクスプローラUSB、XBee無線モデム。Funnel I/Oの縦の長さはつまようじ程度。





[手順2] Funnel用のドライバとかライブラリをダウンロードする



同URL

http://code.google.com/p/funnel/downloads/list

から「funnel_r698.zip」をダウンロード。

たぶん、これが今(2009/10/30)の最新版。





[手順3] XBeeを使えるようにする



これを行う前にやることがもう一つ。

「XBeeエクスプローラUSB」を使うにはドライバが必要なのでインストールする。

やり方は以下のサイトで確認。

��>XBeeで無線通信!(4) -



使用するソフト「X-CTU」は、正確には、こちらのURL

http://www.digi.com/support/productdetl.jsp?pid=3352&osvid=57&s=316&tp=5

の下段にDLリンクがある。



この手順でやっていることは、要するに、無線モデムへのファームウェアの書き込み。

2つのXBee無線モデムに親機用設定と子機用設定のファームウェアを書き込む。





[手順4]Funnel I/OとXBeeエクスプローラUSBの設定



参考サイトの解説のまま。



aea81fa4.jpg



CA3C0188.JPG





[手順5] Funnel I/Oの電源を入れてみる



ここで、充電池を装着した状態でUSB(A-miniB)に接続すれば、自動充電を開始する。



なお、参考サイトにも書いてあるように、このUSBは電力供給専用。

USBによる通信は機能しないので、無線でプログラムを書きこみを行う。



CA3C0193.JPG

▲オレンジのランプ(CHG)が充電中。充電が終わると自動で消灯する。





[手順6] Funnel I/Oに設定ファイル(スケッチ)をアップロードする



同URL

http://arduino.cc/en/Main/Software

から「Arduino 0017」をダウンロード。



参考サイトでは「Arduino 0012」なので少し違う。

「Tool→Board→Arduino Pro or Pro Mini (8 MHz)」はないので、

代わりに、「Tool→Board→Arduino Pro or Pro Mini (3.3v, 8 MHz) w/ ATmega168 」を選択する。



その他の作業は、全て参考サイトと同様。

これで、無線ネットワークから、プログラムをFunnel I/O本体に書き込む。





[手順7] funnel_serverの設定



参考サイトと全く同じ。

このサーバーを立ち上げることで、上位言語(ここではFlash)からFunnel I/Oを制御することが可能となる。

つまり、ブラックボックス。

ゆとりボックス。





[手順8] 動作確認



テスト用ファイルをFlash CS4で読みこんでパブリッシュ。

テストプログラムは、無線ごしに命令を送って、定期的にFunnel I/O内蔵のLEDを光らせるというもの。



window2.jpg

▲パブリッシュした結果のFlash



動画にしてみた。(ケータイ画質)





できたよ(∩´∀`)∩ワーイ







今後は、いろいろセンサをつけて、Flash側で抵抗値の変化を見れるようなものを作る予定。

フィジカルコンピューティングを始めよう

電子工作しようと思ったんだけど、

今はフィジカルコンピューティングなる便利なものがあるんだよね.



>>フィジカルコンピューティングとは - はてなキーワード



つまり、「電気・電子専門の人でなくとも簡単に電子工作出来るようにしよう!」ってことだと自分は理解している。



電子工作の敷居を下げる → 専門外のクリエイティブな層の人たちでもモノづくりができるようになる



というのが目的なんだよね。たぶん。



最近だとセカイカメラみたいな、ウェアラブルな方向性のモノが注目されてきている。

それは、iPhoneの普及とか携帯機器の高性能化とかが背景にあるんだろうけども。



あと、タンジブルビットのように、コンピュータへの入出力はキーボード、マウスだけじゃないとする考え方もある。



そういうのに対して、フィジカルコンピューティングってのは今後普及、活発化していく・・・ような気がする。





対応言語も特殊で、何故かAction Script (Flashを作るための言語)が対応している。

Flashの目的も、たぶん同じようなことだと思われる。

だから、フィジカルコンピューティングとの親和性が高いから対応になっているのかなぁと思った。





ということで、Flash対応が面白そうなので、電子工作はフィジカルコンピューティング的アプローチで攻めることにしますた。



でも、まあ、これって要はゆとり仕様ってことだよねw

ゆとり乙

2009-09-22

【機能美P】初音学校1+2【新作Flash】





��タ━━━━(゚∀゚)━━━━ッ!!



機能美P新作Flash!



この人の作品好きだなぁ。ホント、毎度のこと完成度が高くて驚く。



音と映像がそれぞれレベルが高い上に、

そのマッチングもハンパない。

つーか、はちゅねがかわいすぎw





ちなみ前作のアイマスネタは「ののワ眼鏡」発祥動画w







いずれ自分もこんなの作れたらなんて思うけど・・・センスが足りねぇorz

みんなオラに力を(以下略

2009-09-08

【Tweneer】終了のお知らせ

以前の記事でも書いたように、

Tweneerがver.1.33.74にアップデートしてるって書いたけど、

実は、これが最終バージョンだったらしい。



開発者さんのブログ:

Zeh Fernando » Blog Archive » Tweener, 4 years later - A post mortem



その日本語訳:

TONPOOBLOG>>Tweenerの終焉





・・・(´;ω;`)ブワッ



感動した







それに、現状のTweenerの限界も把握できた。

なにげなく使ってきたライブラリだったけど・・・

確かに、パフォーマンス面では、問題あるかもしれない。





つーか、AS2では、nullになってるオブジェクトのプロパティにアクセスしても怒られないとか、

どんだけ緩いですか・・・FlashPlayerたんw





開発者さんお疲れ様でした!

今までとてもお世話になりました!(これからも、しばらくはお世話になると思うけど・・・)







このライブラリがなかったら、今の自分はいなかったよ。たぶん。

それぐらいお世話になった。



本当にありがとう。

2009-09-03

Flash CS3(CS4)とFlashDevelopの併用

FlashDevelopでASのコーディングをして、

Flash CS3(CS4)でパブリッシュする方法。



一応、動画でやり方が紹介されているのを見つけた。

http://www.trick7.com/blog/video/flashdevelop/



忘れるたびに動画を見るのは億劫なので、c⌒っ゚д゚)っφ メモメモ...



0. FlashDevelopを起動し、F10を押す。

[Plugins] - [ASCompletion] - [Flash IDE] - [Path To Flash IDE]の項目に、

Flash CS3(CS4)のPathが設定されていることを確認する。

設定されてなければ、自分でパスを設定する。



1. FlashDevelopの[Project] - [New Project ...]を選択。



2. ActionScript 3 - Flash IDE Projectを選択。

プロジェクト名、保存先を指定してOK。



3. 右側のプロジェクトタブからプロジェクト名を右クリックし、[Add] - [New Class...]

メインクラスを作成。

このとき、メインクラスはMovieClipをサブクラスとする必要があるので、

とりあえず、Sprite継承にしておく。



3. Flash CS3(CS4)を起動して、[ファイル] - [新規...]

Flashファイル(AS 3.0)を選択してOK。



4. flaファイルをプロジェクトファイルと同じ場所に保存。



5. flaドキュメントのプロパティ内の[ドキュメントクラス](CS4では[クラス]と表記されてる)

に先ほど作ったメインクラスを指定。







これだけで、FlashDevelopからF6キーを押すだけで、自動でFlash CS3(CS4)が立ち上がり、

CS側からパブリッシュしてくれる。



コーディングは、FlashDevelopの補完機能が便利でウマウマ。

また、FlashDevelopはフォルダに追加したasファイルも自動で認識してくれるので、

asのファイル管理もウマウマ。



CSだと、asファイル、flaファイルの切り替えが面倒で・・・。

ドキュメントクラスでメインクラス設定すれば、

CSのライブラリ内のオブジェクトも使えるし、

まさに理想的環境!





追記:

ちなみに、AIRの自動補完をしたい場合。



1. FlashDevelopの[Project] - [Properties...]を選択。



2. [Compiler Options] - [SWC Include Libraries]を選択。



3. 以下のパスを設定。

  CS3の場合: C:\Program Files\Adobe\Adobe Flash CS3\

                             ja\Configuration\ActionScript 3.0 AIR 1.0\Classes\playerglobal.swc

  CS4の場合:C:\Program Files\Adobe\Adobe Flash CS4\

                            Common\Configuration\ActionScript 3.0\AIR1.5\airglobal.swc



4. 一応再起動。



CS3,CS4でパスが違うから注意。

2009-09-01

【DTX GDP】反省と今後の改善手点

DTX GDP.

個人的反省点を列挙.



【技術面】

・テーブルの正規化をなめてた

何度も正規化については,議論していたつもりだったが,まだ甘かった.

楽器別にテーブルを分けたために,後々になってIRページの算出時に問題が起きた.

さらに,SQL文も膨大になり,収拾がつかないことに・・・.

やっぱ,楽器でキーを割り当てて,全レコードを一つのテーブルに納めるべきだった.



・Flash → PHPの構造

勉強不足.結果的に,送受信のシステムはできたものの,かなり不安定なものだったかも.

そもそも,XMLを丸ごと送る構造でよかったのか?

別の方法で送った方が,問題がおきなかったかもしれない.



【対応面】

・対応が遅い

研究が忙しかった・・・でも,これは言い訳にしかならないだろう.

もっと効率化できるように,プログラムエラー系を手厚くしておけば,もっと楽に保守できたはず.



・バグ多すぎ

これは,βテストをすべきだった.

スケジュール的にかなり無理をしてのは事実だが,

今まで自分がやったことない言語で組むんだから,余計入念なチェックが必要だったはず.



【その他】

・見た目

アプリの方の見た目は多少拘った.でも,IRページについてはテキトー.

所詮,軽くCSSで設定しただけ.あまりに味気ない.





とりあえず,こんなところだろうか.



このイベントに限らず,今後こういった人に見せるモノを作る際は気をつけておかなければ.



今回は,本当に様々な面で勉強させていただきました.

関係者の皆様,ユーザの皆様,ありがとうございました.

2009-08-14

【AIR】NativeWindowクラスによるウインドウ操作

AIRで追加されたNativeWindowクラス.

ウインドウ操作を扱うクラスで,簡単にウインドウを生成・制御可能.

Flash独特のグラフィックス環境を用いて,オリジナルのスキンでウインドウを作ることができる.

そのサンプルがこれ.

あまり一般的な書き方してないけど.

 
package {
import flash.events.Event;
import flash.events.MouseEvent;
import flash.display.Sprite;
import flash.display.NativeWindow;
import flash.display.NativeWindowType;
import flash.display.NativeWindowInitOptions;
import flash.display.NativeWindowSystemChrome;
import flash.display.StageScaleMode;
import flash.display.StageAlign;
import flash.geom.Rectangle;
import flash.display.DisplayObject;

// Tweener(ウインドウのエフェクト用)
import caurina.transitions.Tweener;
import caurina.transitions.properties.FilterShortcuts;


public class NativeWindowEx extends NativeWindow {
protected var base:Sprite;
// ウインドウのオリジナルスキン(CS4で作成後Sprite継承でASに書き込み指定)
private var skin:DialogSkin;

public function NativeWindowEx(initX:int, initY:int, initTitle:String, initDO:DisplayObject) {
// NativeWindowのオプション
var nwOptions:NativeWindowInitOptions = new NativeWindowInitOptions();
// ウインドウタイプ
nwOptions.type = NativeWindowType.LIGHTWEIGHT;
// システムクロームの設定
nwOptions.systemChrome = NativeWindowSystemChrome.NONE;
// ウインドウにalpha値を適用するかどうか
nwOptions.transparent = true;
// 最小化できるかどうか
nwOptions.minimizable = true;
// 最大化できるかどうか
nwOptions.maximizable = false;
// ウインドウサイズを変更できるかどうか
nwOptions.resizable= false;
super(nwOptions);

base = new Sprite();
base.alpha = 0.0;
// NativeWindowの持つstageにaddChild
this.stage.addChild(base);

skin = new DialogSkin();
skin.window.addEventListener(MouseEvent.MOUSE_DOWN, skinWindowDragHandler);
skin.close.addEventListener(MouseEvent.MOUSE_DOWN, skinCloseButtonHandler);
skin.close.addEventListener(MouseEvent.MOUSE_OVER, skinCloseMouseOverHandler);
skin.close.addEventListener(MouseEvent.MOUSE_OUT, skinCloseMouseOutHandler);
// 貼り付ける内容に合わせてスケール変換(skinはscale9Gridを設定済み)
skin.close.scaleX = (initDO.width) / 490;
skin.close.scaleY = (initDO.height) / 300;
skin.window.scaleX = (initDO.width) / 490;
skin.window.scaleY = (initDO.height) / 300;
skin.x = 10;
skin.y = 10;
base.addChild(skin);

var rect:Rectangle = skin.scale9Grid;
initDO.x = rect.left + 10;
initDO.y = rect.top + 10;
base.addChild(initDO);

super.activate();

this.x = initX;
this.y = initY;
this.width = skin.width + 20;
this.height = skin.height + 20;
this.title = initTitle;
this.stage.scaleMode = StageScaleMode.NO_SCALE;
this.stage.align = StageAlign.TOP_LEFT;
this.addEventListener(Event.CLOSE, windowCloseHandler);
// フェードインでウインドウを表示
Tweener.addTween(base, {alpha:1.0, time:0.5, transition:"linear"});
}

public function deleteReference():void {
skin.window.removeEventListener(MouseEvent.MOUSE_DOWN, skinWindowDragHandler);
skin.close.removeEventListener(MouseEvent.MOUSE_DOWN, skinCloseButtonHandler);
skin.close.removeEventListener(MouseEvent.MOUSE_OVER, skinCloseMouseOverHandler);
skin.close.removeEventListener(MouseEvent.MOUSE_OUT, skinCloseMouseOutHandler);
}

// Event Handler /////////////////////////////////////////////
private function skinCloseMouseOverHandler(event:MouseEvent):void {
// マウスオーバーでGlowエフェクト
Tweener.addTween(event.currentTarget, {time:0.5, transition:"linear",
_Glow_alpha:0.7, _Glow_blurX:15, _Glow_blurY:15,
_Glow_color:0x00CCCC,
_Glow_quality:1, _Glow_strength:1});
}

private function skinCloseMouseOutHandler(event:MouseEvent):void {
// マウスアウトでGlowエフェクト解除
Tweener.addTween(event.currentTarget, {time:0.5, transition:"linear",
_Glow_alpha:0});
}

protected function windowCloseHandler(event:Event):void {
this.removeEventListener(Event.CLOSE, windowCloseHandler);
}

private function windowCloseTweenComp():void {
super.close();
deleteReference();
}

protected function skinWindowDragHandler(event:MouseEvent):void {
this.startMove();
}

protected function skinCloseButtonHandler(event:MouseEvent):void {
// フェードアウトでウインドウを閉じる
Tweener.addTween(base, {alpha:0.0, time:0.5, transition:"linear",
onComplete:windowCloseTweenComp});
}
}
}

NativeWindowInitOptionsで事前に作成するウインドウの設定.

オリジナルスキンを使うなら,

nwOptions.systemChrome = NativeWindowSystemChrome.NONE;

としておく.



新しく作ったウインドウにどうやってオブジェクトを表示するかというと,実は今までのやり方と全く変わらない.

this.stage.addChild(base);

というように,実は各NativeWindowがstageを所持している.

だから,今まで同様に,NativeWindow内のstageにaddChildすればいい.

つまり,表示オブジェクト的にFlashとAIRでは,



Flash:stageをトップとした階層構造

AIR :1つまたは複数のNativeWindow内のstageをトップとした階層構造



という違いがある.







各NativeWindowのメソッドについて.



activateでウインドウにフォーカスする.



このメソッドを呼び出すか,visibleをtrueにしないとウインドウが表示されないので注意.

closeでウインドウを閉じる.



startMoveでウインドウをドラッグ.

これ呼び出すだけで自動でドラッグされるとかwゆとり仕様乙

2009-08-09

【AS3.0】XMLの送受信【PHP】

GDP企画の際必要になった,ActionScriptを使ったXMLの送受信.

Flash/AIRとPHP間でXMLのやりとりをするのに使った.



試行錯誤した結果,結局こんな感じでうまくいくことがわかった.

基本的に,URLRequestで送信データ,およびその設定を行い,

URLLoaderでリクエスト(送信),Completeイベントでphpからのレスポンスが帰ってくる仕組み.

package {
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.events.IOErrorEvent;
import flash.events.EventDispatcher;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.utils.ByteArray;

/**
* ConnectPHP
* @auther kusamochi
*/
public class ConnectPHP extends EventDispatcher {
public static const COMPLETE:String = "complete";
public static const IO_ERROR:String = "io_error";
public static const PROGRESS:String = "progress";
public static const FAILED:String = "failed";

private var _urlRequest:URLRequest;
private var _result:XML;

private var urlLoader:URLLoader;

// コンストラクタ
public function ConnectPHP() {
}

// XMLの送信
public function sendAndLoad_XML(url:String, xml:XML):void {
// 送信するデータを設定
_urlRequest = new URLRequest(url);
_urlRequest.contentType = "text/xml";
_urlRequest.data = xml.toXMLString();
// データはPOSTで送信
_urlRequest.method = URLRequestMethod.POST;

// URL
urlLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.TEXT;

// イベントリスナー登録
urlLoader.addEventListener(Event.COMPLETE, completeHandler);
urlLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
urlLoader.load(_urlRequest);
}

// データロード完了のイベントリスナー
private function completeHandler(event:Event):void {
urlLoader.removeEventListener(Event.COMPLETE, completeHandler);
urlLoader.removeEventListener(ProgressEvent.PROGRESS, progressHandler);
urlLoader.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
// reusltに格納
try {
_result = new XML(event.target.data);
}
catch(error:TypeError) {
// イベントをブロードキャスト
dispatchEvent(new Event(FAILED));
return;
}

// イベントをブロードキャスト
dispatchEvent(new Event(COMPLETE));
}

// 送信中に一定間隔で発生するイベントリスナー
private function progressHandler(event:ProgressEvent):void {
// イベントをブロードキャスト
dispatchEvent(new ProgressEvent(PROGRESS));
}

// 送信エラーのイベントリスナー
private function ioErrorHandler(event:IOErrorEvent):void {
urlLoader.removeEventListener(Event.COMPLETE, completeHandler);
urlLoader.removeEventListener(ProgressEvent.PROGRESS, progressHandler);
urlLoader.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
// イベントをブロードキャスト
dispatchEvent(new IOErrorEvent(IO_ERROR));
}

// 参照削除
public function deleteReference():void {
if(urlLoader) {
urlLoader.addEventListener(Event.COMPLETE, completeHandler);
urlLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
urlLoader.close();
}
_urlRequest = null;
_result = null;
}

// getter //////////////////////////////////////////////////////
// result
public function get result():XML {
if(_result) return _result;
else        return null;
}
}
}

ポイントは,Content-typeを"text/xml"にして,xmlのStringを送信すること.

当初,Content-typeを"application/octet-stream"(バイナリデータの意)として,

XMLをBinaryArrayで送っていたけど,

それだと送信先でヘッダーに文字化けが起きる.



ちなみに,PHP側では,

$inputStr = file_get_contents("php://input");
$xml = simplexml_load_string($inputStr);

print "<result>";
// Flash側に送りたいデータをほげほげ
print "</result>";

というように,file_get_contents("php://input")で,

生データを丸ごと読みこんでPHPのXMLクラスに変換.

Flash側に送りたいXMLは,PHP自身にタグをprintすればいい.

2009-07-25

【AIR】XMLを非同期に読み書きする【FileStream】

都合上,XMLを自由に読み書きする必要が出てきた.



そこで,FileStreamクラス(AIRで追加されたファイルの読み書き用クラス)を使い,

XMLのメソッド1つで,非同期に読み書きをするXMLManagerクラスを作ってみた.



package {
import flash.events.EventDispatcher;
import flash.events.OutputProgressEvent;
import flash.events.Event;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;

/** XML用クラス
* @auther kusamochi
* @extend EventDispatcher
*/
public class XMLManager extends EventDispatcher {
public static const READ_COMPLETE:String = "read_complete";
public static const READ_CLOSE:String = "read_close";

public static const WRITE_PROGLESS:String = "write_progress";
public static const WRITE_CLOSE:String = "write_close";

private var _xml:XML;  // [read]xmlファイルの実体
private var fileStream:FileStream;
private var _mode:String;

//コンストラクタ
public function XMLManager() {
_mode = "NormalMode";
}

// 明示的な参照解除メソッド
public function deleteReference():void {
if(fileStream) {
if(_mode == "ReadMode") {
fileStream.removeEventListener(Event.COMPLETE, readStreamCompleteHandler);
fileStream.removeEventListener(Event.CLOSE, readStreamCloseHandler);
}
else if(_mode == "WriteMode") {
fileStream.removeEventListener(OutputProgressEvent.OUTPUT_PROGRESS, writeStreamOutputProgressHandler);
fileStream.removeEventListener(Event.CLOSE, writeStreamCloseHandler);
}
}
}

// ファイル読み込み
public function readXML(file:File):void {
trace("XMLManager::readXML");
trace("Reading : " + file.nativePath);

_mode = "ReadMode";
fileStream = new FileStream();
fileStream.addEventListener(Event.COMPLETE, readStreamCompleteHandler);
fileStream.addEventListener(Event.CLOSE, readStreamCloseHandler);
fileStream.openAsync(file, FileMode.READ);
}

// ファイル出力
public function writeXML(file:File):void {
trace("XMLManager::writeXML");
trace("Writing : " + file.nativePath);

_mode = "WriteMode";
fileStream = new FileStream();
fileStream.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS, writeStreamOutputProgressHandler);
fileStream.addEventListener(Event.CLOSE, writeStreamCloseHandler);
fileStream.openAsync(file, FileMode.WRITE);
fileStream.writeMultiByte(_xml.toXMLString(), File.systemCharset);
}

public function printXML():void {
trace(_xml.toXMLString());
}

// EventHandler ///////////////////////////////////////////////////////////
// Read  ----------------------------------------
// Readストリームがクローズ
private function readStreamCloseHandler(event:Event):void {
trace("XMLManager::readStreamCloseHandler");
fileStream.removeEventListener(Event.COMPLETE, readStreamCompleteHandler);
fileStream.removeEventListener(Event.CLOSE, readStreamCloseHandler);
_mode = "NormalMode";

// カスタムイベントを配信する
super.dispatchEvent(new Event(READ_CLOSE));
}

// 読み込み完了
private function readStreamCompleteHandler(event:Event):void {
trace("XMLManager::readStreamCompleteHandler");
var tmpStr:String = fileStream.readMultiByte(fileStream.bytesAvailable, File.systemCharset);
fileStream.close();
_xml = new XML(tmpStr);

// カスタムイベントを配信する
dispatchEvent(new Event(READ_COMPLETE));
}

// write --------------------------------------
// Writeストリームがクローズ
private function writeStreamCloseHandler(event:Event):void {
trace("XMLManager::writeStreamCloseHandler");
fileStream.removeEventListener(OutputProgressEvent.OUTPUT_PROGRESS, writeStreamOutputProgressHandler);
fileStream.removeEventListener(Event.CLOSE, writeStreamCloseHandler);
_mode = "NormalMode";

// カスタムイベントを配信する
super.dispatchEvent(new Event(WRITE_CLOSE));
}

// Write進行中
private function writeStreamOutputProgressHandler(event:OutputProgressEvent):void {
trace("XMLManager::writeStreamOutputProgressHandler");
if(event.bytesPending == 0){
fileStream.close();
}

// カスタムイベントを配信する
super.dispatchEvent(new OutputProgressEvent(WRITE_PROGLESS));
}

// getter ////////////////////////////////////////////////////
// XMLオブジェクトを返す(他のクラスからのアクセスに対応)
public function get xml():XML {
return _xml;
}

// mode
public function get mode():String {
return _mode;
}

// setter //////////////////////////////////////////////
public function set xml(setXML:XML) {
_xml = setXML;
}

}
}

FileStreamクラスのファイルオープンには,openメソッド,openAsyncメソッドの2つがある.

openメソッドを使うと,それ以降のFileStreamの処理は,その行の処理が終わるまで次の行を実行しない

でも,それだと,ロード対象のサイズが大きくなった場合などに遅延が起きてしまう.



それを避けたいのなら,openAsyncメソッドでファイルオープンする.

openAsyncにすると,各処理ごとにイベントを発行する.

つまり,FileStreamのオブジェクトにaddEventListenerしとけば,読み込み終わりとか判定できるわけです.



そこで,上記のXMLManagerでは,各イベントを利用してMXLの読み書きを行い,さらにカスタムイベントを配信する.

EventDispatcherを継承したのはこのため.





これ,作るときに気づいたんだが,

READモードだとcompleteイベント発生するのに,WRITEモードではcompleteイベント発生しないんだね.

最初気づかずにWRITEモードでもcompleteでファイルクローズしてたから,

イベント自体が発生してないからクローズされていないってことで,

上書き時にエラー出て散々ハマりましたw



しょうがないんで,OutputProgressイベント(出力中に定期的に発生するイベント)を使って,

bytesPending(残りの書き込みバイト数)がゼロになったときにクローズするようにしてみた.



2009-07-07

【Flash】Tweener1.32.74→1.33.74

今、あるサイトに運営において必要なFlash(正確にはAIR)を制作中.



Tweenerの最新バージョンが気になったので調べてみた.

どうやら最近,ちょっとしたごたごたがあったみたい.



TweenerはFlashを記述するAction Script 2.0,3.0のライブラリ.

オブジェクトを動きを簡単にかつ詳細に設定できる万能ライブラリで,かなり多くの人に使われている.

というか,普通にプロも使ってそう.

Google Codeで配布されてます.

http://code.google.com/p/tweener/



現状の最新版は1.33.74.

その前バージョン1.32.74において, 「Tweenerの上書き」の設定について不評があり,1.33.74ではそれが修正されている.





そもそもTweenerの上書きって?

同じオブジェクトに対してTweenを連続で設定したとき,以前のバージョンまでは自動で上書きされてていた.


var mySquare:MySquare = new MySquare(); // 正方形
var myCircle:MyCircle = new MyCircle(); // 円
mySquare.x = 20;
mySquare.y = 20;
stage.addChild(mySquare);
myCircle.x = 20;
myCircle.y = 20;
stage.addChild(myCircle);
Tweener.addTween(mySquare, {x:160, time:4, transition:"linear"});
Tweener.addTween(mySquare, {x:160, time:2, transition:"linear"});
Tweener.addTween(myCircle, {x:160, time:4, transition:"linear"});
Tweener.addTween(myCircle, {y:160, time:2, transition:"linear"});



▲実行結果



x座標を連続で設定したmySquareは,後に書いた方に上書きされていることが確認できる.



ver.1.32.74の変更点

Tweenの上書きをオプション扱いにする.その際,デフォルトではfalse(無効)

なので,上のコードをver.1.32.74で実行すると,





▲ver.1.32.74で実行



mySquareの設定が上書きされなくなる.



そのかわり,オプションに,


Tweener.addTween(mySquare, {x:160, time:4, transition:"linear"});
Tweener.addTween(mySquare, {x:160, time:2, transition:"linear", overwrite:true});

overwriteオプションを追加することで,前バージョンと同様に上書きされる

しかし,前バージョンのライブラリを使っていた人にとっては,バージョンアップによって動作に問題が生ずる可能性がある.



ver.1.33.74の変更点

そこで,現最新バージョンでは,Tweenの上書き設定をする静的プロパティ「autoOverwrite」を追加し,上書き設定のデフォルトをtrueとした.

これにより,前バージョンまで使っていたASであっても正常に動作し,かつ上書きの有無を設定できるようになった.



つまり,上書きをしたかったら,今まで通りそのままでおk.

上書きしたくないのなら,上記ver.1.32.74のようにオプションで1つ1つ設定するか,以下のようにして設定する.


Tweener.autoOverwrite = false;
Tweener.addTween(mySquare, {x:160, time:4, transition:"linear"});
Tweener.addTween(mySquare, {x:160, time:2, transition:"linear"});

ver.1.32.74で上書き設定をデフォルトでfalseにした理由は,その処理速度の問題から.

Flashはしばしばというか,かなりの場合,処理速度が重要なキーとなる.

まあ,スクリプト言語だし,C言語に比べれば計算速度自体かなり遅い.

だから,できるだけ速くする努力は必要.



今回の「上書き設定」は,上書きしないことがわかっているなら,最初からfalseにしといたほうがコストが少なくすむ.

例のFlashの実行結果からように,以前のバージョンのTweenerでは,同じオブジェクトがTweenを設定されたとき,まず,同じプロパティがあるかどうかを探索する.

同じプロパティがあった場合は,その設定を上書きして,ない場合はそのまま設定を追加する.



・・・ということは,今まで作った自分のプログラムもfalseにした方が効率上がるのかな?

どこかで上書きしてたら困るけども.

どれくらい速くなるかは要検証.

2009-05-06

【AIR/Flex】asSQL

AIRだと,SQLiteを扱うクラスがあるらしい.



でも,MySQLは対応していなかったみたい・・・.



調べるとどうやら,asSQLはMySQLをサポートしてくれるそうな.



asSQL - Google Code





よし.使ってみよう!



と思ったら・・・





SWFから直にMySQLへ接続するということは、
クライアントからデータベースサーバへ直にソケット接続が必要


【抜粋】気ままな開発メモ:asSQLを使ってみる





ですよねー



ローカルなネットワークじゃないと無理ってことか・・・.



同サイトには,「限られたネットワークであれば非常に有効」とも書いてあるだけにおしいな.



せっかく面白そうなの見つけたのに.



Flashからphpにデータ送ってSQLに登録って感じにしないとだめか.







世の中ってそううまくいきませんよね.





趣味も就活も

2008-08-20

【Action Script 3.0】サウンドの一時停止・自動ループ再生

Action Script 3.0でサウンドの一時停止,自動ループ再生ができた.

サウンドでは主に,

mp3の実体を扱うSoundクラス,

Soundクラスで再生を開始した音楽を制御するSoundChannelクラス


の2つが必要.

また,音量の調整,左右のスピーカーに流す割合を設定するには,SoundTransformクラスが必要.

SoundTransformクラスはSoundクラス専用というわけではなく,

Flash全体のサウンド(flvファイルのサウンドとかも)の設定にも使われるクラス.



最初は,↑の各クラスの役割をはっきり認識していなかったので,

一時停止をやっても2重再生とかのバグが起こって困った.



ソースはこんな感じ.


var sound:Sound = new Sound();
var soundCh:SoundChannel;

// サウンドの再生位置
var _currentPos:Number;
// 通常時のサウンドボリューム
var _soundVol:Number = 1.0;

var url:URLRequest = new URLRequest(mp3ファイル名);
// ロード開始
sound.load(url);
// サウンドのロード完了のイベントリスナー登録
sound.removeEventListener(Event.COMPLETE,
SoundCompleteHandler);

// サウンドのロード完了
function SoundCompleteHandler(event:Event) {
// 位置0から再生開始
soundCh = sound.play(0, 1);

// 音量設定
changeSoundVolume(_soundVol);

// mp3の読み込み完了メソッド解除
sound.removeEventListener(Event.COMPLETE,
SoundCompleteHandler);

// 再生終了のイベントリスナー登録
soundCh.addEventListener(Event.SOUND_COMPLETE,
SoundChannelCompleteHandler);
}

// サウンドの一時停止
function pauseMusic():void {
// 再生位置を保存
_currentPos = soundCh.position;
// ストップ
soundCh.stop();
// SoundChannelの開放
soundCh.removeEventListener(Event.SOUND_COMPLETE,
SoundChannelCompleteHandler);
soundCh = null;
}

// サウンドの再生
function restartMusic():void {
// 保存した再生位置から再生
soundCh = sound.play(_currentPos, 1);
soundCh.addEventListener(Event.SOUND_COMPLETE,
SoundChannelCompleteHandler);
// 音量設定
changeSoundVolume(_soundVol);
}

// 音量調整
function changeSoundVolume(setVol:Number):void {
// 音量の制御用クラス
var soundTrans:SoundTransform;

soundTrans = soundCh.soundTransform;
soundTrans.volume = setVol;
soundCh.soundTransform = soundTrans;
}

// サウンド再生の終了イベント(ループ再生用)
function SoundChannelCompleteHandler(evt:Event):void {
// 安全のため開放
soundCh.removeEventListener(Event.SOUND_COMPLETE,
SoundChannelCompleteHandler);
soundCh = null;

// 最初から再生
soundCh = sound.play(0, 1);
soundCh.addEventListener(Event.SOUND_COMPLETE,
SoundChannelCompleteHandler);

// 音量設定
changeSoundVolume(_soundVol);
}


Soundクラスのstartメソッドの返り値がSoundChannelクラス.

以後,得られたSoundChannelを使ってサウンドを制御する.



サウンドの一時停止は,flvの場合と違ってpauseメソッドがない.

なので,再生位置を予め保存しておいて,SoundChannelクラスを破棄する.

ここで,SoundChannelクラスがちゃんと破棄されていないと後で再生をしたときに2重再生の原因となるので注意.

再生時は,保存しておいた再生位置をstartメソッドの第1引数に指定でおk.



ループ再生自体は,Soundクラスのstartメソッドの第2引数でリピート回数を指定すればいいんだけど,これじゃリピートが有限になっていつかは止まってしまう.

なので,常に自動的にループさせるには,1回の再生にしておいて,再生終了後のイベントが起きたときに,再び最初から再生させればいい.



上のソースをクラスとして作っておいて, さらに再生位置の移動,ボリューム設定を追加した結果,こんな感じのFlashができました.

test_sound





ちなみに,今回使用させていただいた音楽はこちら.



2008-07-28

【AIR】自己組織化マップ サンプルプログラム

今日,授業で自己組織化マップ(SOM)の発表会ですた.
内容は,「自分の手を入力として,それに格子状のニューロンが収束する様を見て楽しみましょう」というもの.

見て楽しむということで当然GUIですよ.
でも,JavaでSwingとか,VCでMFCとか正直やってらんないよね.
なので,AIRで作っちゃいました!

ダウンロードは↓
SOM Sample ver.2.0
※このプログラムはAIRアプリケーションです.実行にはAdobe AIRが必要です.

SOM Sample ver.2.0

くさもちは,GUIに困ると(AIRで)ついやっちゃうんだ!

まあ,AIR使ってるのはローカルから画像ファイルを読み込めるところだけど.
なので,そのうちFlash版も作っておこうかと思う.

使い方
とりあえず,Drawing Spaceにマウスでお絵かきするか,「Open」ボタンで画像を読み込む.
画像の場合,基本は2値画像または2値画像の白の部分を透過にしたもの.
普通の画像でもできなくはないけどね.
黒以外のピクセルがニューロンへの入力となります.
ニューロン数,学習率,繰り返し回数の上限を設定後に「Set」ボタンでセット.「Start」ボタンで実行します.
実行中,「Skep」の値を上げるとその値だけ描画を省いて表示するので,更新の速度が早くなります.

2008-07-20

(゚∀゚)キタコレ!! AIRアプリケーション

近年,従来のWeb環境を改善するアプリケーションとして,Rich Internet Application(RIA)が注目されている.

RIAは,JavaScript,XML,Flashなどを用いることで,Webブラウザ上でユーザにとって自由度の高いユーザーインターフェースの提供を可能とする( ´_ゝ`)フーン.

このような背景のもと,アドビシステムズはRIAをデスクトップアプリケーションとして開発,実行するためのランタイムライブラリとしてAdobe Integrated Runtime(AIR)をリリースした(2008年2月ヽ(゚Д゚)ノ新しい!!).

AIRを用いることで,自由度の高いユーザーインターフェースを持ったデスクトップアプリケーションの作成が可能となるΣ( ゚Д゚) スッ、スゲー!!.

本発表では,AIRの概要とFlash開発側の視点からAIRアプリケーションの構築について簡単に説明する.

さらに,実際にAIRが用いられた例をいくつか紹介する.





・・・という内容で自主ゼミしてきました.

ゼミ用にサンプルプログラムを3つほど作ってみました.

今回は,その中のひとつのアプリをうpしますた.



MyTurn.air





なお,これはAIRアプリなので,Adobe AIRがインスコされてないと動きません.

Adobe AIRがインスコされていると,

ファイルを実行すると,インストーラが立ち上がります.

てきとーなところインスコすればおk.

なお,アンインスコは各自OSの機能からやってください.







・・・



これはひどいwww

2008-05-31

FlashによるFlashの説明スライド

この間にも言っていたFlashの説明用スライドもバグが直ったのでうpしておく.

でも,このブログ,512kBが限界な上,フォルダ構成作れないとは.

いや,ブログだったらこれぐらいが普通ですか.そうですか.



というわけで,直接ここにあげるのは無理なので, こっちに置きました.

またまた,お世話になります.NINJA TOOLSさん.



注意事項.

基本的にサイズは自分のPC用ということで1280x800.

でもプロジェクタに投影することを考えて表示領域自体は1044x800になっている.

めんどくさいのでリサイズしなかった.

でも, こっちのswfファイルに直接アクセスすると,

Flash Playerさんが勝手に縮小表示してくれて幸せかも.

名前等は晒したくないので,そのへんはオブラートに包みました.

内容に関しては,あんまり信用しないでください.

割とテキトーなリサーチだから.



操作方法は,基本キーボード.

矢印右:アニメーションを1つ進める.

矢印左:アニメーションを1つ戻る.

矢印下:ページを1つ進める.

矢印上:ページを1つ戻る.

あと,6ページ目にマウスでクリックできるボタンがあります.

Flashの作成例を表示するボタン.

あ,一応言っておくけど,ブラウザ上からこのFlashを見ると

最初はフォーカスがブラウザに設定されてるから,

一回画面にクリックとかしないと,キーは反応しませんよ.

最初からブラウザでの動作なんて考慮してなかったし.





バグがあったのは,キーの入力フォーカス.

各ページがMovieClipになっているのだけれど,

最初はキーの入力を各MovieClipで受け取っていた.

でも,そうすると,前回も書いたように,

キーのフォーカスの変更とかでてきてめんどくさい.

なので,最初からstageで受けるように書き換えてみることにした.

そしたら,すんなりバグの部分も直ってしまった.

無駄に余計なことしてただけだったのねw

2008-05-29

虫のエージェントプログラム

自立系工学特論の課題.

やっと完成しますた.

せっかくなので晒してみる.



虫のエージェントプログラム(Flash)

注意:別ウインドウで開きますよ.Flash Player9じゃないと見れませんよ.

オレンジの■:虫(学習規則を持つエージェント)

赤の■:今にも死にそうな虫(エネルギー不足で3ターンに1回行動)

緑の■:バクテリア(虫の餌,エージェントの報酬)



今回のプログラム方針

最初はエージェント1匹ごとにMovieClipを用意していたがやはり重かった.

MovieClipは,動画などを貼付け可能な上位のクラス.

かなり自由な分,作りすぎるとメモリ食うし重い.

なので,表示画面全体をBitmapにすることにした.

Bitmapは描画用に特化したクラス.

よくあるGUIプログラム同様,矩形とか円とかをメソッドから描けるやつね.

まあ,どうせエージェントなんてドットで十分なので,

むしろこっちで正解でした.

それに,描画にしたから弱った虫を違う色に変えるというのも簡単に実装できた.



あとは,閾値を調整しながら何度も試行すると思われるので,

それができるようなインターフェース(テキストボックスとボタン)を用意した.

これは,Flash CS3自体のライブラリとして登録されているので,

簡単に実装できた.

なんだか,Visual Basicやってたときを思い出しましたよ.