skip to main |skip to sidebar

2008-02-17

永远的 SoundComplete 事件

这已经不是什么新闻了,只是关注度好像不是很高,但我认为很有必要说几句。

自从 Flash Player 升级为 9.0.115.0 后 Sound.soundComplete 事件就消失了!没有任何征兆,一夜之间就从这个世界消失得无影无踪。

不要小看这个事件,没有它音频控制几乎不可能。比如以前一直使用 Sound.soundComplete 事件来实现音频的连续回放等各种特效,现在一切变为了南柯一梦。特别是 popforge 项目,一个 使用 AS3 来创作与修改音频的先端开发的新兴项目成为了最大的受害者之一,它有可能因此而从此玉损了!

大家署名来抗议吧The silent death of onSoundComplete event - a petition

2008-02-07

祝大家新春快乐

今天是初一,祝大家鼠年快快乐乐。也祝我的网站日月兴隆。

[AS3]让构造函数不执行 super()

在构造函数里一般 super() 必须执行。如果不写,在编译时会在构造函数的最上面添加 super()。但有时又需要不执行。比如以下代码:

class AbstractClass {
  public function AbstractClass() {
    throw new Error("Abstract class");
  }
}
class SubClass extends AbstractClass {
  public function SubClass() {
    trace("sub class");
  }
}

SubClass 对象会因为超类弹出错误而创建失败。但如果让 super() 不执行就可以了。

class SubClass extends AbstractClass {
  public function SubClass() {
    if(0) { //这里必须为返回 false 的表达式。但不能为 "false"(false 会被编译器忽视)。
      super();
    }
    trace("sub class");
  }
}

测试代码:

package {
  import flash.display.*;
  public class Test extends Sprite {
    public function Test() {
      new AbstractClass(); // -> Super CLass
      new SubClass1(); // -> Super CLass / Sub CLass1 start / Sub CLass1 end
      new SubClass2(); // -> Sub CLass2 start / Sub CLass2 end
    }
  }
}
class AbstractClass {
  public function AbstractClass() {
    trace("Super CLass");
  }
}
class SubClass1 {
  public function AbstractClass() {
    trace("Sub CLass1 start");
    super();
    trace("Sub CLass1 end");
  }
}
class SubClass2 {
  public function AbstractClass() {
    trace("Sub CLass2 start");
    if(0) {
      super();
    }
    trace("Sub CLass2 end");
  }
}

2008-02-03

[Flex]把 Sprite 添加到 Canvas 里的方

Flex FrameworkCanvas 是无法添加 Sprite 等非 UI 组件的 DisplayObject的。但有变通的办法。

1.使用 Adaptor 模式

Sprite 添加到 UIComponent,再把 UIComponent 添加到 Canvas

代码:

var mySprite:Sprite = new Sprite();
mySprite.graphics.beginFill(0xFFCC00);
mySprite.graphics.drawCircle( 40, 40, 40 );
var UIRef:UIComponent = new UIComponent();
myUI.addChild(UIRef);
UIRef.addChild(mySprite);

2.使用 rawChildren

使用 Canvas.rawChildren

代码:

var mySprite:Sprite = new Sprite();
mySprite.graphics.beginFill(0xFFCC00);
mySprite.graphics.drawCircle( 40, 40, 40 );
myUI.rawChildren.addChild(mySprite);