Flash CS6/as3: 使用光标在已发布的 swf 中动态绘制矩形
Flash CS6/as3: Using cursor to draw rectangle dynamically in a published swf
我有点小问题。我正在创建一个 swf,它允许某人在已发布的 swf 中动态绘制一个矩形,然后他们可以拖动一个形状并将其放置在他们刚刚绘制的矩形内。
我有 swf,所以你可以画一个矩形,没问题。出现问题的地方是当试图将屏幕上的一个形状拖到新绘制的矩形中时,它最终会在拖动形状时绘制另一个矩形。
我想我的问题是如何 "turn off" 允许在绘制我想要使用的矩形后绘制矩形的代码?
这是我用来绘制矩形的代码(我从网上的教程中得到的)。可拖动的形状在绘制矩形之前不会显示(它们在下一帧上):
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
的目标来区分。
绘图监听器已添加到舞台。 currentTarget
就是 stage
。发起拖动的侦听器(可能)被添加到应该被拖动的对象中。 currentTarget
将是对此的引用。
由于冒泡,每个 MouseEvent
都会在 stage
处结束,这就是再次绘制矩形的原因。不同的是MouseEvent
的target
会不一样
在处理 MouseEvent
绘制矩形的函数中,只需检查是否 currentTarget == target
,如果是,则鼠标是在 stage
上单击的,没有别的。如果不一样,说明鼠标点击的是别的东西,本意不是画矩形。
如果单击的不是 stage
。
,这将基本上禁用矩形绘图
您也可以通过 stopPropagation()
并为不同的事件阶段添加侦听器来实现此目的。但是我没有时间考虑这个。
我有点小问题。我正在创建一个 swf,它允许某人在已发布的 swf 中动态绘制一个矩形,然后他们可以拖动一个形状并将其放置在他们刚刚绘制的矩形内。
我有 swf,所以你可以画一个矩形,没问题。出现问题的地方是当试图将屏幕上的一个形状拖到新绘制的矩形中时,它最终会在拖动形状时绘制另一个矩形。
我想我的问题是如何 "turn off" 允许在绘制我想要使用的矩形后绘制矩形的代码?
这是我用来绘制矩形的代码(我从网上的教程中得到的)。可拖动的形状在绘制矩形之前不会显示(它们在下一帧上):
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
的目标来区分。
绘图监听器已添加到舞台。 currentTarget
就是 stage
。发起拖动的侦听器(可能)被添加到应该被拖动的对象中。 currentTarget
将是对此的引用。
由于冒泡,每个 MouseEvent
都会在 stage
处结束,这就是再次绘制矩形的原因。不同的是MouseEvent
的target
会不一样
在处理 MouseEvent
绘制矩形的函数中,只需检查是否 currentTarget == target
,如果是,则鼠标是在 stage
上单击的,没有别的。如果不一样,说明鼠标点击的是别的东西,本意不是画矩形。
如果单击的不是 stage
。
您也可以通过 stopPropagation()
并为不同的事件阶段添加侦听器来实现此目的。但是我没有时间考虑这个。