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年8月22日月曜日

FLASH再び。

長らく更新してませんでした。あまりに忙しく。。(-_-;)
ってことで、再会再開です。
とりあえず、、、ここ数ヶ月C++ばっかりだったので、FLASHを思い出すところから始めないと。

2011年5月29日日曜日

座標を変形させるのか?図形を変形させるのか?

グラフィックス全般のことなんですが、
【座標を変形させるのか?図形を変形させるのか?】
という問題があります。

一見、どっちでもよさそうな気がしますが、そうでもありません。
Adobe製品は、【座標】を変形させる方を選択しているため、

【文字フチをつけた文字フチ部分が文字ではなく図形となる】

という現象がおこります。
理由は、文字でフチ部分を定義してしまうと、座標を変形させているため、
文字のフチの線要素が、変形の影響を受けます。
当たり前なような気がしますが、線幅も影響を受けるため、
長体文字のフチの巾が、タテヨコでかわってしまう場合があるわけですね。

ちょっとわかりにくかったかもしれません。絵がないので。
ちょっと、、今はわかりやすい絵を描く気力がないので、
また今度書きます。

つまりこういうことですね。
普通にフチ付文字を書くと、座標の変換(偏倍)がないので、
こんな感じです。


これをこのまま横に偏倍するとこうなります。
まぁこれはこれでいいんですけど。。。
しかし、フチの幅を一定にしたち時もあるわけです。



そう、こういう風にしたい場合ですね。
これは、座標を変形させていると、線幅がタテヨコ変わるので、書けないんですね。



さらに、これはバグなのですが、
文字フチを文字で作成した(別プログラムでね。^^;)PDFを、イラレのCS5で読むと、
フチ文字部分が、正しい位置に配置されないというバグがあります。
CS4はわかりませんが、CS3では正しく読み込めていました。

フチをポリラインにしたPDFをイラレCS5で読み込んだとき。

フチを文字で書いたPDFをイラレで読み込んだ。
アメリカ→インドに変わって、、思想が変わったんですかね。。
いや、思想以前にバグだろこれ!




2011年5月21日土曜日

【詳解画像処理プログラミング】この本はあまりによくない。

この本なんですが、、、、
ぜんぜんダメでした。以前、読んだら書きますみたいに書いたのですが、
ダメです。買わないほうがいいでしょう。

(1)ターゲットがわからない。わかる人が読めばわかるけど、わからない人はわからないような書き方。だからといって、それほど高度な内容でもない。
(2)グラフィックスの本にしては、絵がすくなすぎる。同じ絵の使いまわしも多すぎ。内容に即した絵にもなっていない。
(3)ソースコードが美しくないし、遅すぎてそのままで使えるとも思えないし、説明の補足の役割がかろうじてあるかどうかってとこ。
(4)誤植が多すぎる。
(5)著者の思いが見えない。

以上の理由により、この本は、10段階評価2くらいの本ってことで。