Posts Tagged ‘Flash’

このページの目次

global変数の代入と参照

水曜日, 1月 6th, 2010

こんにちは、なかわけです。

今日はASで1時間ハメられた話のメモ。

_global.hoge = 0;

と一番上のタイムラインに最初に定義しておいた場合、
参照するのときは、どのムービークリップやタイムラインからでも

trace(hoge);

で参照できますが、
グローバル変数hogeを更新・代入したいときは、

_global.hoge = num;

のように_globalをプリフィックスしてあげないといけないんですね。
当たり前っちゃ当たり前。
_globalを付けずに、ただ単にhogeをしてしまうと、
そのムービークリップ(またはムービークリップのタイムライン)のローカル変数になってしまうんですね~。
初心者だな~1時間悩みました~┐(´ー`)┌

動画に書き出したときに入れ子にしたムービークリップを再生する

水曜日, 10月 21st, 2009

こんにちは、なかわけです。

今日会社の人に、「ムービークリップを入れ子にした時に、子ムービークリップや孫ムービークリップって再生されないよね?」って聞かれて、

あれ?そうだっけ?
1年くらい前にASをぐりぐり書いて動かした動画を作ったけどなあ。

と思いながら確認してみました。
どうやら、書き出しのファイルの形式を.aviにしてしまうと入れ子にしたムービークリップは動かず、
.movにした場合は入れ子のムービークリップもASも(ものによっては動かないかも。未確認。)動いた状態の動画が書き出せます。
なぜか、いままで.movで作業していたのでこの問題に気付きませんでした・・

ムービーの圧縮設定はH.264がいいみたいです。
詳しくは知らないけど、圧縮率が高くてキレイに仕上がるんですって!

Array.lengthの値が期待と違って困ってる

土曜日, 9月 19th, 2009

こんにちは、なかわけです。

Array.lengthの件でちょっと困ってます。

var arr:Array = new Array();
for (var i:uint = 10000; i >= 1; i /= 10) {
	arr[i] = 1 + Math.floor(num / i);
	num = num % i;
}
trace(arr);

このとき、traceされた値が5であってほしいのに、10001が帰ってくる。
困る/(^o^)\
いや、困ってないけどなんか気持ち悪いです。

フルスクリーンのAIRを作るときにハメられたこと

水曜日, 9月 16th, 2009

こんにちは、なかわけです。

メモ程度にさらっと。

AIRを作っててだいたいできたからフルスクリーンにして確認してみようと思い、

stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;
stage.scaleMode = StageScaleMode.NO_SCALE;

と書いて、メニューバーの「デバッグ>ムービーのデバッグ」からプレビューしてみたら動きがガタガタになりました。

作っている内容にもよりますが、処理が重いモノを作っているとガタガタに再生されると思います。
げッ!作り直しか?どこがおかしかったんだろう・・・と思いながら、
AIRをちゃんとパブリッシュしてインストールして再生してみました。
すると、ほぼ想定通りの動きで再生されました。

どうやら、Flashからのプレビューではガタガタに再生されるようです。
一瞬、焦った。

AS3で配列の中の重複を取り除いてユニークな配列にする処理

金曜日, 9月 11th, 2009

こんにちは、なかわけです。

AS3に配列内をユニークにして返してくれる処理がなかったので、いろいろ調べながら作った。
使い方によってはユニーク化にもグループ化にもできる。


var nekoArr:Array = [
{color:'white', sex:'male', age:'1'},
{color:'black', sex:'female', age:'3'},
{color:'kiji', sex:'male', age:'2'},
{color:'white', sex:'male', age:'5'},
{color:'black', sex:'female', age:'4'}
];

function uniqueNeko(arr:Array):Array
{
var tmpObj:Object = new Object();
var uniqueArr:Array = new Array();
for (var i:uint = 0; i < arr.length; i++) { var property:String = arr[i]['color'] + arr[i]['sex']; if (!(property in tmpObj)) { tmpObj[property] = true; uniqueArr.push(arr[i]); } } return uniqueArr; } uniqueNeko(nekoArr); [/as3] 色とオスメスでグループ化したいとき(年齢は無視)、colorとsexの値を結合して文字列にしtmpObjのプロパティにするところがミソ。 tmpObj[property]にtrueを入れているけど、trueである必要はなく空文字でもなんでもいいです。プロパティを追加することに意味があるので。 たぶん、これでOKじゃないかなー。おかしかったらコメントください。

AIRのパッケージはできるけど、パッケージ化がうまくできてない

日曜日, 9月 6th, 2009

こんにちは、なかわけです。

タイトルの意味がわかりにくいですね。
この2日間AIRに悩まされました。

AIRの仕事が来て、なかわけは今までAIRを作ったことがなかったので、
最初は手始めに簡単なAIRアプリを作ろうとHowTo系のページを見ながら研究していたら、
いきなりAIRがパッケージ化に失敗するようになりました。

もうちょっとわかりやすく説明すると、AIRのパブリッシュ(パッケージ)はできるとのですが、
書き出されたAIRファイルができそこないで、そのAIRを起動すると「エラーが発生しました。~」
というメッセージが表示されて先に進まなくなりました。

エラーが発生しました。

このページを見ながら作業していたら、うまく動かなくなりました。
http://www.adobe.com/jp/newsletters/edge/september2007/articles/article2/index.html
http://www.adobe.com/jp/newsletters/edge/october2007/articles/article3/index.html

どうやらこのページの記事が古いもので、当然アップデータも古く、気付かずにインストールしてしまいました(バージョンが古いはずなんだからアップデートできちゃうのも問題化と思いますが)。

記事内には、
不具合が発生した場合は Flash CS3 のアプリケーションそのものを再インストールする必要がありますので、あらかじめご了承ください。
と書いてあったので再インストールをしました。

が、今度は今までAIRのパブリッシュできていたFlashファイルもパブリッシュできなくなってしまいました。
Flash自体のインストールに失敗したのかと思って今後はライセンスを解除してCSごと再インストールしてみたのですがやっぱりダメでした。

その後いろいろ試したり調べたりしてダメだっだのですが、解決方法をほぼ偶然的に見つけました。
なかわけはそもそも勘違いをしていて、CSの再インストールのときに各ソフトのアップデートを自動的に行いインストール後には最新の状態になっているモノだと思っていました。
しかし、CSの再インストールはパッケージCDの中身しかインストールしないようです(これって普通?)

もしや、と思ってFlashを起動しメニュー>「ヘルプ」>「アップデート」をしてみました。
すると、AcrobatとIllustratorの更新がありました・・・。
「アクロバットとイラレか・・・」と思いながら、とりあえずアップデートをかけてみました。
イラレのアップデートが失敗した・・・。

おいwと思い、もう一度メニュー>「ヘルプ」>「アップデート」を選択しました。
すると、100数件のアップデートが見つかりました。おぉ!と興奮しながらインストールボタンをクリックすると、その中にFlashのアップデートも!

途中1度再起動要求がありましたがその後めでたくアップデートが完了!
AIRも無事パッケージできるようになりました!!

要するに、2回「アップデート」をするというのが正解だったようです。
今回、痛感したのは記事の日付とアップデータの内容をよく確認してからアップデートしようということでした←基本(いや、しかし古いアップデータがインストールでき(ry・・)。
はぁー、1日半無駄な時間を使ってかなりストレスでした・・・。

ASでコールバック的な処理の書き方

月曜日, 8月 17th, 2009

こんにちは、なかわけです。

先日仕事をしていて、自分で書きながらこんな書き方できるんだなーという思ったのでメモ。

MainのなかでSubのインスタンスを生成する際、引数としてMainのfunctionを与えると、SubインスタンスからMainのfunctionが実行できるというもの。
このサンプルのコードでは意味のない処理をしてますが、実際にはSubのアニメーション処理が終わったらMainの処理を実行するというようなFlashを作ってました。

Main.as

package{
	import flash.display.MovieClip;
	import Sub;

	public class Main extends MovieClip{

		public function Main(){
			var subObj:Sub = new Sub(result);
		}

		public function result(num:uint):void{
			trace('結果は' + num + 'でした');
		}
	}
}

Sub.as

package{
	import flash.display.MovieClip;

	public class Sub extends MovieClip{

		public function Sub(callback:Function){
			var resultNum:uint = Math.floor(Math.random()*100);
			callback(resultNum);
		}
	}
}

はたしてこういう書き方してよかったのだろうか・・・。

ASでJSONをエンコードしたりデコードしたり

月曜日, 8月 17th, 2009

こんにちは、なかわけです。

今日は久しぶりにFlashの話です。いつもの備忘録です。
as3corelibで提供されているJSONユーティリティを使います。

エンコードの場合、

package {
	import flash.display.Sprite;
	import com.adobe.serialization.json.JSON; 

	public class encodeJson extends Sprite {
		public function encodeJson():void {
			var encodedJson:String = JSON.encode({
				'name' : 'nakawake',
				'type'  : 'neko',
				'age'   : 3
			});
		}
	}
}

デコードの場合(ウェブから取得してきた場合)

package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.events.IOErrorEvent;
	
	import com.adobe.serialization.json.JSON; 

	public class decodeJson extends Sprite {
		public function PostAndLoad() {			
			var request:URLRequest = new URLRequest('./json.php');
			var loader:URLLoader = new URLLoader();
			loader.load(request);
			loader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
			loader.addEventListener(Event.COMPLETE, loaderCompleteHandler);
		}

		//ロードが正常に完了したとき
		private function loaderCompleteHandler(event:Event):void {
			var json:Object = JSON.decode(loader.data); 
			trace(json['name']);
			trace(json['type']);
			trace(json['age']);
		}

		//ロードに失敗したときの処理
		private function errorHandler(event:IOErrorEvent):void {
			trace("失敗したー");
		}
	}
}

こんな感じ

ブックマークレット「ページに落書き!β」を作りました

金曜日, 3月 6th, 2009

こんにちは、なかわけです。

仕事で開発していたFlashを作りながら思いついたのでブックマークレットを作りました。

名づけて「ページに落書き!」です。

ブックマークレット「ページに落書き!」

ブックマークレット「ページに落書き!」

使い方は下のコードをブックマークとして追加してください。

ブックマークバーに登録するとクリックしやすくてオススメです。


javascript:(function(){var d=document; var s=d.createElement("script"); s.charset="UTF-8"; s.src="http://nakawake.net/download/flash/ScrawlInPage/load.js?"+(new Date()).getTime(); d.body.appendChild(s)})();

次に落書きしたいページにアクセス後、先ほど追加した「ページに落書き!」ブックマークレットをクリック。

そうするといま表示中のページに落書きすることができます。

オススメの使い方は、ミーティングのときにページに直接描きながら説明したり、人の顔に落書きしてぷぷっと笑ったりしてください。

現在ベータ版ですが今後ちょとずつバージョンアップしていきます。

AS3.0で連想配列を作ろうとしたら

土曜日, 1月 31st, 2009

こんにちは、なかわけです。

ついこの間Flashを編集していて配列を作ろうと思ったらできませんでした。

var myArray:Array = new Array();
myArray['hoge'] = "こんにちは";
myArray['fuga'] = "こんばんは";

できない・・・。

Flashのヘルプを検索しても「連想配列」について1件もヒットしませんでした。

もしかして、連想配列使えなくなった!?
いや待て。そんなわけない!

Googleで検索したところすぐ見つかりました。

AS3.0で連想配列を作るときは、ArrayクラスのオブジェクトではなくObjectクラスのオブジェクトと使うようです。
配列なのに! 

くそぅ、一時間無駄にしました・・・