当前位置:软件学习 > Flash >>

AS3 拖动对象实现方法

as3 拖动对象实现方法

在flash as3.0里面 有startdrag 函数
mc.startdrag(false, new rectangle(0, 0, 100, 0) );
这样mc这个元件只能在x轴方向拖动 拖动范围是 0-100
mc.startdrag(false, new rectangle(10, 20, 100, 200) );
这样mc是可以在x方向10-100 y轴方向20-200 这样一个矩形区域拖动
希望对你有帮助

user1.addeventlistener(mouseevent.mouse_down, mousedown1) 
 
function mousedown1(event:mouseevent):void
{
     user1.startdrag(false, new rectangle(0, 0, 100, 0) );
}

实例代码

package
{
 import flash.display.sprite;
 import flash.display.displayobject;
 import flash.events.mouseevent;
 import flash.geom.point;
 import flash.filters.drops教程hadowfilter;
 
 public class classdrag extends sprite
 {
  private var _red:sprite;
  private var _blue:sprite;
  private var _green:sprite;
  private var _white:sprite;
 
  // 被拖动对象原始坐标
  private var _startinglocation:point;
 
  // 构造函数
  public function classdrag()
  {
   init();
  }
 
  // 初始化
  private function init():void
  {
   _red = new sprite();
   createrectangle(_red, 0xff0000, 10, 10, 20, 20);
   _blue = new sprite();
   createrectangle(_blue, 0x0000ff, 10, 35, 20, 20);
   _green = new sprite();
   createrectangle(_green, 0x00cc00, 10, 60, 20, 20);
   _white = new sprite();
   createrectangle(_white, 0xf0f0f0, 40, 10, 300, 300, false);
  }
 
  // 创建矩型
  private function createrectangle(rectangle:sprite, color:uint, x:uint, y:uint, width:uint, height:uint, drag:boolean = true):void
  {
   rectangle.graphics.beginfill(color);
   rectangle.graphics.drawrect(x, y, width, height);
   rectangle.graphics.endfill();
   addchild(rectangle);
 
   if(drag)
   {
    // 侦听事件
    rectangle.addeventlistener(mouseevent.mouse_down, pickup);
    rectangle.addeventlistener(mouseevent.mouse_up, place);
   }
  }
 
  // 拖动
  private function pickup(event:mouseevent):void
  {
   // 保存原始坐标
   _startinglocation = new point();
   _startinglocation.x = event.target.x;
   _startinglocation.y = event.target.y;
 
   // 开始拖动
   event.target.startdrag();
   // 加上阴影
   event.target.filters = [new dropshadowfilter()];
   // 拖动对象最前显示
   setchildindex(displayobject(event.target), numchildren - 1);
  }
 
  // 拖动结束
  private function place(event:mouseevent):void
  {
   // 拖动结束
   event.target.stopdrag();
   // 清除阴影
   event.target.filters = null;
 
   // 检测是否已经移动到目标区域
   if(event.target.droptarget == _white)
   {
    var color:uint;
    switch(event.target)
    {
     case _red: color = 0xff0000; break;
     case _blue: color = 0x0000ff; break;
     case _green: color = 0x00cc00; break;
    }
 
    // 重新创建目标区域
    _white.graphics.clear();
    createrectangle(_white, color, 40, 10, 300, 300, false);
   }
 
   // 拖放对象回到原位
   event.target.x = _startinglocation.x;
   event.target.y = _startinglocation.y;
  }
 }
}

还有怎样限制他的拖动范围,就是当把对象向右拖动时,原先左边的东西全部显示之后,那么就不能往左拖了。

首先,把要拖动的对象 取个实例名:我这里用 mc1  好了 (mc1在舞台上)
一、mc1 水平拖动
    在主时间轴第一帧上写上:
  

  this.addeventlistener(event.enter_frame,fun1)
       function fun1(evt:event):void{
 mc1.x=mousex
 }

二、mc1垂直拖动
    

this.addeventlistener(event.enter_frame,fun1)
        function fun1(evt:event):void{
 mc1.y=mousey
 }

呵呵,只是把x改成y;
你可以在里面加上些条件,来实现拖动范围的的限制,例如:
   

  this.addeventlistener(event.enter_frame,fun1)
       function fun1(evt:event):void{
               if(mc1.x<250){//当mc1的的坐标小于250时才水平拖动,你可以换成其它的条件
 mc1.x=mousex
                     }
 }

呵呵,大致上的思路是这样的,还有什么不明白的地方,欢迎追问追问你好,我的代码是这样的。
我希望我在点击user1的时候开始水平拖拽,松开时停止,然后对它可拖的范围限制

user1.addeventlistener(mouseevent.mouse_down, mousedown1) 
 
function mousedown1(event:mouseevent):void
{
    user1.startdrag();
}

user1.addeventlistener(mouseevent.mouse_up, mousereleased1);
 
function mousereleased1(event:mouseevent):void
{
     user1.stopdrag();
   
}    回答var aa=0        //充当开关用
user1.addeventlistener(mouseevent.mouse_down, mousedown1) 
function mousedown1(event:mouseevent):void {
    aa=1   //开关打开
}
user1.addeventlistener(mouseevent.mouse_up, mousereleased1);
function mousereleased1(event:mouseevent):void {
     aa=0  //开关关闭
}
addeventlistener(event.enter_frame,fun1)
function fun1(evt:event):void{
 if(aa==1){
 user1.x=mousex//这里是水平,把x改成y就是垂直了
 }
 }   

 追问最后一个问题是,如果我在一个原件的里面,如何去控制场景内另外一个组建里的行为?
我记得以前as2里面 root什么的可以做到
就是a.a_1.a_1_1,在这个a_1_1里面 这个去控制  b,和b_1 ?0.0?    回答这是路径的问题
as2里面如果 你要控制舞台上的 a的x  你应该写:_root.a._x=你的控制
   同样你要控制舞台上a 中的 a_1 中的 a_1_1的x,就是_root.a.a_1.a_1_1.x=你的控制
as3中你可以这样写:movieclip(root).a.x=你的控制
                   movieclip(root).a.a_1.a_1_1.x=你的控制
上面的都是绝对路径,所以无论你在影片的任何位置都可以控制

补充:flash教程,As3.0 
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,