拡大するとマウスのローカル座標が変わってしまう

このQ&Aのポイント
  • 四角形の左上から見たマウスの座標を取得する方法について考えています。
  • 移動や回転を行う四角形のローカル座標を利用してマウスの座標を取得しようとしていますが、拡大すると表示される座標が正しくない問題があります。
  • 四角形の左上隅が(0,0)になるように回転させる方法について知りたいです。
回答を見る
  • ベストアンサー

拡大するとマウスのローカル座標が変わってしまう

ある四角形の左上から見たマウスの座標を取得したいと考えています。 四角形は移動したり回転させるので、ローカル座標を利用しようと思い、 次のコードを書きました。 mc_box.width = mc_box.width * 2; stage.addEventListener(MouseEvent.MOUSE_MOVE, function(){ mc_label.text = mc_box.mouseX.toString(); }); 一行目でmc_boxのサイズを拡大すると、表示されるmc_box.mouseXは 実際の半分のサイズになってしまいます。 回転させても四角形の左上隅が(0,0)になるようにしたいです。 どうすれば正しくマウスの座標を得られるのでしょうか?

  • Flash
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

MCからのマウスの座標=stageのマウスの座標-MCの座標 この考え方↑で MCからのマウスの座標を求めれば良いのはないでしょうか? または 拡大・回転するMCの基準点の座標に 常に別の空のMCまたはスプライトを常に追従させて その別のMCまたはスプライトからのマウスの座標を求めるとか。 ================ それと, > 回転させても四角形の左上隅が(0,0)になるようにしたい この解釈が色々できるのですが。。。 四角形ABCDを入れたMCがあったとして その四角形の初期状態は  AB  DC という状態で,MCの基準点は 頂点A にあるものとします。 この四角形MCが例えば右回転して  DA  CB の状態になったとします。 そのときにも変わらず 頂点A からのマウスの座標を求めるのでしょうか? もしそうでしたら上に書いた方法でできると思います。 しかし 上のような状態になったときには 頂点D からのマウスの座標を求めるように変更するのでしょうか? もしそうでしたら上の方法ではできません。 さらにまた   A   DB   C みたいに斜めになったときはどこを基準にするのかなどを決めないと何ともできないでしょう。 例えば, getBounds() メソッドを使えばなんとかなるかもしれませんし 場合によっては, 回転させるのは親MCの中に入れた子MCにして 親MCからのマウスの座標を求めるようにするとか 何か根本的に別の方法を考える必要があるかもしれません。

django13
質問者

お礼

基準点の解釈としては、回転しても常にAが(0,0)で、Bが(x,0)となるようにしたいと思っています。 上の方法を試してみます。ありがとうございました。

関連するQ&A

  • Flash(ActionScript3.0)

    Flash(ActionScript3.0)でゲーム制作を行っています。 ActionScriptもFlashも最近初めて触れた初心者で、分からないことがたくさん湧いてきて困っています。 よろしければご回答お願い致します。 インスタンスをドラッグすることができる、という要素と、 インスタンスをクリックすると45度回転する、という要素を同時に入れたいのですが、 同時にプログラムを組むとドラッグだけをすることができず、 どうしてもドラッグ後に45度回転してしまいます。 (プログラムのソースはネットから拾ってきたものです)。 どうすればドラッグと回転を分けることができるのでしょうか。 プログラム自体は以下のように組みました。 ご回答いただければ嬉しいです。 よろしくお願い致します。 //インスタンスの回転プログラム mc1.addEventListener(MouseEvent.CLICK, kaiten); function kaiten(event:MouseEvent) { mc1.rotation += 45; } //インスタンスのドラッグプログラム //インスタンスの0点からのマウス座標用変数 var mc1X:int; var mc1Y:int; //マウスがインスタンスを押したらsec1開始 mc1.addEventListener(MouseEvent.MOUSE_DOWN,sec1); //sec1 マウスダウン座標確認、sec2開始 function sec1(event:MouseEvent):void { mc1X = event.localX; mc1Y = event.localY; addEventListener(MouseEvent.MOUSE_MOVE,sec2); } //sec2 インスタンス移動 function sec2(event):void { mc1.x = mouseX-mc1X; mc1.y = mouseY-mc1Y; //低FPSマウス移動スムーズ対応 event.updateAfterEvent(); } //マウスが離れたらsec3開始 stage.addEventListener(MouseEvent.MOUSE_UP,sec3); mc1.addEventListener(MouseEvent.MOUSE_OUT,sec3); //sec3 sec2停止 function sec3(event):void { removeEventListener(MouseEvent.MOUSE_MOVE,sec2); }

  • マウスアウトで非表示にする

    シーン1に、mc(ムービークリップ)とcomment1(ムービークリップ)を配置 mcにマウスオーバーするとcomment1が表示される。 mcよりマウスアウトするとcommen1が非表示になる。 という感じにしたいのですが、マウスアウトしても非表示に出来ないで困っています。 //----------------------------------- MovieClip(root).comment1.visible = false; var pointX:Number=70; var pointY:Number=50; mc.addEventListener(MouseEvent.MOUSE_OVER, fl_MouseOver); function fl_MouseOver(event:MouseEvent):void { stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveFunc); function mouseMoveFunc(e:MouseEvent):void { MovieClip(root).comment1.visible = true; MovieClip(root).comment1.x=stage.mouseX+pointX; MovieClip(root).comment1.y=stage.mouseY+pointY; } } mc.addEventListener(MouseEvent.MOUSE_OUT, fl_MouseOver2); function fl_MouseOver2(event:MouseEvent):void { mc.removeEventListener(MouseEvent.MOUSE_OVER, fl_MouseOver); MovieClip(root).comment1.visible = false; } //-----------------------------------

    • ベストアンサー
    • Flash
  • マウスアウト処理とボタンの処理の重なりについて

    いつもお世話になっております。 FLASHで以下の仕様のボタンを作成しようとしております。 (※添付の図を参照願います) 四角い箱(box_mc)が配置されている場所にマウスカーソルを乗せると、 マウスーオーバー処理が動作し、box_mcがフェードインで表示されます。 box_mcはマウスアウトするとフェードアウトして消える(ボタンも一緒に消える) アニメーションになっています。 マウスオーバー処理(box_mc.addEventListener(MouseEvent.MOUSE_OVER)までは 良いのですが、box_mc上にある複数ボタンのどれかにマウスカーソルを 合わせると、box_mcのマウスアウト処理(box_mc.addEventListener (MouseEvent.MOUSE_OUT)が実行されてしまいます。 原因としては、box_mc上にある複数ボタンのどれかにマウスを乗せた時 (ハンドカーソルになっている時)は、マウスカーソルがbox_mc外にあると 判断され、box_mcのマウスアウト処理が実行されているのではないかと 考えました。 「box_mc上にあるボタンにカーソルを合わせても、box_mcのマウスアウト処理が 実行されず、box_mc上のボタンが処理できる」というのが理想の仕様ですが、 上記の仕組みでは難しそうなので、「マウスがbox_mcの座標外に出たらマウス アウト処理を実行する」という処理を考えていますが、 もっとシンプルな方法で処理できないか悩んでおります。 何方か知恵をお貸しいただけないでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • Flash
  • MOUSE_MOVE マウスの動きと同方向に動く

    AS3初心者です。 マウス移動するとムービークリップ(mc)が回転するスクリプトです。 下記では、マウスを左右どちらに動かしても右回転しかしません。 マウス右移動では、右回転に。マウス左移動では、左回転にしたいのですが・・・。 var rot_speed:Number = 0; stage.addEventListener(MouseEvent.MOUSE_MOVE, function(event:MouseEvent){ rot_speed += event.stageX * 0.1; msg.text = String(event.delta); }); mc.addEventListener(Event.ENTER_FRAME, function(event){ rot_speed *= 0.3; mc.rotation += rot_speed; });

    • ベストアンサー
    • Flash
  • マウスカーソルをカスタマイズしたのですが…

    FlashCS4でAS3.0を使用しています。 マウスポインタを任意の形を作成して、ムービークリップにして、インスタンス名を「point_mc」として、ステージ上に配置し、スクリプトを下記のように記述しました。 ---------------------------------------------------------- Mouse.hide(); stage.addEventListener(MouseEvent.MOUSE_MOVE, function(e){ point_mc.x=stage.mouseX; point_mc.y=stage.mouseY; }); --------------------------------------------------------- その後にムービープレビューしますと、マウスのカーソルが先の任意に作成(point_mc)したのに変わってました。 そこまでは良かったのですが、その変わったマウスをボタンインスタンス(インスタンス名:skip_bt)に乗せても、ロールオーバーもしなければ、ボタンをクリックする事が出来ないのです。 因みに「skip_bt」に対するスクリプトは下記のように記述しました。 -------------------------------------------------------- skip_bt.addEventListener(MouseEvent.CLICK, introClick); function introClick(evt:MouseEvent):void { gotoAndStop("intro"); } -------------------------------------------------------- このままだと、ただマウスカーソルが、任意で作成したムービークリップになっているだけで、ボタンを押したりする事が出来ません。クリックする事が出来なくて困ってます。 解る方がおりましたら、アドバイス・ご指導をお願い致します。 よろしくお願い致します。

  • マウスでドラッグして絵を描くSWFを作っています

    マウスでドラッグして絵を描くSWFを作っています ムービークリップ"masu"を置き、 下のスクリプトで、マウスのボタンを押してしてそのままマウスを動かすと動きに沿って線は引かれ、hの値も正しくトレースされるのですが、ボタンをあげても TypeError: Error #1034: 強制型変換に失敗しました。flash.events::MouseEvent@2ac45ea1 を fl.motion.MotionEvent に変換できません。 というエラーが出力され、 function DEL(eventObject:MotionEvent):void{ removeEventListener(MouseEvent.MOUSE_MOVE,LINE); } が動きません。なぜでしょうか? また、AS1は少しはわかりますがAS3は初心者ですので、もっとよいスクリプトなどありましたら挙げていただけるとうれしいです import fl.motion.MotionEvent; var h = 1; this.masu.addEventListener(MouseEvent.MOUSE_DOWN,MOVE); this.masu.addEventListener(MouseEvent.MOUSE_UP,DEL); function MOVE(eventObject:MouseEvent):void{ this.masu.graphics.moveTo(mouseX,mouseY); this.masu.addEventListener(MouseEvent.MOUSE_MOVE,LINE); } function LINE(eventObject:MouseEvent):void{ h++; trace(h); this.masu.graphics.lineStyle(3,0x000000); this.masu.graphics.lineTo(mouseX,mouseY); } function DEL(eventObject:MotionEvent):void{ removeEventListener(MouseEvent.MOUSE_MOVE,LINE); }

    • ベストアンサー
    • Flash
  • java リアルタイムでマウスの座標を取得したい

    マウスのリアルタイム座標を取得したいのですが、 以下のソースを作りました。 しかし、リアルタイムどころか、マウスをクリックしても座標が取得できません どこを修正すればいいのでしょうか? import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.awt.event.MouseEvent; import java.net.URL; import java.awt.Image; /*<applet code="applet001" width="640" height="480"></applet>*/ public class applet001 extends Applet implements MouseListener, MouseMotionListener { Dimension dim; int mouse_x, mouse_y; //アプレットの初期化時呼び出される public void init() { dim = getSize(); addMouseListener( this ); } public void update(Graphics g) //オーバーライドして最低限のことだけをする { paint(g); } public void paint(Graphics g) { g.drawString( "マウス:" + mouse_x + "," + mouse_y, 60, 120 ); g.fillOval(mouse_x,mouse_y,30,30); } // マウスの処理 public void mousePressed( MouseEvent e ) { mouse_x = e.getX(); mouse_y = e.getY(); } public void mouseClicked( MouseEvent e ) {} public void mouseReleased( MouseEvent e ) {} public void mouseEntered( MouseEvent e ) {} public void mouseDragged( MouseEvent e ) {} // public void mouseExited( MouseEvent e ) {} // public void mouseMoved( MouseEvent e ) { mouse_x = e.getX(); mouse_y = e.getY(); repaint(); } }

    • ベストアンサー
    • Java
  • マウスオーバー/マウスアウトで反応するボタン

    はじめまして、Flash初心者です。 かなり基本的な質問で申し訳ないのですが、ご教授のほど、よろしくお願いします。 マウスオーバーで、モーションが再生され、 マウスアウトで、別のモーションが再生され(オーバーの逆回転のようなもの) ボタンをムービークリップで作成しているのですが、うまくいかなくて困っています。 ◆レイヤー2 //マウスオーバー butt.addEventListener( MouseEvent.MOUSE_OVER , fnon ); function fnon ( e:MouseEvent ):void{ gotoAndPlay(2); } //マウスアウト butt.addEventListener( MouseEvent.MOUSE_OUT , fnout ); function fnout ( e:MouseEvent ):void{ gotoAndPlay(11); } ◆レイヤー1 1 stop(); 10 stop(); 20 gotoAndPlay(1); (おそらくこれよりもいい方法があると思うのですが・・・) ASを入れる位置がおかしいのでしょうか・・・ よろしくお願いします。

  • flashcs4 as3.0のエラーについて

    TypeError: Error #1010: 条件は未定義であり、プロパティがありません。 at 2mouse_03_fla09_as3_fla::MainTimeline/mymouse() 以下のスクリプトを実行すると上記のエラーが発生してしまいます。 ネットで調べてもわかりませんでした。AS3.0を学習していることろです。 よろしくお願いいたします。 ---------------------------------------------------------- やっていることは、マウスをMC(mc)に変換して、mc1との当たり判定をしたいだけです。 実行すると、実行画面でマウスを動かすと同時に上記のエラー出てしまいます。 ----------------------------------------------------------- stop(); mc.visible=false; myb.stage.addEventListener(MouseEvent.CLICK, mystart); function mystart(event){ myb.visible=false; Mouse.hide(); mc.visible=true; mymouse(event); } mc.stage.addEventListener(MouseEvent.MOUSE_MOVE,mymouse); function mymouse(event):void{ mc.x = stage.mouseX; mc.y = stage.mouseY; mc.event.updateAfterEvent(); } mc.stage.addEventListener(Event.ENTER_FRAME,mymc); function mymc(event){ if(mc1.hitTestObject(mc)){ mc.stage.removeEventListener(Event.ENTER_FRAME,mymouse); mc.visible=false; } }

    • ベストアンサー
    • Flash
  • flashCS4を使っています。初心者です。

    flashCS4を使っています。初心者です。 シンボルをクリックした時にマウスカーソルを変えたいのですが、どのようなスクリプトを書いたらいいのでしょうか。 今は、 stage.addEventListener(MouseEvent.MOUSE_MOVE,mouse_move); function mouse_move(event:MouseEvent){ yubi1.x =stage.mouseX; yubi1.y =stage.mouseY; } Mouse.hide(); というスクリプトで、カーソルに「yubi1」という画像を使っています。 このyubi1をクリック時にyubi2にしたいのです。 どうかよろしく御願いします。

    • ベストアンサー
    • Flash

専門家に質問してみよう