我有一个红色正方形,我只想在x轴上拖动。我已经制定了一个简单的脚本,理论上应该可行,但它的行为并不正常。这有点难以解释......广场一直在错误的位置开始,舞台位置似乎在变化,所以有时你不能将广场一直拖到右边......
red.buttonMode = true;
red.addEventListener(MouseEvent.MOUSE_DOWN, dragHandler);
function dragHandler(e:MouseEvent):void {
var ypos:Number = e.currentTarget.y;
var xpos:Number = e.currentTarget.x;
e.currentTarget.startDrag(false,new Rectangle(-xpos,ypos,stage.stageWidth,0));
}
red.addEventListener(MouseEvent.MOUSE_UP, dropHandler);
function dropHandler(e:MouseEvent) {
//trace("red up");
e.currentTarget.stopDrag();
}
答案 0 :(得分:14)
很高兴Marty的解决方案适合你,虽然效率不高(MouseEvent.MOUSE_MOVE监听器是杀手)。原始代码的问题在于,限制拖动边界的矩形必须相对于父级坐标。此外,根据广场的注册点的位置,如果您不希望其任何部分移动,则可能必须考虑宽度走出舞台。
例如,如果您的红色方块直接位于舞台上,则其注册点位于其中心,并且您希望将拖动限制为舞台的整个x轴,这将起作用:
e.currentTarget.startDrag(
false,
new Rectangle(
e.currentTarget.width/2,
e.currentTarget.y,
stage.stageWidth-e.currentTarget.width,
0
)
);
答案 1 :(得分:3)
您可以尝试使用包含MouseEvent.MOUSE_MOVE
的其他方法,因为使用矩形作为动态边界会很棘手。
// define lock on y-axis
var LOCKY:Number = target.y;
// MouseEvent.MOUSE_MOVE
stage.addEventListener(MouseEvent.MOUSE_MOVE, _mouseMove);
function _mouseMove(e:MouseEvent):void
{
if(target.y != LOCKY) target.y = LOCKY;
}
// dragging
target.addEventListener(MouseEvent.MOUSE_DOWN, _mouseDown);
function _mouseDown(e:MouseEvent):void
{
target.startDrag();
target.addEventListener(MouseEvent.MOUSE_UP, _mouseUp);
}
// dropping
function _mouseUp(e:MouseEvent):void
{
target.stopDrag();
target.removeEventListener(MouseEvent.MOUSE_UP, _mouseUp);
}
答案 2 :(得分:0)
这将使ACTIONSCRIPT 3(Semilla Sol应用程序)
1-创建常规 MOUSE DOWN 和 MOUSE UP 事件监听器
分别在每个函数中删除' startDrag '和' stopDrag '元素
以下是如何锁定AXIS:
1:为您要限制的对象创建事件侦听器 ...在此示例中,它是名为“播放器”的movieclip实例:
player.addEventListener(Event.ENTER_FRAME, pLimiter);
这里是'pLimter'功能:
function pLimiter(e:Event):void
{
player.y = stage.stageHeight;
}
因此,在这种情况下,我们将“拖动”限制为仅仅x轴。