【发布时间】:2015-02-16 10:00:55
【问题描述】:
我正在尝试使用 AS3 制作一个 Flash 应用程序,我可以使用钢笔工具绘制不同颜色的线条,还可以用不同颜色填充图像上的形状,现在我已经完成了各种教程并实现了它,但是在最后,我面临 2 个问题,即使经过 3 天的努力,我也无法解决:
- 如何在使用钢笔工具形成的形状内填充颜色,
说如果我使用钢笔工具画一个粗略的圆圈然后我尝试填充
它是绿色的,我怎样才能检测到我需要填写的
MovieClips。 - 当我在形状上画线然后尝试填充形状时, 形状被填充,但线条仍然出现在形状的顶部 充满色彩。
您可以通过访问this link 更好地了解我所取得的成就,单击钢笔符号和油漆桶符号以查看其工作原理。
以下是我的钢笔工具和填充颜色代码:
我绘制一个精灵添加一个图像,然后使用属性检测颜色来绘制一条我选择的颜色线,然后是填充颜色的代码,我将图像划分为各种MovieClips,然后再合成一个并检测鼠标是否点击了哪个剪辑并用选定的颜色填充它。
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
bucbut.addEventListener(MouseEvent.CLICK,nClick0PC);
/////////////pentool code --------
convertToBMD();
pbut.addEventListener(MouseEvent.CLICK,nClick0P);
function nClick0P(event:MouseEvent):void{
spBoard.addEventListener(MouseEvent.ROLL_OUT,boardOut);
spBoard.addEventListener(MouseEvent.MOUSE_MOVE,boardMove);
spBoard.addEventListener(MouseEvent.MOUSE_DOWN,boardDown);
spBoard.addEventListener(MouseEvent.MOUSE_UP,boardUp);
}
var spBoard:Sprite=new Sprite();
this.addChildAt(spBoard,0);
spBoard.x=20;
spBoard.y=100;
var owl2:owl;
owl2 = new owl();
owl2.name="owl1";
spBoard.addChildAt(owl2,0);
owl2.x=315;
owl2.y=180;
var shDrawing:MovieClip = new MovieClip();
//var shDrawing:Shape=new Shape();
spBoard.addChild(shDrawing);
//spBoard.addChildAt(shDrawing,1);
function nClick0PC(event:MouseEvent):void{
owl2.addEventListener(MouseEvent.CLICK,on_owl_click);
}
var doDraw:Boolean=false;
var lineSize:Number=10;
var currentColor:Number;
spBoard.graphics.lineStyle(1,0x000000);
spBoard.graphics.beginFill(0xFFFFFF);
spBoard.graphics.drawRect(0,0,602,330);
spBoard.graphics.endFill();
spBoard.filters = [ new DropShadowFilter() ];
function boardOut(e:MouseEvent):void {
doDraw=false;
}
function boardDown(e:MouseEvent):void {
doDraw=true;
trace(activeColor);
shDrawing.graphics.lineStyle(lineSize,activeColor);
shDrawing.graphics.endFill();
shDrawing.graphics.moveTo(shDrawing.mouseX,shDrawing.mouseY);
}
function boardUp(e:MouseEvent):void {
doDraw=false;
}
function boardMove(e:MouseEvent):void {
var curX:Number=shDrawing.mouseX;
var curY:Number=shDrawing.mouseY;
if(doDraw && checkCoords(curX,curY)){
shDrawing.graphics.lineTo(curX,curY);
e.updateAfterEvent();
}
}
function checkCoords(a:Number,b:Number):Boolean {
if(a>=605-lineSize/2 || a<=lineSize/2 || b>=311-lineSize/2 || b<=lineSize/2){
return false;
}
else {
return true;
}
}
/////////////---------------------color picker
colors.addEventListener(MouseEvent.MOUSE_UP, chooseColor);
var pixelValue:uint;
var activeColor:uint = 0x000000;
var ct:ColorTransform = new ColorTransform();
var colorsBmd:BitmapData;
function convertToBMD():void
{
colorsBmd = new BitmapData(colors.width,colors.height);
colorsBmd.draw(colors);
}
function chooseColor(e:MouseEvent):void
{
pixelValue = colorsBmd.getPixel(colors.mouseX,colors.mouseY);
activeColor = pixelValue;//uint can be RGB!
ct.color = activeColor;
//shapeSize.transform.colorTransform = ct;
}
////////////////////========================================Fill color
function on_owl_click(e:MouseEvent):void {
for (var i:int = 0; i < owl2.numChildren; i++) {
if (owl2.getChildAt(i).hitTestPoint(mouseX,mouseY,true)) {
trace(owl2.getChildAt(i).name);
owl2.getChildAt(i).transform.colorTransform= ct;
}
}
}
【问题讨论】:
-
我看到猫头鹰是
BitmapData。填充操作是BitmapData.floodfill()方法。因此,您需要致电BitmapData.draw()将您的笔画添加到该 BitmapData。 -
嗨 subdan,实际上 owl 是一个影片剪辑,其中包含几个影片剪辑,所以当我单击 owl 时,我可以检测到其中的哪个影片剪辑已被单击,并且我可以对影片剪辑进行颜色转换,问题是,我如何在使用钢笔工具绘制的形状内填充颜色以及如何使填充的颜色出现在绘制的线条上方,如果在猫头鹰脸上画了一条线,我填充颜色,线条仍然显示,我可以在该特定区域填写行吗...提前谢谢...。
-
@subdan ,您能指导我在哪里进行更改吗?到目前为止我编写的代码仅在上面......谢谢
-
你能提供一个FLA文件吗?
-
简而言之。你需要一个画布(位图)。在画布上绘制一只猫头鹰 (BitmapData.copyPixels)。填充动作(Paint bucket)它是 BitmapData 的一个 floodFill 方法。绘制动作(铅笔)它是一个 BitmapData.draw 方法。
标签: actionscript-3 flash