FLASH鼠標(biāo)拖拽與旋轉(zhuǎn)MC

若水221147 分享 時(shí)間:
  在網(wǎng)上看到某個(gè)游戲既要拖拽mc又要旋轉(zhuǎn)mc,拖拽用鼠標(biāo)事件實(shí)現(xiàn),而旋轉(zhuǎn)需要用shift+鼠標(biāo)click事件。總覺得太麻煩了。故而希望自己能找到一種只用鼠標(biāo)就能同時(shí)實(shí)現(xiàn)拖拽與旋轉(zhuǎn)功能的方法。

  結(jié)果發(fā)現(xiàn)MOUSE_DOWN+MOUSE_UP竟然相當(dāng)于一次CLICK事件。即每次釋放鼠標(biāo)左鍵,停止拖拽時(shí),mc會(huì)旋轉(zhuǎn)一次,而這個(gè)顯然不是預(yù)期的效果。

  于是,開始明白了,那個(gè)程序員為什么要添加shift鍵的偵聽了。

  可是,不用shift鍵就不能實(shí)現(xiàn)這種功能嗎?我開始考慮如何區(qū)分MOUSE_DOWN+MOUSE_UP與CLICK.。

  方法一:設(shè)置時(shí)間間隔。時(shí)間不太好把握,pass掉。

  方法二:用鼠標(biāo)的相對(duì)位置。倘若mc未移動(dòng)則視為click事件。正解!

  package{

   import flash.display .*;

   import flash.geom .Point;

   import flash.events.*;

   public class main extends Sprite{

    private var mc:MC;

    private var clickOffset:Point;

    private var mouseLoc:Point;

    public function main(){

   mc=new MC();

   addChild(mc);

   mc.x=200;

   mc.y=200;

   mc.addEventListener(MouseEvent.CLICK ,rot);

   mc.addEventListener(MouseEvent.MOUSE_DOWN,startdrag);

   mc.addEventListener(Event.ENTER_FRAME. ,drag);

   stage.addEventListener(MouseEvent.MOUSE_UP,stopdrag);

    }

    private function startdrag(e:MouseEvent ){

   mouseLoc=new Point(e.stageX,e.stageY);

   clickOffset=new Point(e.stageX-mc.x,e.stageY-mc.y);

    }

    private function drag(e:Event){

   if(clickOffset==null) return;

   mc.x=mouseX-clickOffset.x;

   mc.y=mouseY-clickOffset.y;

    }

    private function stopdrag(e:MouseEvent ){

   clickOffset=null;

    }

    private function rot(e:MouseEvent){

   if(!mouseLoc.equals(new Point(e.stageX,e.stageY)))return;

    mc.rotation+=30;

  

    }

   }

  }
13998