【问题标题】:Flash CS6/as3: Using cursor to draw rectangle dynamically in a published swfFlash CS6/as3:使用光标在已发布的 swf 中动态绘制矩形
【发布时间】:2015-09-13 11:04:47
【问题描述】:

我有点问题。我正在创建一个 swf,它允许某人在已发布的 swf 中动态绘制一个矩形,然后他们可以拖动一个形状并将其放置在他们刚刚绘制的矩形内。

我有 swf 工作,所以你可以画一个矩形,没问题。出现问题的地方是,当试图将屏幕上的一个形状拖动到新绘制的矩形中时,它最终会在拖动形状时绘制另一个矩形。

我想,我的问题是如何“关闭”允许在绘制我想要使用的矩形后绘制矩形的代码?

这是我用于绘制矩形的代码(我是从在线教程中获得的)。在绘制矩形之前,可拖动的形状不会显示(它们在下一帧上):

stop();

import flash.display.Shape;

var temporaryDrawing:Shape = new Shape();
addChild(temporaryDrawing);
temporaryDrawing.graphics.lineStyle(3, 0x000000, 1);

var myDrawing:Shape = new Shape();
addChild(myDrawing);
myDrawing.graphics.lineStyle(3, 0x000000, 1);

var mouseHolding:Boolean=false;
var clickedX:Number;
var clickedY:Number;


stage.addEventListener(MouseEvent.MOUSE_DOWN, mDown);
stage.addEventListener(MouseEvent.MOUSE_UP, mUp);

function mDown(MouseEvent):void{
    mouseHolding = true;
    clickedX = mouseX;
    clickedY = mouseY;
}

function mUp(MouseEvent):void{
    mouseHolding = false;
    myDrawing.graphics.drawRect(clickedX, clickedY, mouseX-clickedX, mouseY-clickedY);
    nextFrame();
    clearTemp ()
}

stage.addEventListener(MouseEvent.MOUSE_MOVE, mMove);
function mMove(MouseEvent):void{
    if (mouseHolding){
        clearTemp ();
        temporaryDrawing.graphics.drawRect(clickedX, clickedY, mouseX-clickedX, mouseY-clickedY)

    }
}

function clearTemp():void{
    temporaryDrawing.graphics.clear();
    temporaryDrawing.graphics.lineStyle(3, 0x000000, 1)
}

【问题讨论】:

    标签: actionscript-3 flash shape drag


    【解决方案1】:

    您可以通过MouseEvent的目标来区分。

    绘图监听器被添加到舞台。 currentTarget 就是这样,stage。启动拖动的监听器(可能)被添加到应该被拖动的对象中。 currentTarget 将是对它的引用。

    由于冒泡每个MouseEvent 都会在stage 结束,这就是你的矩形再次绘制的原因。区别在于MouseEventtarget会不一样。

    在处理MouseEvent 以绘制矩形的函数中,只需检查是否currentTarget == target,如果是这种情况,则鼠标单击了stage,没有其他内容。如果不一样,就是鼠标点击了别的东西,意图不是画一个矩形。

    如果单击不是stage 的任何其他内容,这将基本上禁用矩形绘制。


    您也可以使用stopPropagation() 并为不同的事件阶段添加侦听器来实现此目的。但是我没有时间考虑这个。

    【讨论】:

    • 我理解逻辑,但我对如何实施你的建议有点迷茫。显然,在回复您的帖子时,我无法使用键盘上的 Return 按钮,因此我将改用这一长段。您说要检查 currentTarget == target,但我不确定我会在代码中的哪个位置执行此操作。正如您可能知道的那样,我并不是 Flash 或 AS3 方面的专家。
    • 在矩形绘图处理程序的开头添加带有条件的 if 语句,如果为 false,则从函数返回而不执行其余部分
    • 所以应该是:if(currentTarget == target){ etc, etc, etc...?
    • 原则上是的,但是反转条件并从函数返回更容易阅读,因为您不必将该函数的所有内容都填充到 if 块中。我想这是一个偏好问题,你的方式也应该有效。此外,属性在作为参数传递的 Event 对象中,它们不能作为局部变量使用。
    • 我认为你的方式会更可取。如果单击不是舞台的其他任何内容,我想禁用矩形绘图。另外,一旦绘制了矩形,有没有办法可以操纵它?例如,搬到舞台的另一部分?我希望它在左侧绘制,但稍后移到右侧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 2013-08-26
    • 2012-09-29
    相关资源
    最近更新 更多