なでなでへの道


またまたCHECKMATE用にこんなの作りました。
なでなでワンコ | wonderfl build flash online

  • マウスのホイールをまわしたら、ワンコをなでなで。
  • ホイールクリックでワンコを押しつぶす。
  • 左クリックでワンコが歌う。

これだけ。

簡単そうに見えるけど、これ作るの意外と大変だった。
ぶち当たった問題点は以下の3つ。

  • AS3ではホイールクリックのイベントが取れない。(右クリックも)
  • ホイールの回転量(Event.delta)は環境によって大きさが違う。
  • 別ドメインのswfを読み込んで、再生制御(gotoAndStop)できない。


それでは1つずつ解決方法を説明していきます。

1. 右クリックとホイールクリック

これについては、こちらに詳しく書かれていました。
【AS3.0】右クリック、ホイールクリックの判定 | プログラマ気分
そして、僕がちょっとだけ変えて、wonderflにアップしたのがこれ。

右クリックとホイールクリック - wonderfl build flash online

右クリックとホイールクリックのイベントが取得できているはず!

2. ホイールの回転量が環境によって違う

この問題は簡単。
Event.deltaの絶対値は結構違うけど、符号は同じだから以下のコードでどの方向に何回回したかはわかる。

Actionscript:
  1. var cnt:int = 0;
  2. stage.addEventListener(MouseEvent.MOUSE_WHEEL, function(event:MouseEvent):void {
  3.         if (event.delta> 0) cnt++;
  4.         else if (event.delta <0) cnt--;
  5. });

はい、解決。

3. 別ドメインのswfを読み込んで、再生制御できない

結論からいうと、これは解決できなかった。
この問題については、こちらに書かれていますが、解決方法が書いてない!
loader.content、bmd.draw(loader) でセキュリティサンドボックス侵害 | エントリー | _level0.KAYAC
つまり、Loaderで読み込んだswfを制御するには、
Loader.contentを使わないといけないけど、これはセキュリティサンドボックス侵害になるってこと。
ApplicationDomainってやつが曲者っぽい。
ApplicationDomain クラスの使用
もう、この問題は、どーにもこーにも(allowdomainとか、ムービーをMCにしてリンケージ設定とか、いろいろ試した)
解決できなかったので、png画像をいっぱい用意して、いっぱいロードして、パラパラ漫画のように表示した。

Actionscript:
  1. import flash.display.Loader;
  2. import flash.display.Sprite;
  3. import flash.net.URLRequest;
  4. import flash.system.LoaderContext;
  5.  
  6. class MyHand extends Sprite
  7. {
  8.     public var images:Array = [];
  9.     public function MyHand():void
  10.     {
  11.         for (var i:uint = 1; i <= 6; i++){ //今回は画像が6枚だった
  12.             var loader:Loader = new Loader();
  13.             loader.load(new URLRequest("http://hoge.com/img"+i+".png"), new LoaderContext(true));
  14.             images.push(loader);
  15.             addChild(images[i - 1]);
  16.         }
  17.         show(0);
  18.     }
  19.     public function show(num:uint):void {
  20.         for (var i:uint = 0; i <6; i++) {
  21.             if(i==num) images[i].visible = true;
  22.             else images[i].visible = false;
  23.         }
  24.     }
  25. }

試してないけど、こんな方法で解決できるかも。

  • 必殺LocalConnectionで無理やり制御する。
  • MCのリンケージ設定のときに「ランタイム共有用に出力」にチェックを入れて、URLを指定する。

誰か試してみてください。

Submit a Comment