ラベル AS3 の投稿を表示しています。 すべての投稿を表示
ラベル AS3 の投稿を表示しています。 すべての投稿を表示

2014年7月5日土曜日

新しいことを始めるときは。

新しいことを始めるとき。
今回は、AppMethodに挑戦なのですが、
プログラミングに限らず、新しいことを始めるときは、
大きく2つの方法があると思ってます。
(1)基礎から徹底的に学ぶ
(2)何かの目標をつくって、その最短距離を学ぶ。

もちろん、子供が勉強するかのごとく、(1)は良い方法というか、王道です。
しかし、大人がピアノを習うときは、(1)だと絶対めげちゃうんですよ。
だから、(2)なのです。
ハノンもやらず、『ピアノのテクニック』もやらず、
【弾きたい曲をなんとか仕上げる】
という方法をとるべきです。

ということで、【つくってみたいアプリをとにかく完成させる】ことを目標とし、
(2)の方法でAppMethodを学びます。
そして、都度、必要に迫られたときに、基本的なことを学びます。

ツール類は、最低条件として、ひととおりつかえることが大前提なので、

●STEP1
Wizardにでてくるものは、ひととおり、何もせずに(追加をね)、BUILDして実行してみる。
これです↓↓


●STEP2
『サンプル』として提供されてるものから、明らかに興味を引かないもの以外を、
BUILDして実行してみる、
これです↓↓


そこらへんを前準備としてやった後に、作りたいものを開始です。

私の場合は、最初に設計することをしません。
最後まで見通せるほど、普通の人間は、頭がよくないからです。

よく、SIerさんで、【要件定義】-【設計】-【詳細設計】-【実装】-
なんていうSTEPを、全て違う責任者がいたりして、
文書を書いてハンコをもらわないと進めなかったりして、
挙句の果てに、設計ミスがあっても戻れずに、
結果、ぐでぐでになるなんていうのは、
大きな企業ほどありがちです。
っていうか、あります。
っていうか、ありすぎます。

技術も流行りもめまぐるしくかわってる時代に、
いい年のおっちゃんがハンコを押したって、何もなりません。

まぁ結論から言えば、
設計書というのは、アプリが出来上がってから書くものなのです。

っと、話はそれましたが、
若い人には、
『常に美しい方法を選択し、感性でプログラムを書きながら、全体像を設計』
してほしいと思いますですね。
これでいいのです。
絵にすれば、こうです。(o^^o)










2012年11月26日月曜日

千社札再び。

ということで、ひさびさの更新になってしまいまして(-_-;)

こんなのをつくってみました。


GUIで文字は入力しづらいので(マスクやらなにやらあるから。。)一括入力します。



分解するとこうなってます。


図形(ポリライン)部分


文字部分


マスク部分


全体のObjectTree


家紋の画像は、都度つくるのはめんどいので、
【グレイスケールPNGで作成して、階調をアルファチャンネルに変換して、RGBで色をのせる】
ということをやってます。


2012年4月16日月曜日

FLEXで本のページをめくるように見えるGUIな件。の2

とりあえずの完成形。
こんな感じで。

なんでいまさらこんなのつくったのかって、、、だから、、、
10000ページでも右綴でも左綴でも天綴でもできるようにしたからです。


その1

その2

2012年4月5日木曜日

FLEXで本のページをめくるように見えるGUIな件。

よくありがちな、FLEX(FLASH)で、ページをめくる的なGUIが必要となり、
作ってみました。
もちろん、いろいろ探したのですが、用途に合うものは皆無のため、自分でつくりました。
用途 → 10000ページでも動作すること。
要するに、動的に画像を取ってくるところや、右綴じ、左綴じ、天綴じなんかができるということですね。
ってことで、技術的には、三角関数を使って、座標を求めたりします。

読み込んでおくべき画像は、最低6面分ですね。
まぁ下の絵をみたらわかります。
ページをめくろうとしたときの、裏とその下の画像が、左右に必要なためです。

別の問題として、透視図的に見せるとか、ページをめくるときに曲線に見せるようなことはやりません。(iPadとかやってるけどね。。)
そんなことしなくても、まぁまぁそれらしくみえます。
但し、影はつけないとそれっぽくならないので、ページの境目なんかにはそれを使います。
ドロップシャドウはやってもいいけど、負荷もかかるのでやめときます。
影アリと影なしの比較。。


で、でれでれと計算とかして、つくります。
ノートに書いてみるの図。

つづきがあるかどうかは別にして、、
つづく。

2011年12月1日木曜日

FLEXのObjectのdeleteする件の1

だいぶ更新をサボってしまった。。
さて、表題の件、かなりあれこれ迷った挙句、根本的にここらへんの仕組みを理解していなかったので、整理を含めて書いてみる。

まず、データが階層構造で存在している。(JSON)
これを、Objectに変換する。
これが、表示・編集する元データとなる。
しかし、これを表示するとなると、DisplayObjectにしなきゃいけない。
よって、それを包括したクラスを作成した。
こんな感じ。※実際にはこれをさらに派生させる。
public class spBase extends UIComponent{
。。。
public var obj:Object; // データの参照が入るよ。
。。。
//実際には、このインスタンスに、以下のように設定
xxx.obj = maindata.a[0].b.c;
要するに、
"maindata":{
  "a":[
   {
   "b":{
    "c":{
       "dat1":1,
       "dat2":2,
       "dat3":3
     },
     "c2":{
       "cat1":1,
       "cat2":2,
       "cat3":3
     }    
    }
   }
  ]
}
って感じで。
で、何がやりたいかというと、xxxインスタンスを削除し、maindata.a[0].b.c;を無きものにしたいのだ。
xxxインスタンス自体は、xxx.parent.removeChildAt(zz);
で消せる。しかし、そんなことをやっても、maindata.a[0].b.cは、生きてる。
ここから、悪戦苦闘が始まるのだ。

テスト開始
item:Object = new Object;
item.obj = mainData.a[0].b.c;
で、デバッガで見た状況。
たしかに同じアドレスをさしている。

もちろん、
item.obj = {};
なんて書けば、こうなる。まぁ当然である。

でも、
trace(delete item.obj);
と書くと、こうなる。
【その1】

でも、
trace(delete mainData.a[0].b.c);
と書くと、こうなる。
【その2】

問題なのは、traceしてみると、両方ともtrueを返すことだ。
その1はいいのだが(いや、厳密には良くない気がするが。)、、、その2は、明らかに他が参照しているので、falseが返されるべきなんじゃ。。。。。
まぁどっちにしても、両方実行しないと消せないのである。

ってことは、、、参照だけもってても消せないのである。
ってことは、、、やりたいと思うことが、、できないわけである。

2011年9月8日木曜日

FLASHでGUIの4

HttpServer関連と、Loader関連をひとつのクラスにしようと思ったけど、
まぁ使い方を考えると、それぞれ別でもイイ気がしてきたので、別で。
基本はHttpServerと同じ。内部でLoaderクラスを呼ぶだけ。
Httpのときと同じように、ひとつずつ動作させる。
こんな感じで。
// ------------------------------------------------------------------------------
function spLoadImage(){
  own = this;
  init();
}
// ------------------------------------------------------------------------------
public function ldInit(e:Event):void{
  trace(e);
}
// ------------------------------------------------------------------------------
public static function getEnum(n:int):String{
  switch(n){
    case eNotBitmap:    return  "Not Bitmap Resource";
    case eIOError:      return  "IO Error";
    case eSecurityError:  return  "Securit Error";
    default:        return  "Undifiend Error";
  }
}
// ------------------------------------------------------------------------------
private function ldComplete(e:Event):void{
  trace(e);
  if(loader.content is Bitmap){
    var lp:Object = loader.content;  //  var lp:Bitmapだとエラー
    var bit:Bitmap = new Bitmap(lp.bitmapData.clone());
    lp.bitmapData.dispose();
    okFunction(localVal,bit);
  }else{
    ngFunction(eNotBitmap,  getEnum(eNotBitmap));
  }
  nextGo();
}
// ------------------------------------------------------------------------------
private function ldIOError(e:IOErrorEvent):void{
  ngFunction(eIOError,e.text);
  nextGo();
}
// ------------------------------------------------------------------------------
private function nextGo():void{
  trace("--nextGo--");
  loader.contentLoaderInfo.removeEventListener(Event.INIT,        ldInit);
  loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,      ldComplete);
  loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,    ldIOError);
  bRun = false;
  execute();
}
// ------------------------------------------------------------------------------
private function init():void{
  uVar  = new URLVariables;
  datAr  = new Array;
}
// ------------------------------------------------------------------------------
public function setData(url:String,  comtype:uint,  okRes:Function,  ngRes:Function,  args:String,method:String="POST"):void{
  datAr.unshift(
    {
      "url":    url,
      "comtype":  comtype,
      "okFunc":  okRes,
      "ngFunc":  ngRes,
      "args":    args,
      "method":  method
    }
  );
  //  Array  //  pop()  最後を取り出して削除  //  unshift(... args):uint 最初に追加
}
// ------------------------------------------------------------------------------
public function execute():void{
  setTimeout(executeSub, tInterval);
}
// ------------------------------------------------------------------------------
private function executeSub():void{
  if(datAr.length < 1){
    //  END
  }else{
    if(bRun){
      setTimeout(executeSub, tInterval);
    }else{
      trace("☆executeSub "+datAr.length);
      bRun = true;
      var o:Object  = datAr.pop();
      loader = new Loader;
      loader.contentLoaderInfo.addEventListener(Event.INIT,        ldInit);
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE,      ldComplete);
      loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,  ldIOError);
      var UR:URLRequest    = new URLRequest(o.url);
      if(o.method == "GET")  UR.method = URLRequestMethod.GET;
      else          UR.method = URLRequestMethod.POST;
      uVar = new URLVariables;  //  何か設定することになるだろう。
      uVar.args = o.args;
      UR.data=uVar;        //  
      okFunction  = o.okFunc;
      ngFunction  = o.ngFunc;
      localVal  = o.comtype;
      try{
        loader.load(UR);
      }
      catch (error:SecurityError){  //  err:Error
        ngFunction(eSecurityError,getEnum(eSecurityError));
      }
    }
  }
}
// ------------------------------------------------------------------------------

2011年9月7日水曜日

FLASHでGUIの3

FLASHのGUIといっても、当然、サーバとのやりとりが必要なわけで。
そうすると、マルチタスクのイベントドリブンのような顔をしたActionScriptではあるけど、
正しくタイムシェアリングしてるわけでもなんでもないし、
サーバとの転送量が大きい場合(データが大きい画像とか)を考えると、
1つづつ実行できるようなシステムにしたいわけですね。
といったところで、画像一覧をゲットするようなことを考えて見る。

●httpのためのクラスを作る
【仕様】
→url、データのタイプ、パラメータ、callBack関数を複数指定して、
ひとつづつhttpリクエストをかける。
100コの画像を取ってくる場合でも、必ず、ひとつずつリクエストするものとする。

いろいろやって結果、スマートかどうかは別にして、、、
タイマを使うことになってしまった。
要するに、
実行中かどうかをフラグで判定して、判定中だったら、タイマをまた設定みたいなことを繰り返す。
ActionScriptにはSleepも無いことだし。
ちょっといい加減に書きなぐったSRCがこんな感じ。

なんとなくそれらしく動く。パラメータとかTEXT系じゃないときは、次に考えます。

function spHttp(){
  own = this;
  init();
}
// ------------------------------------------------------------------------------
public function init():void{
  datAr  = new Array;
}
// ------------------------------------------------------------------------------
public function setData(url:String,  comtype:uint,  okRes:Function,  ngRes:Function,  method:String="POST",useProxy:Boolean=false):void{
  datAr.unshift(
          {
            "url":    url,
            "comtype":  comtype,
            "okFunc":  okRes,
            "ngFunc":  ngRes,
            "method":  method,
            "useProxy":  useProxy
          }
        );
}
// ------------------------------------------------------------------------------
public function execute(){
  setTimeout(executeSub, tInterval);
}
// ------------------------------------------------------------------------------
public function executeSub(){
  if(datAr.length < 1){
    //  END
  }else{
    if(bRun){
      setTimeout(executeSub, tInterval);
    }else{
      bRun = true;
      var o:Object  = datAr.pop();
      httpSV  = new HTTPService();
      httpSV.addEventListener(ResultEvent.RESULT,  okResult);
      httpSV.addEventListener(FaultEvent.FAULT,  ngResult);
      httpSV.resultFormat = "text";  //  
      httpSV.url    = o.url;    //  
      httpSV.method  = o.method;    //  httpSV.method = "POST";
      httpSV.useProxy  = o.useProxy;  //  httpSV.useProxy =false;
      uVar  = new URLVariables;
      uVar.decode("Giant=Baba");
      var at:AsyncToken = httpSV.send(uVar);
      at.id    = o.comtype;
      okFunction  = o.okFunc;
      ngFunction  = o.ngFunc;
    }
  }
}
// ------------------------------------------------------------------------------
public function okResult(event:ResultEvent):void{
  httpSV.removeEventListener(ResultEvent.RESULT,okResult);
  httpSV.removeEventListener(FaultEvent.FAULT,ngResult);
  okFunction(event);      //  本当の処理はこっちだよ
  bRun = false;
  execute();
}
// ------------------------------------------------------------------------------
public function ngResult(event:FaultEvent):void
{
  httpSV.removeEventListener(ResultEvent.RESULT,okResult);
  httpSV.removeEventListener(FaultEvent.FAULT,ngResult);
  ngFunction(event);      //  本当の処理はこっちだよ
  bRun = false;
  execute();
}
// ------------------------------------------------------------------------------

2011年9月1日木曜日

FLASHでGUIの2



とりあえず、FLASHでのGUIのobjectの階層構造。(ver1)

<TOP> MXML
  <app> 固有クラス。アプリ制御(非GUI)
  <doc> 固有クラス。doc制御(非GUI)
  <menues> MXML
  <mainArea> MXML
    <Canvas>  :Base:UIComponent 
      <Layer>  :Base:UIComponent
        <Item>  :Base:UIComponent
        <Item>  :Base:UIComponent
        <Item>  :Base:UIComponent
        <Item>  :Base:UIComponent
      <Layer>  :Base:UIComponent
      <Layer id="last">  :Base:UIComponent
  <dialog> MXML

スケールを設定して拡縮するのは<Canvas>のみ。
<Layer id='last'>には、メッシュというかGRID表示させる。
BaseはUIComponentほぼそのままだが、基本的な機能だけをいれる。
マウスイベントをうけとるかどうかのon-offとか。

あとは、かならずTOPへの参照をできるようにして、appとかdocとかを適宜参照可能にする。

やっぱ、絵の出るプログラムは楽しいよね。




2011年8月30日火曜日

FLASHでGUIの1

FLASH(FLEX)でGUIの場合に、まず、それぞれのエンティティを、
どういう形で持つかというところから始める。
もちろん、objectとして持つので、グラフィックスをもてる形でもつのは当然として、
ページがあったり、レイヤーがあったりするので、そこらへんの階層をどう考えるかだね。
データ上の階層と表示やGUI上の階層は一致させる必要がないけど、
たいがい、一致させとかないと、バグる元。
ってことで、FLASH(FLEXではなく)でやってたときは、
movieClipかSpriteでなんでもかんでもやってたんだけど、
FLEXではSpriteはそのまま使えないから、UIComponentでやることになるのかな。
それが最良かどうかは、やってみないとわからないので、
とりあえず、それで、POLYや画像を表示させたり、編集したりとかしてみて判断しよう。
ということで、ポリを書いてみることにする。

順を追うと、、こんな感じでテスト。
●UIComponentを継承した基本クラスを作る。
●その基本クラスをExtendsした、item用のクラスを作る。
●itemを動的に生成して、その中のgraphicsにポリを入れてみる。
●mouseDown-Move-Upに対応させて移動させてみる。

ここで、随分前にちょっと書いた、mouseイベントを最下層で拾うクラスを仕込んでみる。
要するに、
★itemにMouseDonwがくる

★最下層Mouseイベント用クラスの、MouseDown/Up/Moveイベントを、
itemのpublic関数に持ってくるように設定する。
 ↓
★itemにMouseDonwがくる

★処理をしたあと、イベントの転送先を削除する

で、基本クラス。
public class spBase extends UIComponent{
	public var mother:Object;
	//--------------------
	function spBase(){

	}
	//--------------------
	public function init(f:Object):void{
		mother = f;
		this.addEventListener(Event.REMOVED_FROM_STAGE, removed);
		//-------------------
		//	MouseDown
		//-------------------
		var own:Object = this;
		this.addEventListener(MouseEvent.MOUSE_DOWN,
			function (e:MouseEvent):void{
				mother.app.getKAM().setMAll(own.fd,own.fu,own.fm,own.fo);
			}
		);
	}
	//--------------------
	protected function fd(e:MouseEvent):void{
		trace("Down\n");
	}
	protected function fu(e:MouseEvent):void{
		trace("Up\n");
		mother.app.getKAM().setMClear();
	}
	protected function fm(e:MouseEvent):void{
		trace("Move ");
	}
	protected function fo(e:MouseEvent):void{
		trace("Over  ");
	}
	//--------------------
	//	like a destructer
	//--------------------
	private function removed(e:Event):void{
		removeEventListener(Event.REMOVED_FROM_STAGE, removed);
	}
}


で、itemクラスの雛形。
public class spItem extends soul.spBase{
	override protected function fd(e:MouseEvent):void{
		trace("spItem::Down\n");
	}
	override protected function fu(e:MouseEvent):void{
		trace("spItem::Up\n");
		mother.app.getKAM().setMAll(null,null,null,null);
	}
	override protected function fm(e:MouseEvent):void{
		trace("spItem::Move ");
	}
	override protected function fo(e:MouseEvent):void{
		trace("spItem::Over  ");
	}
}

で、呼ぶ時。motherは、MXMLでのthisを渡している。。(-_-;)
testobj = new soul.spItem();
testobj.init(mother);//mother:MXMLのthis







2011年2月11日金曜日

FLEXでFLASH(AS)っぽく画像を表示

FLEXで画像を読み込んで表示。一番単純にして重要な機能であるが、
FLEXのサンプルとかHowTo本を見ると、
【まずImageコンポーネントを~~】
なんていう、私の趣味とかけ離れた手法がかかれている。
まぁそれはそれとして、どうActionScriptに展開されるかを確認するのも重要だが、
ここでは、FLASH-CS3っぽく表示させてみる。
すると、こんな感じ
var loader = new Loader;
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e){
 var bmp = new Bitmap;
 bmp.bitmapData = loader.content.bitmapData.clone();
 stage.addChild( bmp );
});  
var urlfile = "http://localhost/ren2.jpg";
var UR=new URLRequest(urlfile);
UR.method = URLRequestMethod.POST;
loader.load(UR);
まぁ、いままでとなんら変わることもなく実行できましたね。
もちろん、これはこれとして、実際はクラスでキッチリ書きますYO。
まぁ実際はコンテナっぽいものを作って、そこに描画させることになるのかな。
だから、FLASH-AS3だと、Spriteかなんかで

var sp = new Sprite;
sp.addChild(bmp);
stage.addChild( sp );
的な。

でも、こんなことするなら、わざわざFLEXじゃなくて、FLASHですればいいじゃんって
ことなんですけど、、、まぁ、気分で使い分けてるだけっす。
mxなら、
var temp : mx.controls.Image = new mx.controls.Image;
temp.x = 30;
temp.y = 85;
temp.width = 205;
temp.height = 216;
temp.source = "http://localhost/ren2.jpg";
addElement(temp);
ですかねー。

2011年2月9日水曜日

マウスイベントを最下層でひろうために。

CS3の時代にFlashで作ったAS3を見返して、FLEX4で実行させてみます。
クラスとしては後述の【keyAndMouse】クラスとしました。
keyAndMouseと言いながらも、keyは、ctrlとshiftをチェックするだけです。
要するにFLASHの、階層全てにイベントが発生するという特徴をいかして、
たとえボタンをクリックしてもkeydownがとれるように使います。
何につかうかといえば、何らかのGUIとしか言いようがないですけど、
今作ってるものには必要なんで^^;^^;
ということで、使い方は、mxmlのなかで、
~~略~~
public function MD(e){
 LL.text = "--M1---" + kam.getCS();
}
public function MU(e){
 LL.text = "--M2---" + kam.getCS();
}
public function MM(e){
 LL.text = "--M3---" + (ct++) + "/ " + kam.getCS();
}
public function MO(e){
 LL.text = "--M4---" + kam.getCS();
}
~~略~~
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
 kam = new keyAndMouse(this); 
 kam.setMD(MD);
 kam.setMU(MU);
 kam.setMM(MM);
 kam.setMO(MO);
~~略~~
って感じです。
要するに、、最下層のマウスイベントを、自分のクラス内にもってきたい時につかうのです。
まぁサンプルはどっちにしても同じ階層ですけど、このkamなるインスタンスを、引数として
別のクラスとかにもってって、そこで使うことをイメージしてます。
CS3のFLASHで作ってたときは、コンストラクタの引数はthisではなくstageでしたが、
引数をthis.stageにすると、
メインスレッド (中断 : TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。)
といって怒られるので、thisに変更したのですが、実は、単に書く場所がマズかっただけで、
applicationCompleteHandlerで設定してやればOKでした。怠慢でした^^;^^;

ってことで、クラスは以下。たいしたことないっすけどね。
あぁ、あんまり型を書かない人なんで、すんません。。
package{
 //----------------------------------
 import flash.display.MovieClip;
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.KeyboardEvent;
 import flash.events.MouseEvent;
 import flash.ui.*;
 //----------------------------------
 public class keyAndMouse extends Sprite{
  var father  = null;
  var bControl = false;
  var bShift  = false;
  var funcMD  = null; // mouseDown event handler
  var funcMU  = null; // mouseUp   event handler
  var funcMM  = null; // mouseMove event handler
  var funcMO  = null; // mouseOver event handler
  var bKeep  = false;
  //--------------------
  var bMouseDown = false;
  //--------------------
  public function setMD(f){ funcMD = f;  }
  public function setMU(f){ funcMU = f;  }
  public function setMM(f){ funcMM = f;  }
  public function setMO(f){ funcMO = f;  }
  //--------------------
  public function getCS(){
   if(bControl && bShift) return 3;
   else if(bShift)   return 2;
   else if(bControl)  return 1;
   return 0;
  }
  //--------------------
  public function md(e){ if(funcMD) funcMD(e); }
  public function mu(e){ if(funcMU) funcMU(e); }
  public function mm(e){ if(funcMM) funcMM(e); }
  public function mo(e){ if(funcMO) funcMO(e); }
  //--------------------
  function keyAndMouse(f,bb:Boolean=true){
   bKeep = bb;
   father = f;
   this.addEventListener(Event.REMOVED_FROM_STAGE, removed);
   //-------------------
   // keyDown
   //-------------------
   father.addEventListener(KeyboardEvent.KEY_DOWN,
    function (e){
     if(e.keyCode == Keyboard.CONTROL) bControl = true;
     if(e.keyCode == Keyboard.SHIFT)  bShift = true;
    }
   );
   //-------------------
   // keyUp
   //-------------------
   father.addEventListener(KeyboardEvent.KEY_UP,
    function (e){
     if(e.keyCode == Keyboard.CONTROL) bControl = false;
     if(e.keyCode == Keyboard.SHIFT)  bShift  = false;
    }
   );
   //-------------------
   // mouseDown
   //-------------------
   father.addEventListener(MouseEvent.MOUSE_DOWN,
    function (e){
     if(bMouseDown){
      if(funcMU) funcMU(e);
      bMouseDown=false;  // 微妙な仕様
      return;     // 
     }
     bMouseDown = true;
     if(funcMD) funcMD(e);
    }
   );
   //-------------------
   // mouseUp
   //-------------------
   father.addEventListener(MouseEvent.MOUSE_UP,
    function (e){
     bMouseDown = false;
     if(funcMU){
      funcMU(e);
      if(!bKeep){
       funcMD = null;
       funcMU = null;
       funcMM = null;
      }
     }
    }
   );
   //-------------------
   // mouseMove
   //-------------------
   father.addEventListener(MouseEvent.MOUSE_MOVE,
    function (e){
     if(funcMM) funcMM(e);
    }
   );
   //-------------------
   // mouseOver
   //-------------------
   father.addEventListener(MouseEvent.MOUSE_OVER,
    function (e){
     if(funcMO) funcMO(e);
    }
   );
   //-------------------
  }
  //--------------------
  // like a destructer
  //--------------------
  private function removed(e:Event):void{
   removeEventListener(Event.REMOVED_FROM_STAGE, removed);
  }
  //--------------------
 }
 //----------------------------------
}

2011年1月6日木曜日

FLEXのMain.mxmlはどのように実行されるのか

まぁいわゆるMXMLというやつ。
これをコンパイルするとどうなるかというと、いったんActionScriptになるようですよね。
ということで、プロジェクト-プロパティでFLEXコンパイラの追加引数に【-keep】を追加。
さらに、ボタンをひとつ配置して、クリックイベントとだけ追加して、コンパイル。
MXMLとしては、こんな感じになる
<fx:Script>
  <![CDATA[
   protected function BTNID_clickHandler(event:MouseEvent):void
   {
    // TODO Auto-generated method stub
   }

  ]]>
 </fx:Script>
変換されると、こんな感じ
public class Main
    extends spark.components.Application
{
……略……
protected function BTNID_clickHandler(event:MouseEvent):void
{
 // TODO Auto-generated method stub
}
……略……
ということで、Main.mxmlというのが、Mainクラスになって、<fx:Script>の中が、そのままMainクラスになるという単純な構造のようだ。
ということで、最下層でいろいろやりたければ、

<fx:Script>
  <![CDATA[
   var aaa:Number = 0;
   public function test():void
   {
    var d:Date = new Date();
    var s:String = d.toTimeString();
    trace(s);
    trace(aaa++);
   }

   protected function BTNID_clickHandler(event:MouseEvent):void
   {
    test();// TODO Auto-generated method stub
   }

  ]]>
 </fx:Script>
なんて、適当なことをかいても、無事に、
public class Main
    extends spark.components.Application
{
……略……
 var aaa:Number = 0;
   public function test():void
   {
    var d:Date = new Date();
    var s:String = d.toTimeString();
    trace(s);
    trace(aaa++);
   }

   protected function BTNID_clickHandler(event:MouseEvent):void
   {
    test();// TODO Auto-generated method stub
   }
という風に変換されます。
ということで、あとは、【creationComplete】や【initialize】あたりに初期設定をいれてあれこれいじくりまわせばそれでOKってことですね。
うんそっか。簡単な話でしたね。

2010年12月29日水曜日

キーとマウスのハンドリング。

自分で書いた以前のコードを見たところ、
キーのup/down
マウスのup/down/move/over
をstageから所得するようなクラスを作成していた。
これが正しいかどうかわからないが、とりあえず、この方法としてみる。
正確には、stageから所得ではなく、
コンストラクタの引数にstageを渡しているだけの話である。

なんでstageからとるかというと、最下層から取りたかっただけである。
ActionScriptのイベントは、下の層から発生するので、かならずstageで拾うことができた気がするのだが、結論から言うととれないこともあった。
それはそれとして、もう忘れてしまったので、実際に出現したときに対応を考える。
たしか、、なんらかのコントロールをはりつけると、、shiftは拾えるがctrlは拾えないという事態が発生したような記憶がある。


ということで、マウスとキー(文字入力という意味ではなく、主に、ctrl/shiftあたり)の所得は、stageのみで行い、本来イベントの欲しいところのSprite/MovieClipにイベントハンドらっぽい関数を設定して、そこを呼ぶようにする。
stageのみで行い、本来イベントの欲しいところのSprite/MovieClipにイベントハンドらっぽい関数を設定して、そこを呼ぶようにする。
この画像は、http://gelsol.sub.jp/learning/displaylist/001.html
からの引用です。