actionscript 3-Flash CS6/as3:使用光标在已发布的swf中动态绘制矩形



我遇到了一点问题。我正在创建一个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)
}

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

draw监听器被添加到舞台中。currentTarget就是stage。启动拖动的侦听器(可能)被添加到应该拖动的对象中。currentTarget将对此进行参考。

由于每个MouseEvent都会冒泡到stage,这就是再次绘制矩形的原因。不同之处在于MouseEventtarget将不同。

在处理用于绘制矩形的MouseEvent的函数中,只需检查currentTarget == target,如果是这样的话,鼠标是否单击了stage,而不是其他。如果它们不一样,鼠标点击了其他东西,目的不是画一个矩形。

如果单击了除stage之外的任何其他内容,则基本上将禁用矩形绘图。


您可能还可以通过stopPropagation()和为不同的事件阶段添加侦听器来实现这一点。但我没有时间仔细考虑。

最新更新