コンポーネントComboBoxのフォントサイズを変える方法

あまりコンポーネントを使わないんですが、プルダウンメニューを使いたいということで、やむをなしにComboBoxを使うことにしました。ところが、メニュー内のテキストサイズを変更するのに、情報があまりなかったのでここにメモをしておきます。

fl.controls.ComboBox;はTextFormatを継承しているので、テキストのスタイルの設定は基本的な書き方でOKです。あとは、ComboBoxにTextFormatを適応させる方法が2つあります。cb.textField.setStyle(“textFormat”, tf);でメニューのところのテキストフォーマットで、cb.dropdown.setRendererStyle(“textFormat”, tf);でドロップメニュー内のテキストフォーマットの設定になるみたいです。

package {
	import fl.controls.ComboBox;
	public class Main extends MovieClip {
		private var cb:ComboBox;
		private var tf:TextFormat;
		public function Main() {
			init();
		}
		private function init():void {
			cb = new ComboBox();
			tf = new TextFormat();
			tf.size=12;
			cb.textField.setStyle("textFormat", tf);
			cb.dropdown.setRendererStyle("textFormat", tf);
			cb.addItem( { label: "ラベル1", data:1 } );
			cb.addItem( { label: "ラベル2", data:2 } );
			cb.addItem( { label: "ラベル3", data:3 } );
			addChild(cb);
		}
	}
}

AS3で重複しないランダムな数字を配列で返す方法

2011年の抱負を語ってから連続でAS3の話で恐縮ですが、、、毎度困ってる重複しないランダムのClassをメモします。

重複しないランダムは何かと便利です。その数を引っ張り出すのに、毎回関数で数字を生成するのはナンセンス。なので、一回のメソッドでほしい数分が格納された配列を作る。そんなClassを作りました。

package {
	public class RandomNonOverlapping {
		//↓この配列に重複しないランダムの数字が入ります。
		public var ary= new Array();
		public var max:uint = new uint();
		public var Need:uint = new uint();//必要な個数
		public function RandomNonOverlapping(m,n) {
			init(m,n);
		}
		public function init(m,n):Array {
			var max:uint = m;
			var Need:uint = n;
			var int_a = new Array();
			var int_b = new Array();
			//0~maxの数字を全部配列に入れる
			for (var i:int=0; i<= max; i++) {
				int_a[i] = i;<br />
			}
			var j:Number = 0;
			var a_length:Number = int_a.length;
			//要は配列をシャッフルする
			while (a_length) {
				var int_r:Number = Math.floor(Math.random()*(max+1-j));
				//乱発生した整数を配列int_bに順番に入れ、int_aから削除する
				int_b[j] = int_a.splice(int_r, 1);
				j++;
				//配列int_a内の数字が一つずつ減っていく
				a_length = int_a.length;
			}
			//ここで配列int_bがシャッフルされた
			//int_bの頭から必要な分を取り出す
			for (var k:int = 0; k <Need; k++) {
				ary[k] = int_b[k];
			}
			//配列を返す
			return ary;
		}
	}
}

このClassをnewしてaryにアクセスすると配列が格納されます。

var randomAry = new RandomNonOverlapping(9,10).ary;
trace(randomAry);

第一引数には生成する乱数の最大数を、第二引数には配列の長さ、乱数の数をつけます。数が一致しないのは「0」も1つとカウントするからです。この例では「0,1,2,3,4,5,6,7,8,9」の数字がランダムに格納されることになります。

Stats.asがダウンロードできる場所と使い方

loco roco v0.2 (改造PuyoDot) – wonderfl build flash online

AS3用のFPSとメモリーの使用量がわかる、Stats.asというのがあります。左上のグラフみたいなやつですね。めちゃくちゃ便利なんですが、PC移行の際にバックアップをとるのを忘れ、再度ダウンロードしにいったんですが、なんと!ソースがなくなってる?じゃないですか!
>>http://code.google.com/p/mrdoob/wiki/stats
↑だいたいここに飛ばされるんですがなくなってるみたいですよね。
あれば便利なんで、、、何とかしてみつけたいなぁーっと思い、探しに探したら見つかりました!

Stats.asがダウンロードできる場所はここ

>>http://code.google.com/p/mrdoob/source/browse/trunk/libs/net/hires/utils/?r=109
↑Stats.asを右クリックで、名前をつけて保存。で保存してください。

簡単な使い方

Stats.asをひらくと、「package net.hires.debug」となってます。ドキュメントクラス、またはflaファイルがあるところに「net」フォルダ、その下に「hires」フォルダ、その下に「debug」フォルダを作ってその中にStats.asを置いてください。

ActionScriptに下記のコードを書きます。

import net.hires.debugStats;
addChild(new Stats());
これで導入完了です!

Twitter検索APIの結果をActionScriptで取得してパースする方法

Twitterの検索APIで、主に使われるのはハッシュタグで検索したつぶやきを使うときだと思います。たとえば、「#CS5_jp」のハッシュタグを検索APIで取得したいとします。

ATOM形式:http://search.twitter.com/search.atom?q=%23CS5_jp
JSON形式:http://search.twitter.com/search.json?q=%23CS5_jp

まぁFlashなんで、わざわざjsonじゃなくてatomでいいやー!と思いきや、ATOM形式はXMLを扱うように、ActionScriptでパースすることができませんでした。

ATOM形式はRSSリーダーに登録できるように設計されているもので、XML文章フォーマットでありながら閉じタグが省略されているのが、ActionScriptでうまくパースできない原因でした。ここで使うのがAS3のNamespaceクラスです。XMLをloadしたあと、格納された変数にnode名を入力してパースしていくと思います。その、noed名の手前に、このNamespaceを入力していく必要があるみたいです。Twitterの出力結果を見てみましょう。

<feed xmlns:google="http://base.google.com/ns/1.0" xml:lang="en-US" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns="http://www.w3.org/2005/Atom" xmlns:twitter="http://api.twitter.com/">

feedの要素の中に、Namespaceが記述されています。「http://www.w3.org/2005/Atom」というのがNamespaceにあたる内容です。

var ns:Namespace = new Namespace("http://www.w3.org/2005/Atom");
変数「ns」にNamespaceを格納します。
trace(xml.ns::entry[0].ns::title);
パースしたい箇所の「ns::」を記述することで、Namespaceが適応され、つぶやきの内容を出力することができます。

まとめるとこんなかんじです。

var ns:Namespace = new Namespace("http://www.w3.org/2005/Atom");
var loader:URLLoader = new URLLoader();
var xml:XML = new XML();
var request:URLRequest = new URLRequest("http://search.twitter.com/search.atom?q=%23CS5_jp");
loader.load(request);
loader.addEventListener(Event.COMPLETE, loadComplete);
function loadComplete(e:Event):void {
	xml = new XML(e.target.data);
	//つぶやきをパース
	for(var i:int = 0; i<xml.ns::entry.length(); i++){
		//つぶやき文章
		trace(xml.ns::entry[i].ns::title);
		//投稿者のアイコン写真
		trace(xml.ns::entry[i].ns::link.@href[1]);
	}
}

FlashコンテンツをCSVファイルで更新する方法

Flashコンテンツを更新する時に、アプリをわざわざ立ち上げずに外部にXMLファイルやテキストファイルを更新する方法とかが一般的だと思いますが、要素が増えていくと管理自体が大変だったり、データを作るのが大変だったりします。そこで考えたのが、Excleなどで入稿データを管理し、CSVファイルに書き出したものをFlashが読み込むことができないものか。調べてみると方法がありましたのでメモります。ActionScript3.0でCSVファイルを読み込む方法です。

文字コードに気をつけましょう!

ExcelからCSVに書き出したファイルは、おそらくShift-JISに文字コードがなっていると思います。書き出したCSVファイルを、文字コードが変更できるテキストエディタで保存しなおすのは、ちょっとだけナンセンスなんで、下記のサンプルコードには文字コードをUTF-8に変換するJcodeライブラリを使わせていただきます。よっぽどのことがない限りないと思いますが、これでCSVファイルの文字コードがEUCの場合でも変更できます。もし、余計なライブラリを読み込みたくないー!場合は、System.useCodePageをtrueにしましょう。

Jcode.asはここからダウンロードできます。
http://web2memo.blog120.fc2.com/blog-entry-221.html

package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.net.URLRequest;
	import flash.net.URLStream;
	import flash.utils.ByteArray;
	//Jcodeインポート
	import com.web2memo.text.Jcode;
	public class csvParser extends Sprite {
		public static  const LOAD_COMPLETE:String = "load_complete";
		//CSVパース
		public var csvArr:Array = new Array();
		//コンストラクタ
		public function Main() {
			//CSVファイルのパス
			var csvUrl = new URLRequest("http://localhost/csv/test.csv?p="+new Date().getTime());
			var csvStreamr:URLStream = new URLStream();
			csvStreamr.load(csvUrl);
			//イベント設定
			csvStreamr.addEventListener(Event.COMPLETE, csvLoaderComplete);
		}
		//読み込み完了
		function csvLoaderComplete(event:Event):void {
			var stream:URLStream = URLStream(event.currentTarget);
			var bytes:ByteArray = new ByteArray();
			stream.readBytes(bytes, 0, stream.bytesAvailable);
			//文字コード変更
			var csvData:String = Jcode.getInstance().SJIStoUTF8(bytes);
			csvArr = parseCSV(csvData);
			//出力
			var n:uint = csvArr.length;
			dispatchEvent(new Event(LOAD_COMPLETE));
		}
		//パース&多重配列化
		function parseCSV(str:String):Array {
			//CSVの配列
			var arr:Array = new Array();
			//改行コードをすべて「\n」に
			str = (str.split("\r\n")).join("\n");
			str = (str.split("\r")).join("\n");
			//改行ごとに区切る
			var theFileArray:Array = str.split("\n");
			//最終行が空白の場合は削除
			if (theFileArray[theFileArray.length - 1] == "") {
				theFileArray.pop();
			}//項目名
			var theFieldNames:Array = removeWQuotes(theFileArray[0]).split(",");
			//trace(theFieldNames)
			//項目数
			var numberOfFields:uint = theFieldNames.length;
			//項目処理
			for (var j:uint=0; j< theFileArray.length; j++) {
				var tempArray = removeWQuotes(theFileArray[j]).split(",");
				var tempObj = new Object();
				for (var k:uint = 0; k < numberOfFields; k++) {
					//各データを項目名に合わせてオブジェクト化
					tempObj[k] = removeComma(tempArray[k]);
				}
				//1行の情報を追加
				arr.push(tempObj);
			}
			return arr;
		}
		//カンマの整形
		function removeComma(str:String):String {
			str = (str.split(";:;")).join(",");
			if (str.charAt(0) == '"' || str.charAt(0) == "'") {
				return str.substr(1,str.length - 2);
			} else {
				return str.split(";:;").join(",");
			}
		}
		//ダブルクォートの整形
		function removeWQuotes(str:String):String {
			var tempArr:Array = str.split('"');
			if (str.charAt(0) == '"') {
				for (var i:uint = 0; i < tempArr.length; i = i + 2) {
					tempArr[i] = (tempArr[i].split(",")).join(";:;");
				}
			} else {
				for (var j:uint = 1; j < tempArr.length; j = j + 2) {
					tempArr[j] = (tempArr[j].split(",")).join(";:;");
				}
			}
			return tempArr.join('"');
		}
	}
}

メインタイムラインの記述

上記のActionScriptをコピペしたら、「csvParser.as」というファイル名で保存します。flaファイルと同じディレクトリに置いたら、メインタイムラインに下記のように書きます。

//変数CSV_DATAに格納される
var CSV_DATA:csvParser = new csvParser();
//ロード完了時のリスナー登録
CSV_DATA.addEventListener(csvParser.LOAD_COMPLETE,onLoadConplete);
//csvArrに2次元配列が入っているので、こんな感じにパースできます
for (var i:int = 0; i<CSV_DATA.csvArr.length; i++) {
		trace(CSV_DATA.csvArr[randAry[i]][0]);
		trace(CSV_DATA.csvArr[randAry[i]][1]);
		trace(CSV_DATA.csvArr[randAry[i]][2]);
}

ActionScriptライブラリTweenerでBlurの使い方

ActionScriptのトゥイーン制御ライブラリTweenerの使い方の補足です。

ぼかし、ブラーをTweenさせようと思ってもエラーが出る。

## [Tweener] Error: The property '_Blur_blurX' doesn't seem to be a normal object property of [object MovieClip] or a registered special property.
## [Tweener] Error: The property '_Blur_blurY' doesn't seem to be a normal object property of [object MovieClip] or a registered special property.

Tweenerライブラリを読み込む「import caurina.transitions.Tweener;」この記述の下に、ぼかしフィルターを適応させるライブラリをimportさせる記述書いて、初期化をする関数を実行させる必要があります。

//▼ぼかしフィルターのimport
import caurina.transitions.properties.FilterShortcuts;
//▼ぼかしフィルターの初期化
FilterShortcuts.init();
//▼ぼかしTween
Tweener.addTween([instance],{alpha:1,
					transition:'easeOutQuint',
					time:5,_Blur_blurX:20,
					_Blur_blurY:20})

サンプルサイトなどでコピペしてエラーが出た方は、これの記述があるか見てみてくださいー。

AS3で文字コードのShift_JISを設定するSystem.useCodePageのエラー

外部テキストファイルやCSV、XMLファイルをFlashに読み込んで表示する。そんなコンテンツはいっぱいあると思いますが、shift-jisの場合は日本語が正しく表示されないので「System.useCodepage」というおまじないを書きます。

1119: 未定義である可能性が高いプロパティ useCodepage に静的型 Class の参照を使用してアクセスしています。

ActionScript3.0でこんなエラーが出たら、「page」の「p」を大文字に変えてみてください。たったこれだけではまってしまいました。。orz

//as3
System.useCodePage = true;
//as2以下
System.useCodepage = true;

AS3で入れ子になったMovieClipからrootの関数を実行する方法

今度は久々にFlashに関して

AS2までは、入れ子になったMovieClipから一番上にあたる「_root」に対して、そこのタイムラインに書かれているScriptの関数を叩く際には、「_root.hoge();」と書けば、「function hoge(){}」関数が実行できました。

AS3になって、XもYもrootもアンダーバー「_」をつけなくなり、入れ子になったMovieClipからアンダーバーのない「root.hoge();」で関数を実行できるのかとおもったっら違うみたいでした。。。今更感がいなめないですが、、メモします。

MovieClip(root).hoge();

ActionScript3.0の場合は、このように書くとhoge関数が実行できました。rootも1つのMovieClipですよー!っていうことですね。もう忘れないw

補足

この方法でアクセスできなかったパターンがありました。

TypeError: Error #1034: 強制型変換に失敗しました。flash.display::Stage@4e9df99 を flash.display.MovieClip に変換できません。

このようなエラーが出てしまい、タイムラインに書いている関数にアクセスすることができませんでした。条件は下記のとおり。
1.リンケージでクラスを作ってmyMcにする。
2.new myMc();をstage.addChild();する。
3.作ったクラスの再生途中でMovieClip(root).hoge();関数が実行できない。

var mc:MovieClip = new myMc();
stage.addChild(mc);
//▼myMcの中にある関数でここを実行
function hoge():void{
	trace("ほげ");
}

原因は、addChildする場所に問題があるみたいです。この例ではstageに対してaddChild();していますが、メインのタイムラインに書いてある関数はrootに対してアクセスすることができるので、stageはMovieClipに変換できません。というアラーとっぽいです。rootはタイムラインを含むでっかいMovieClipなので、リンケージで設定したクラスに書かれている関数でメインのタイムラインに書いているfunctionにアクセスしようとするには、newしたクラスのMovieClipはMovie(root)にaddChildしてあげなければなりません。

var mc:MovieClip = new myMc();
MovieClip(root).addChild(mc);
//▼myMcの中にある関数でここを実行
function hoge():void{
	trace("ほげ");
}

こうかくことによって、hoge();にアクセスすることができます。もうお気づきかと思いますが、addChild();の前に何も書かなくても大丈夫です。でも、なんか気持ち悪いですよね。前面背面にアクセスしたいときに、どこにaddChild();したかわからなくなりますよね。その場合は、タイムラインはでっかいMovieClipなんで、自分自身を指す「this」と書いてあげるとわかりやすいかもしれません。

var mc:MovieClip = new myMc();
this.addChild(mc);
//▼myMcの中にある関数でここを実行
function hoge():void{
	trace("ほげ");
}

説明がながくなっちゃいましたが、ようはstageにaddChildしなければ大丈夫です。

ActionScript2とActionScript1で正規表現が使えるライブラリ

だいぶごぶさたしてました。。。最近はJavaScriptやCSSを触ることが増えてきましたけど、久しぶりにFlashについて書こうとおもいます。ActionScript3になってから正規表現がサポートされましたが、ActionScript2、1では使うことができません。それを使えるようにするライブラリを見つけたので簡単に紹介します。

ライブラリ配布サイト:http://www.jurjans.lv/flash/RegExp.html
ここのページで、まず最初にはまってしまいましたのが、AS1とAS2で使用するライブラリの種類が違いました。
AS1用:RegExp.zip
AS2用:RegExp_JLott.zip
このzipファイル名を探してダウンロードしてください。解凍したzipファイルの中にあるasファイルをドキュメントルートに設置して、スクリプトで読み込めるようにしておいてください。

RegExサンプルコード AS2

import RegExp;
var regexp = new RegExp("([^?]*)");//←括弧のなかに正規表現パターンを入れる
result1 = regexp.exec("ここにテキストを入れる");//パターンにマッチした部分を摘出
result2 = "検索する文字列".replace(regexp,"置き換えたいテキスト");//パターンにマッチした置き換え

いろんな参考ページをみたときに、new RegExpの第2引数になんらかのStringを入れていましたが、いまいち用途もわからず、なくても正しく動きましたので今回は省きました。

RegExサンプルコード AS1

#include "RegExp.as"
var regexp = new RegExp("([^?]*)");//←括弧のなかに正規表現パターンを入れる
result1 = regexp.exec("ここにテキストを入れる");//パターンにマッチした部分を摘出
result2 = "検索する文字列".replace(regexp,"置き換えたいテキスト");//パターンにマッチした置き換え

正規表現というのはとても便利でいいんですが、僕はいまいち使いこなせていないです。。^^;

それではまたー

5月27日までAdobe Creative Suite 4 Web Standardを買っておこう!

明日に迫ったAdobe Creative Suite 5。Adobe Creative Suite 4シリーズがAdobe Storeで購入できるのは今日までとなってしまいました。CS5発表の時に話題となった一番安くCreative Suite 5 Web Premiumを購入する方法をおさらいします。

Creative Suite 5 Web Premium購入までの流れ

1.Dreamweaver CS4 をダウンロード購入します。49,875 円

2.Creative Suite 4 Web Standardにアップグレードします。75,000 円

3.Creative Suite 5 Web Premium無償アップグレード申請をする。0円

4.111,375円お得!!

CS5ではWeb Standardが廃止され、Web Premiumに統合されました。新規でCS5 Web Premiumを購入すると236,250 円かかりますが、この手順で購入すると124,875円で111,375円お得です。もちろん、既にCS4をもっている方は普通にアップグレードすれば遠回りする必要はありませんが、CS3からのアップグレードするかたは、128,000 円なので、3,125円お得です。

「んじゃそれぐらいのお金やったらええわー!」ってなるかもしれませんが、Flashという曲者アプリを思い出してくださいw flaファイルのバージョンを落として納品して欲しい。と言われたことがあると思います。そうすると、CS3からCS5にアップグレードしてしまうとCS4が抜けている為、今後CS5で保存したflaファイルをCS3に落とすことができなくなってしまいます。

CS4も手に入って、かつFlashの下位バージョンも手に入る。たぶん、これはすごくお得だと思います。
CS4の購入は5月27日今日までなのでお忘れなく!!(ボクはもう買いました)

>>新製品・新バージョン発表後の無償アップグレードポリシーについて
http://kb2.adobe.com/jp/cps/740/740.html