2012年3月16日金曜日

セミナー「ActionScript 3.0 パフォーマンスチューニング 」のサンプル007_capture_phaseについて

2012.2.15のセミナーで使用されたサンプルをダウンロードさせていただいた。
掲載いただけるとはありがたいことである。

その中のひとつ007_capture_phaseについての覚書。

このサンプルはcaptureについて説明するためのものであるが、
子にイベントを設定せず、親だけでコントロールしている、ということも特徴だ。

これまでの私の製作方法は
1.ボタン専用のクラスを作り、
2.その中でエフェクトなどのメソッド作成し
3.そのクラスにマウスイベントを付与していた
4.さらに個別にマウスイベントの起動・解除メソッドを設定親またはメインのスクリプトでマウスイベントの起動・解除を設定していた

一方今回の方法を使うと
・ボタンは単純なグラフィックで構成される要素だけにし、
・エフェクトはメソッドで作成、そこに操作対象(ここではボタンmc)を渡す
という手法が使える(クラスメソッドにしてもよいと思うが、クラスメソッドとかクラス変数はインスタンスと違ってnewでクリアされず残ってしまうので、わざわざ初期化メソッドを作らなければならないので面倒かも)

また、驚いたことにaddEventListenerの第3引数:captureをtrueにすると
そのaddEventListenerを設定したオブジェクト自身はターゲットにならず
イベント配信を行わない。
試しにサンプルのflaファイルにGroup(mc)のボタン群の背景に壁紙を敷いてみたが、
クリックしても反応はない。
ちなみに、サンプルファイルのxChange内に以下のスクリプトを記載したところ
trace(eventObject.target.name  , eventObject.currentTarget.name);
のスクリプトを記載したところ
//target : my0_mc ~my3_mc  currentTarget : instance1(親) 
の結果となった
target :まさにクリックされた対象
currentTarget : イベントを設定した対象
と覚えておく

2012年3月11日日曜日

音楽

「面白い音楽いっぱい知ってるね。今度教えてよ」
仲間の一人が言った。彼は答えなかった。
当然だろう。その曲がいい、と思ったわけではなくファッショナブルと感じただけだったからだ。

2012年3月3日土曜日

休眠口座が話題になりましたね。

一体だれが言い出したんだろう?と思っていたら。
提案したのは大前研一氏でした。以下に詳細が書かれています。

〔大前研一「ニュースの視点」〕
KON403「本四連絡道路と休眠口座~真剣に「活用する」ことを考える」

http://www.lt-empower.com/koblog/viewpoint/1795.php


気になる点が。

--------------------------------------------------------------------------------------------------------


 銀行が「顧客のお金だから」と反発しているそうですが、
 銀行こそ最も出る幕がない立場にいます。


 現在、日本では10年利用しない口座(休眠口座)のお金の中には
 「一旦銀行の利益として計上」されているものがあります。
 顧客のお金を奪うなと言いながら、自分たちの利益としているのですから、
 開いた口がふさがらないとはこのことです。

--------------------------------------------------------------------------------------------------------



負債として計上しつづけた方が銀行としては有利かと。利益計上すること無く資金運用できますし。にも関わらず利益にするってことは、長期間負債に計上し続けることに会計上の問題があるのでは?と想像してました。
このあたり詳しい人いたら教えて欲しい。
この件に限って言えば銀行の主張の方がわかりやすく感じますね。当然預金者のお金だと思います。













2012年3月2日金曜日

Javascript 第5版進捗

17章4 p438 Tooltip

2012.03.03 このスクリプトは実行できない。
最初のTooltip.X_OFFSET=25 でエラーとなる
→クラス生成が無いため、宣言されてませんエラーと推測。function Tooltip(){}を追記する
→timer内 function(){self.show(text , x , y);} ,のshowがエラーに
これについての記載がサンプルプログラムには無い。jQueryから持ってくるのか?
またself(thisが格納されている)はfunctionのため、隠すようなもんでもなさそう。本来targetが入るのでは?

Tooltip.X_OFFSET=25 ; //マウスポインタから何ピクセル右にするか
Tooltip.Y_OFFSET=25 ; //マウスポインタから何ピクセル下にするか
Tooltip.DELAY=500; //MOUSEOVERの何ミリ秒後に表示するか

ESET Smart Security V5.0 ダウンロード版の使い方

セキュリティソフト ESET Smart Securityは更新より新規購入したほうが安いのだが、手続きが少々わかりづらいのでメモしておく。

1.期限切れ警告からキヤノンのサイトにアクセスする。
2.希望の購入セットをクリックする(1年用やら3年やら3PC×1年やら)
3.キヤノンからVECTOR(もう一個あるが今回はVECTORをチョイス)のサイトに飛ぶ
4.コンビニ払いで購入
5.支払済みメールが来るまで1時間程度かかる
6.シリアル番号が届く(VECTORの場合、ライセンスと表現されているから注意)
7.キヤノンの下記サイトにアクセスし、ユーザ名・パスワードを取得する
「ESET Smart Security V5 新規登録」
http://canon-its.jp/cgi-bin/esetreg.cgi?urlflg=1&serial_no=&mode=000500&provide=CITS&version=5.0.93.16
(V5の場合。これ以降の版数の場合は調査のこと)

9.nod-reg@canon-its.jpから登録先メールアドレスにユーザ名・パスワードが届く
10.バージョンアップしている場合は新バージョンを上書きインストールする
11.右下アイコン右クリックでアクティベーションを選択し、ユーザ名・パスワードを入力する
12.ESETを起動し、ウィルス定義データのアップデートを実施する
13.ようやく右下アイコンのビックリマークや危険(赤)表示が消える

2012年2月25日土曜日

セミナー「ActionScript 3.0 パフォーマンスチューニング 」覚書

「ActionScript 3.0 パフォーマンスチューニング - 速い、軽い、 うまいスクリプティングを目指す」
講師:野中文雄氏
http://www.jagra.or.jp/schoolblog/2012/01/actionscript-30-1.html

非常に良いセミナーであった。上手い人に教わるとこんなにわかりやすいものかと感動。
忘れないうちに覚書き。


◆Mathクラスについて
「Math.floor()よりint()を用いる 」

またbitmapDataに粒子等を描く場合や、ビットマップ自体を配置するとき小数点以下ピクセルだと画像がにじので、整数化に使ってた。

「Math.max() , Math.min() , Math.abs()は3項演算子で置き換える」
maxNum=Math.max(a , b) → maxNum=(a>b) ? a: b;
minNum=Math.min(a , b) → minNum=(a<b) ? a : b ;
absNum=Math.abs(a )   → absNum=(a<0)? -a : a ; 
で代用する。
『ただしMathの名誉のために言えば』(野中氏の言葉そのまま)
Math.max()やMath.min()などは複数の数が引数にできるので、たくさんの数のうち最も大きいのを調べていときは、Math.max()を用いたほうが速い。
maxNum=Math.max(a , b , c , d , …) ; 

◆距離計算
「PointクラスメソッドのPoint.distanceを用いるより三平方の定理を用いる」
Point.distance(begin , end)→
var dx=endX-biginX ; 
var dy=endY-biginY ;
var distance=Math.sqrt(dx*dx + dy+dy);
一方、3次元の場合に用いるvector3D.distance()も同様
var dx=endX-biginX ; 
var dy=endY-biginY ;
var dz=endZ-biginZ ;
var distance=Math.sqrt(dx*dx + dy*dy+dz*dz);
最後は立方根ではなく平方根を用いることに注意(なぜ?ってのはいまだ理解できてない…)。

◆イベントリスナー
「複数のENTER_FRAMEはひとつにまとめる」
enterframeイベントで動作を記載したmcを複数生成している場合は
ルートのタイムラインなどでまとめて記載する
mc内
addEventListener(Event.EnterFrame , myEnterFrame );
function  myEnterFrame (event:Event):void{
   y+=0.5;
}
mc
root.addListeners(myEnterFrame);
function myEnterFrame(event:Event):void{
  y+=0.5;
}

rootタイムライン
//各mcのメソッド(元enterFrame)格納用のVectorを作成する
var listeners:Vector.<Function>=new Vector.<Function>();
//mcから以下のメソッドを呼び出してそれぞれの更新メソッドを格納する
function addListeners(listener:Function):void{
   listeners.push(listener);
}

//唯一のenterFrameリスナーを設定する
addEventListener(Event.EnterFrame , myEnterFrame);

//EnterFrameを以下で一括動作する
function myEnterFrame(event:Event):void{
  for(var i:int=0  ; i<listeners.length ; i++){
      var myFunction:Function=listeners[ i ] ;
      myFunction(event) ; 
//ここで引数にeventを設定することにより、mc内のメソッドを書き換えなくてよくなる
      //私見:mc内をfunction myEnterFrame(event:Event=null)としておいてもよいかと。
  }
}

◆マウスイベント
「ActionScript3 から無くなったreleaseOutsideはバブリングで判定することにより対応」
入れ子になったmcで
function Test() {
stage.addEventListener(MouseEvent.MOUSE_OUT , stageOut);
addEventListener(MouseEvent.MOUSE_OUT , myOut);
addEventListener(MouseEvent.CLICK , onClick);
}
function onClick(event:MouseEvent):void {
//stage.addEventListener(MouseEvent.MOUSE_OUT , stageOut);
//親ははずさないので親のリスナーだけ生きる
removeChild.addEventListener(MouseEvent.MOUSE_OUT , myOut);
}
といった感じ?実際に後でやってみる。

◆オブジェクトの使い回し
「matrixはnewで都度作らず初期化して再利用」
var matrix:Matrix=new Matrix()で都度生成し、画像などを回転するよりも、
matrix.identity()で初期化してあらたなパラメータを与えて使った方が速い。
「配列も初期化して再利用」
var array=new Array() ;
…処理後

array=new Array()ではなく
array.length=0; で初期化することができる

◆ポリフォーリズム
「見た目は一緒だけど動作が違う」
3つの画像にて説明
Clip1はx回転、Clip2はy回転、Clip3は拡大縮小の繰り返し
switch(mc) {
case clip1:
clip1.rotationX += angle;
break;

case clip2:
clip2.rotationY += angle;
break;
case clip3:
clip3.scaleX = Math.cos(angle++)*1;
clip3.scaleY = Math.cos(angle++)*1;
break;
}

ではなく子の中にそれぞれ以下の記述をし、
//clip1
private function update():void {
rotationX += angle;
}
//clip2
private function update():void {
rotationY += angle;
}
//clip3
private function update():void {
scaleX = Math.cos(angle++)*1;
scaleY = Math.cos(angle++)*1;
}
親では
function xMove():void{

}
function xMove():void{
for(var i:int=0 ; i<mcs ; i++){
 var mc:MovieClip=mcs[ i ];
 mc.xMove();
}
}
で済ませることができる。
このxMoveという同一のメソッド名を用いることがミソ。
同一名称で各々の動作が違う=ポリフォーリズム(多態性)だそうだ。

◆インターフェース
上記例ではそれぞれのmcがxMoveと名前のメソッドを持っていることが前提になる。
もし大規模開発で他社がmcを作ったり自分が作っても間違えてxmoveとしたりしたらエラーとなってしまう。そこでインターフェースを用いる。

//インターフェースは以下の様に記載する
package {
public interface IClip {
//必須のメソッドの引数とその型、
 //返しがある場合はその型を記載する
function xMove(angle:Number):void
function xStop():void
}
}
//インターフェースは以下のように利用する
public class Test extends Sprite implements IClip{
function Test() {

「インターフェースは型としても使える」
以下の例の場合
function xMove():void{
for(var i:int=0 ; i<mcs ; i++){
  var sp:Sprite=sprites[ i ];
  sp.xMove();   →spriteはxMoveメソッドを持っていないのでエラーになる
}
}
そこで
function xMove():void{
for(var i:int=0 ; i<mcs ; i++){
  var sp:IClip=sprites[ i ]; //なんとinterfaceは型指定としても使える!
  sp.xMove();   
}
}
今までクラスを配列化してたり、やる必要もない(しかも不安定?な)継承をしていたのは何だったのか!

◆メモリの開放
「基本はFlashのガベージコレクションにまかせる」
なるべく削除
removeChild
removeEventListener
MovieClip.stop()
=null
を用いて参照を解き、ガベージコレクションを待つ。
が強制的に使えるものとして
System.gc();
System.disposeXML();
System.totalMemory();
var bmd:BitmapData = new BitmapData();
bmd.dispose();
などがある。
Player11以降はガベージコレクションのしきい値(頻繁にやったり、ここではやらんといてとお願いしたり)できるらしい。
これらは次期Flashを入手してからトライしよう。

書籍も近日購入予定。