拖出你的精彩:Flash MX課件中的拖動

- 中國WEB開發者網絡 (http://www.webasp.net)
-- 技術教程 (http://www.webasp.net/article/)
--- 拖出你的精彩:Flash MX課件中的拖動 (http://www.webasp.net/article/22/21311.htm)
-- 作者:未知
-- 發佈日期: 2005-04-30

    用Flash MX製作交互式的課件時,很多場合都需要用到拖動。在Flash MX中主要的拖動方式有以下三種:無任何約束的拖動、限制在某一矩形範圍內的拖動、限制在某一路徑上的拖動。下面通過實例加以說明。

  1. 無任何約束的拖動


    (1)打開「插入」菜單的「新建元件」命令,在「創建新元件」對話框中,「名稱」框內輸入「球」,「行為」選擇「影片剪接」。

  (2)畫一個圓,最好是讓圓心和影片剪接的中心對齊。

  (3)選擇主場景,按F11打開「庫」面板,將剛製作好的球拖動至主場景中。

  (4)選擇主場景中的球,打開窗口下方的「屬性」面板,在名稱框內輸入名稱ball。

  (5)右擊ball,選擇「動作」命令,在代碼編輯框內輸入:

  on(press)

  {

   startDrag("",true);//允許拖動ball

  }

  on(release, releaseOutside)

  {

   stopDrag();//釋放鼠標時,停止拖動ball

  }

  (6)拖動ball,我們將看到ball可以拖動到場景中的任意位置,釋放鼠標時,ball將停止拖動。

  2. 約束某一矩形範圍內的拖動

  將以上代碼改為:

  on(press)

  {

  //限制拖動範圍為(0,0)到(100,100)之間,注意坐標原點位於場景中的左上角。

   startDrag("",true,0,0,100,100); }

  on(release, releaseOutside)

  {

   stopDrag();

  }

  再拖動ball,將看到ball被限制在某一區域內拖動。

  3. 沿某一路徑的拖動

  在某些場合,如通過拖動動態生成數學函數圖像時,因為函數圖像都有一個函數式約束,決定了以上兩種方法都不可行。這種拖動的關鍵在於要根據約束條件來決定被拖動對象的位置。下面以動態生成圓來說明此類拖動問題的解決方法。

  (1)通過「插入」菜單製作一個名為「點」的電影剪接,畫一個小點表示該電影剪接,注意點的中心和電影剪接的中心點重合。

  (2)轉到主場景,新增一圖層,將兩圖層分別命名為「腳本」和「對像」。

  (3)選擇「對像」時間軸,在場景中加入兩個「點」的實例,在它們的屬性面板中分別命名為「yuanxi」(表示圓心)和「dian」(表示圓周上的點),讓它們適當保持一定的距離,並且讓「yuanxi」位於場景的中央。
    (4)右擊「腳本」層第一幀,選擇「動作」,在代碼編輯窗口內輸入以下腳本:

  drag_flag=false;//拖動標誌

  x0=yuanxin._x;

  y0=yuanxin._y;

    dian_x=dian._x;

  dian_y=dian._y;

  //計算圓的半徑,這就是拖動圓周的點的約束條件,被拖動的點到圓心的距離等於半徑。

  r=Math.sqrt((x0-dian_x)*(x0-dian_x)+(y0-dian_y)*(y0-dian_y));

  _root.onEnterFrame =function()

  {

   if (drag_flag)

   {

   x = _xmouse;

   y = _ymouse;

   angle=Math.atan(Math.abs(y0-y)/Math.abs(x-x0));

   dian_x=x0+r*Math.cos(angle);

   dian_y=y0-r*Math.sin(angle);

   //第一象限

   if((x>=x0) &&&& (y<=y0))

   {

   dian_x = x0+r*Math.cos(angle);

   dian_y = y0-r*Math.sin(angle);

   depth=angle*180/3.14159;

   }

   //第二象限

   if((x<=x0) &&&& (y<=y0))

   {

   dian_x=x0-r*Math.cos(angle);

   dian_y=y0-r*Math.sin(angle);

   depth=angle*180/3.14159+90;

   }

   //第三象限

   if((x<=x0) &&&& (y>=y0))

   {

   dian_x=x0-r*Math.cos(angle);

   dian_y=y0+r*Math.sin(angle);

   depth=angle*180/3.14159+180;

   }

   //第四象限

   if((x>=x0) &&&& (y>=y0))

   {

   dian_x=x0+r*Math.cos(angle);

   dian_y=y0+r*Math.sin(angle);

   depth=angle*180/3.14159+270;

   }

   duplicateMovieClip("dian","dian" add depth,depth);

   _root["dian" add depth]._x=dian_x;

   _root["dian" add depth]._y=dian_y;

   _root.clear();

   _root.moveTo(x0,y0);

   _root.lineStyle(1,0xff0000,100);

   _root.lineTo(dian_x,dian_y);

   }

  }

  (5)右擊dian實例,選擇「動作」命令,輸入以下腳本:

  on(press)

  {

   _root.drag_flag=true;//在dian實例上按下鼠標左鍵,置拖動標誌為真。

  }

  on(release, releaseOutside)

  {

   _root.drag_flag=false;//在dian實例上鬆開鼠標左鍵,置拖動標誌為假。

  }

  (6)測試影片,拖動dian實例,將看到在場景中會畫出一個由點構成的圓。

  從此例可以看出,實現沿某一路徑的拖動,關鍵是要通過約束條件找到拖動時的對象的坐標。


webasp.net