如何在单击按钮AS3时更改精灵颜色

时间:2013-01-02 09:09:22

标签: actionscript-3 flash

我有一个精灵(圆圈),我使用actionscript制作它。 这是伪代码:

    var board:Sprite = new Sprite();
    var spDot:Sprite = new Sprite()
    spDot.graphics.lineStyle(1,0x0000CC);   
    spDot.graphics.beginFill(0xFFFFFF); //white;
    spDot.graphics.drawCircle(0,0,dZ);  
    spDot.graphics.endFill();
    spDot.name="v";
    board.addChild(spDot);

我有一个按钮“btnA”可将当前的精灵颜色(白色)更改为黑色。

btnA.addEventListener(MouseEvent.CLICK, changeColor);
function changeColor(evt:MouseEvent){
     (board.getChildByName("v") as Sprite).graphics.beginFill(0x000000);
}

但是,我的问题是,它在这部分中返回了错误:(board.getChildByName("v") as Sprite).graphics.beginFill(0x000000);

实际上我只是想用(board.getChildByName("v") as Sprite).graphics.beginFill(0x000000);来改变颜色。 你有什么主意吗?谢谢!

2 个答案:

答案 0 :(得分:2)

我建议不要披露应该着色的显示对象的实现,如果你同意这个陈述,你可以使用ColorTransform;)

  

ColorTransform类允许您调整显示对象中的颜色值。颜色调整或颜色转换可应用于所有四个通道:红色,绿色,蓝色和Alpha透明度。

实施例

btnA.addEventListener(MouseEvent.CLICK, buttonDidClick);

function buttonDidClick(e:MouseEvent) {
    transformColor(board.getChildByName("v"), 0x000000);
}

function transformColor(target:DisplayObject, color:uint):void {
    var colorTransform:ColorTransform = new ColorTransform();
    colorTransform.color = color;
    target.transform.colorTransform = colorTransform;
}

答案 1 :(得分:1)

这种最简单的方法是清除图形数据并重新绘制到图形对象中。

function drawCircle(sprite:Sprite, radius:Number = 40, fillColor:int = 0):Sprite
{
  if (!sprite) return null;

  const g:Graphics = sprite.graphics;

  g.clear();
  g.lineStyle(1, 0x0000CC);   
  g.beginFill(fillColor);
  g.drawCircle(0, 0, radius);
  g.endFill();

  return sprite;
}

此外,我强烈建议您在需要某种类型时不要使用隐式调用:

function changeColor(evt:MouseEvent)
{
  // hides the fact, that you're having an instance of am unexpected type
  (board.getChildByName("v") as Sprite).graphics.beginFill(0x000000);
}

虽然你有一个有效的引用,但会导致1009 / null指针。

function changeColor(evt:MouseEvent)
{
  // fails fast - for example when you change from sprite to bitmap.
  Sprite(board.getChildByName("v")).graphics.beginFill(0x000000);
}

在这种情况下,快速失败是适合投射的方式。