2014-01-22 64 views
0

我有一个名为“BlueBox”的MovieClip实例,它只是一个蓝色的“绘图对象”。这是一个名为“option1MC”,这是“内部option1Container”,这是在舞台上的容器内。它的颜色可以像这样被改变:ActionScript 3 - 向对象添加渐变

option1Container.addEventListener(MouseEvent.MOUSE_OVER, option1ContainerOver); 

var optionOver:ColorTransform = new ColorTransform(); 
optionOver.color = 0xC56516; 

function option1ContainerOver(evt:Event):void { 
    option1Container.option1MC.BlueBox.transform.colorTransform = optionOver; 
} 

我想改变颜色的渐变。这是我的尝试:

var mtr:Matrix = new Matrix(); 
mtr.createGradientBox(option1Container.option1MC.BlueBox.width, option1Container.option1MC.BlueBox.height, 0, 0, 0); 
mtr.graphics.beginGradientFill(GradientType.LINEAR, [0xFF0000, 0x0000FF], [1, 1], [0x00, 0xFF], mtr); 
mtr.graphics.drawRect(0,0,option1Container.option1MC.BlueBox.width, option1Container.option1MC.BlueBox.height); 

但是,现在当我运行FLA文件,这我给我一个错误说:

Access of possible undefined property graphics through a reference with static type flasg.geom:Matrix: 

,并参照线

mtr.graphics.beginGradientFill(GradientType.LINEAR, [0xFF0000, 0x0000FF], [1, 1], [0x00, 0xFF], mtr); 
mtr.graphics.drawRect(0,0,option1Container.option1MC.BlueBox.width, option1Container.option1MC.BlueBox.height); 

任何想法为什么?

+0

因为Matrix不是具有'graphics'成员的'DisplayObject'。 –

回答

1

A Matrix没有graphics属性。您需要将此应用于具有graphics属性的DisplayObject。这将是这个样子您的设置:

//create the sprite to do the gradient fill on or use your MovieClip 
//var spriteObject:Sprite = new Sprite() or just use option1Container; 

//enter your matrix 
var mtr:Matrix = new Matrix(); 
mtr.createGradientBox(option1Container.BlueBox.width, option1Container.BlueBox.height, 0, 0, 0); 

//apply it to the sprite 
sprite.graphics.beginGradientFill("linear", [0xFF0000, 0x0000FF], [1, 1], [0x00, 0xFF], mtr); 
sprite.graphics.drawRect(0, 0, 50, 40); 
sprite.graphics.endFill(); 
addChild(sprite); 

我创建了一个精灵变量在这里,这是没有必要的,因为你可以交换spriteoption1Container

您可以参考Adobe的这种帮助,以及: http://help.adobe.com/en_US/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7dd7.html

现在,如果您在IDE中绘制MovieClip图形,您目前无法对其进行更改。在这种情况下,你可以创建一个新的MovieClip并将其添加到您的集装箱像这样:

//note I made a target variable just to save on typing: 
var target:MovieClip = option1Container.option1MC.BlueBox; 
var gradientLayer:MovieClip = new MovieClip(); 

var gradientBox:Matrix = new Matrix(); 
gradientBox.createGradientBox(target.width, target.height, 0, 0, 0); 
gradientLayer.graphics.beginGradientFill("linear", [0xFF0000, 0x0000FF], [1, 1], [0x00, 0xFF], gradientBox); 
gradientLayer.graphics.drawRect(0, 0, target.width, target.height); 
gradientLayer.graphics.endFill(); 

//giving the asset a name will allow you to easily remove it later 
gradientLayer.name = "gradientLayer"; 

target.addChild(gradientLayer); 

通知我给梯度资产“gradientLayer”的名称。如果您想稍后移除此孩子,则可以这样做:

option1Container.option1MC.BlueBox.removeChild(option1Container.option1MC.BlueBox.getChildByName("gradientLayer")); 
+0

hm,option1Container已经处于状态,所以我不需要做addChild(option1Container)对吗?出于某种原因,当我做“option1Container.graphics.beginGradientFill(”linear“,[0xFF0000,0x0000FF],[1,1],[0x00,0xFF],mtr); option1Container.graphics.drawRect(0, 50,40); option1Container.graphics.endFill();“它不会更改动画片段内蓝色框的颜色。我也尝试做'option1Container.BlueBox.graphics',但是这并没有改变它的颜色。任何想法为什么? – user2817200

+0

没有真正看着你的设置,我不知道为什么它不会工作。我提供的代码是正确的,当'spriteObject'是一个'新的Sprite()'或'新的MovieClip();'时,一个可行的例子,并且如果我将一个子元素添加到精灵并应用图形属性,也可以正常工作。 –

+0

hm,好吧假设舞台上有一个叫做'option1Container'的movieclip,里面有一个叫做'option1MC'的movieclip,里面有一个叫做'BlueBox'的movieclip,它是一个带圆边的矩形的实例,在Flash中绘制出来并转换为放置在图书馆中的动画片段。要将BlueBox的颜色从蓝色改变,我会做“option1Container.option1MC.BlueBox.transform.colorTransform = optionOver;” (鉴于optionOver是一种颜色变换)..你会知道如何将BlueBox的颜色从颜色更改为渐变? – user2817200