Archive for the ‘Flash’ Category

このページの目次

Flash のクリックを Google Analytics で追跡する方法

木曜日, 2月 28th, 2013

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

Google Analytics でクリックを解析する方法があるんですね。今回初めて知りました。設定の方法は以下のサイトに分かりやすくまとめてあったので詳しくは以下のページを参考にしてください。

Google Analyticsで外部リンク先のクリック数を追跡する方法(2012年1月時点)

で、今回はコレをFlashに適応したいという話。具体的には以下の部分をFlashに適応したいわけです。

<a href="リンク先URL" onclick="javascript:_gaq.push(&#91;'_trackPageview', '仮想URL'&#93;);" target="_blank">テキストリンク</a>

たぶんこんな感じだろうなと思って実装してみたら実際動いて、でももうちょっと確信がほしかったので調べてみたら、Googleグループの英語ページにもありました。
ボタンを押したあとの処理内容に以下のコードを追加すればトラックされます。

ExternalInterface.call("_gaq.push", ['_trackPageview', '仮想URL']);

この件について日本語のページが見当たらなかったので、メモしました。

global変数の代入と参照

水曜日, 1月 6th, 2010

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

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

_global.hoge = 0;

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

trace(hoge);

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

_global.hoge = num;

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

Loader.load()の第2引数のLoaderContext

水曜日, 12月 2nd, 2009

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

今日はLoader.load()の第2引数、LoaderContextにハメられた話。

wonderflをしていて、flickrにある画像をLoader.load()で読み込んでいたのですが、
addChild(loader)はできるのに、Bitmap(loader.content)ができず、行き詰っていました。

原因は、Loader.load()の第2引数を与えなかったことにありました。
詳しい説明はFlashのマニュアルに書いてありますが、
簡単に話すと他サーバから読み込まれた画像をスクリプトで操作するには、
LoaderContextのcheckPolicyFileプロパティをtrueにする必要があるようです。
もっと簡単に言うと、クロスドメインの問題です。

このcheckPolicyFileプロパティはクロスドメインのポリシーファイルをロードするか否かの設定で
デフォルトがfalseです。
このプロパティをtrueにしないままだと、Loader.contentやBitmapData.draw()などの処理は
SecurityErrorで実行されません。
以下のように書けば問題なく行けました。

var context:LoaderContext = new LoaderContext(true);
var loader:Loader = new Loader();
loader.load(new URLRequest(IMAGE_URL), context);

ちなみにwonderflで作っていたのはこれです。
http://wonderfl.net/code/b1fd0c021cb26e6593f80f7b3831e611504b2fd2

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

水曜日, 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("失敗したー");
		}
	}
}

こんな感じ