忍者ブログ
研究室生活のメモ・・・だった過去の遺産。移転先→http://negimochix2.blogspot.com/
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

ここで、Adobeのアカウントを登録すると、Adobe AIR 2のベータ版公開時にお知らせしてくれるんだって!

>>Adobe AIR 2 Beta Notification - Adobe Labs

もちろん、ベータの段階では英語版しかないけども。

Adobe AIR 2では、パフォーマンスの改善はもちろんのこと、外部記憶デバイスの認識、マイクからの音声取り出し、マウスジェスチャー・マルチタッチ対応、HTML5/CSS3のWebKitなど、大幅に拡張されるみたいです。

Blogではマルチタッチの動画が上がってた。
まだ、タッチスクリーン自体は普及してないけど、iPhoneの流れからすれば、段々一般的な入力デバイスになっていくのかな。

>>Cynergy Systems Demos Adobe AIR 2 Multi-touch Support - Adobe AIR Team Blog


これからのAIRの発展に期待。
PR
以前の記事でも書いたように、
Tweneerがver.1.33.74にアップデートしてるって書いたけど、
実は、これが最終バージョンだったらしい。

開発者さんのブログ:
Zeh Fernando » Blog Archive » Tweener, 4 years later - A post mortem

その日本語訳:
TONPOOBLOG>>Tweenerの終焉


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

感動した



それに、現状のTweenerの限界も把握できた。
なにげなく使ってきたライブラリだったけど・・・
確かに、パフォーマンス面では、問題あるかもしれない。


つーか、AS2では、nullになってるオブジェクトのプロパティにアクセスしても怒られないとか、
どんだけ緩いですか・・・FlashPlayerたんw


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



このライブラリがなかったら、今の自分はいなかったよ。たぶん。
それぐらいお世話になった。

本当にありがとう。
いまさらすぎる件w

いや、でもね。よく忘れるんですよ、この構文。
PHPなら「foreach」で、スペースいらないし、普段C言語だと使わないし・・・。
最近、混同するので、メモしとかないとすぐ忘れちゃうw


ここでは、Action Scriptの話。

var obj:Object = {a:"はちゅね", b:"かぁがみね", c:"たこるか"};
for each(var value:String in obj) {
	trace(value);
}
結果(表示される順番は保障されない):
たこるか
はちゅね
かぁがみね
中の要素を取り出すってことね。


よく使われるのはXML。
var xml:XML = <data>
              <hoge><a>まぐろは</a></hoge>
              <hoge><a>おおまさん</a></hoge>
              </data>;
for each(var tmpXML:XML in xml.hoge) {
	trace(String(tmpXML.a));
}
表示結果:
まぐろは
おおまさん
みたいな感じに。

あと、よくどっちがどっちか忘れるんだけど「each」がない場合は、
var obj:Object = {a:"はちゅね", b:"かぁがみね", c:"たこるか"};
for(var value:String in obj) {
	trace(value);
	trace(obj[value]);
}
結果(表示される順番は保障されない):
c
たこるか
a
はちゅね
b
かぁがみね
こんな感じ。
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でパスが違うから注意。
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ゆとり仕様乙
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すればいい.
Infomation
くさもち 【中の人】
・くさもち
・ボカロ廃大学院生
・βからのニコ厨
・もちろん非リア充
・ミクZ4 第二期個人スポンサー

【メール】
・negimochi.tabetai(゚Д゚)gmail.com
(゚Д゚)→@

【その他やってるもの】
Twitter

・これは痛いピアプロ
・過去の遺産smart.fm

【作ったもの】
・製作に参加したDTX GDPメインサイト
で,実際に作ったIRページ
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Heartsnative
『Heartsnative/MOSAIC.WAV×鶴田加茂 feat.初音ミク』応援中!
VOCALOID Ranking Watcher
新曲は常にチェックすべし。
真・フルみっくすプレイヤー
おすすめ記事
jubeat ripples
今更やってみる