Adobe EDGE newsletter第7回
『大重美幸のこれ見落としてませんか? ActionScript 3.0』
『TextBlockクラスで多彩な文字表現』が公開されました。
テキストを自由にアニメーションさせたい、もっと美しい文字でテキストを表示したいと思ったとき、テキストフィールドでは難しい場合があります。その悩みを解決するのがFlash CS4から搭載された新テキストエンジンです。今回は新テキストエンジンを使うためのTextBlockクラスにチャレンジです!
package {
public class Friend4 {
//クラスプロパティ
public static var seqNo:uint;
public static var friendList:Array=new Array();
//インスタンスプロパティ
public var no:uint;
public var name:String;
public var age:uint;
//コンストラクタ
public function Friend4(na:String,ag:uint) {
no= ++seqNo;
name=na;
age=ag;
//インスタンスのリストに参照を保管する
friendList.push(this);
}
//
// クラスメソッド
//
//平均年齢を求める
public static function getAgeAverage():Number {
if (friendList.length==0) {
return 0;
} else {
var ageSum:uint;
//年齢の合計を出す
for (var i:int=0; i<friendList.length; i++) {
var friend:Friend4=friendList[i];
ageSum+=friend.age;
}
//平均を計算する
var ave:Number=ageSum/friendList.length;
//小数点2位で四捨五入する
ave=Math.round(ave*10)/10;
return ave;
}
}
//最年長を求める
public static function getOldestProfile():String {
if (friendList.length==0) {
return null;
} else {
//friendListの複製
var tmpList:Array=friendList.slice();
//年齢でソートする
tmpList.sortOn("age",Array.NUMERIC);
//最後の人を取り出す
var oldest:Friend4=tmpList[tmpList.length-1];
//プロフィールを返す(インスタンスメソッドの実行)
return oldest.getProfile();
}
}
//
// インスタンスメソッド
//
//プロフィールを返す
public function getProfile():String {
var info:String="no."+no+" "+name+"、"+age+"歳です。";
return info;
}
}
}
→ファイル一式をダウンロードする。
//読み込む画像ファイルを指定する
var url:String = "image/IMG_8171.jpg";
var urlReq:URLRequest = new URLRequest(url);
//ローダーを作る
var photoLoader:Loader=new Loader();
photoLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded);
//画像を読み込む
photoLoader.load(urlReq);
//画像を表示する
photoLoader.x = 100;
photoLoader.y = 50;
addChild(photoLoader);
//ドロップシャドウを付ける
var dsf:DropShadowFilter=new DropShadowFilter();
dsf.alpha = 0.8;
photoLoader.filters = [dsf];
import fl.transitions.Tween;
import fl.transitions.easing.*;
var tw:Tween;
//フェードインで表示する
function onLoaded(eventObj:Event):void {
tw = new Tween(photoLoader,"alpha",Regular.easeInOut,0,1,1,true);
}
//イベントリスナーの追加
box_mc.addEventListener(MouseEvent.ROLL_OVER, onRollover, true);
box_mc.addEventListener(MouseEvent.ROLL_OUT, onRollout, true);
//ロールオーバーのリスナー関数
function onRollover(eventObj:MouseEvent):void {
var target_mc:MovieClip=eventObj.target as MovieClip;
target_mc.scaleX=target_mc.scaleY=3.0;
}
//ロールアウトのリスナー関数
function onRollout(eventObj:MouseEvent):void {
var target_mc:MovieClip=eventObj.target as MovieClip;
target_mc.scaleX=target_mc.scaleY=1.0;
}
//イベントリスナーの追加
face_mc.addEventListener(MouseEvent.CLICK, onClick);
//クリックのリスナー関数
function onClick(eventObj:MouseEvent):void {
var target_mc:MovieClip=eventObj.target as MovieClip;
target_mc.rotation+=30;
}
カエルの顔すなわちface_mcをクリックすると顔全体が回転します。つまり、targetはface_mcということになります。
//イベントリスナーの追加
face_mc.addEventListener(MouseEvent.CLICK, onClick);
//クリックのリスナー関数
function onClick(eventObj:MouseEvent):void {
var target_mc:MovieClip=eventObj.currentTarget as MovieClip;
target_mc.rotation+=30;
}
→swfを試す
package {
import flash.display.MovieClip;
import flash.events.Event;
public class FlowerA extends MovieClip {
public function FlowerA() {
addEventListener(Event.ENTER_FRAME, enterFrameHandler );
}
protected function enterFrameHandler(eventObj:Event):void {
rotation += 3;
}
}
}
//同じイベントに同じリスナー関数を重ねて追加する
a_mc.addEventListener(Event.ENTER_FRAME, stepRotationA);
a_mc.addEventListener(Event.ENTER_FRAME, stepRotationA);
a_mc.addEventListener(Event.ENTER_FRAME, stepRotationA);
a_mc.addEventListener(Event.ENTER_FRAME, stepRotationA);
//b_mcには1度しか追加しない
b_mc.addEventListener(Event.ENTER_FRAME, stepRotationB);
//回転させる
function stepRotationA(eventObj:Event):void {
a_mc.rotation+=2;
}
function stepRotationB(eventObj:Event):void {
b_mc.rotation+=2;
}
//stepZoomで比率を変化させるための角度
var degree:int;
//同じイベントに別のリスナー関数を重ねて追加する
f_mc.addEventListener(Event.ENTER_FRAME, stepRotation);
f_mc.addEventListener(Event.ENTER_FRAME, stepZoom);
//回転させる
function stepRotation(eventObj:Event):void {
f_mc.rotation+=2;
}
//伸縮とアルファ変更
function stepZoom(eventObj:Event):void {
degree=(degree+2)%360;
//回転角度で比率を変える
var ratio:Number=Math.abs(Math.sin(degree*Math.PI/180));
//伸縮
f_mc.scaleX=f_mc.scaleY=1+9*ratio;
//アルファ変更
f_mc.alpha=Math.max(0.02,1-ratio);
}
1.どこで
2.何が起きたら
3.どうする
1.イベントターゲット ・・・・ イベントが発生するオブジェクト
2.イベントタイプ ・・・・ 発生するイベントの種類
3.リスナー関数 ・・・・ イベント発生で実行する関数
1.イベントターゲット ・・・・ box_mc
2.イベントタイプ ・・・・ クリック
3.リスナー関数 ・・・・ test()
イベントターゲット.addEventListener(イベントタイプ, リスナー関数);[:note:] addEventListener()には引数がまだありますが、ここでは省略しています。
box_mc.addEventListener(MouseEvent.CLICK, test);
//クリックで実行されるリスナー関数
function test(eventObj:MouseEvent):void {
trace("test OK");
}
そこで、test()でbox_mcの現在の回転角度つまりbox_mc.rotationに45度を加算すれば、box_mcをクリックするたびにbox_mcが45度回転するようになります。
box_mc.addEventListener(MouseEvent.CLICK, test);
//クリックで実行されるリスナー関数
function test(eventObj:MouseEvent):void {
//box_mcを45度回転させる
box_mc.rotation += 45;
}