当前位置: 代码迷 >> Web前端 >> actionscript深入不止一点点(软件工程师篇)
  详细解决方案

actionscript深入不止一点点(软件工程师篇)

热度:132   发布时间:2012-11-22 00:16:41.0
actionscript深入不止一点点(程序员篇)

1. 带有命名空间的ActionScript文件 : Package
组织大量的as文件,如何防止命名冲突? 和Java一样,基本思路是使用Package,如:

Js代码 复制代码
  1. //?这是actionscript.不是js代码 ??
  2. package?com.example.programmingas3{ ??
  3. ????public?class?Goods?{ ??
  4. ????????public?function?getName(id:int):?String{ ??
  5. ????????????if(id?==?1){ ??
  6. ????????????????return?"IBM?Laptop"; ??
  7. ????????????}?else?{ ??
  8. ????????????????return?"Samsung?MP3"; ??
  9. ????????????} ??
  10. ????????} ??
  11. ????} ??
  12. }??
// 这是actionscript.不是js代码
package com.example.programmingas3{
    public class Goods {
        public function getName(id:int): String{
            if(id == 1){
                return "IBM Laptop";
            } else {
                return "Samsung MP3";
            }
        }
    }
}



这个文件的目录存放结构必须和包名一致。这里包名是com.example.programmingas3,那么 Goods.as相应地应存储在com\example\programmingas3\下,这样,如果其他人也定义了一个同名Goods.as文件,就可以放到其他包中。从而达到规划大规模源码的基础。

假设com上级目录在d:\,现在考虑编译Goods.as.命令行进入d:\,运行下面的命令编译:
amxmlc com\example\programmingas3\Goods.as

很意外!返回结果:
D:\com\example\programmingas3\Goods.as: Error: A file found in a source-path must have the same package structure '', as the
definition's package, 'com.example.programmingas3'.

为什么呢? 其实和Java程序不一样,带包名的ActionScript是不能直接编译的,必须有一个主文件引导才可以。在包的根目录,这里就是指com上级的目录,在根目录下建立一个主as文件,名为HelloWorld.as,内容如下:

Js代码 复制代码
  1. //?这是actionscript.不是js代码 ??
  2. package?{ ??
  3. ??import?com.example.programmingas3.*; ??
  4. ??import?flash.display.*; ??
  5. ??import?flash.text.*; ??
  6. ??
  7. ??public?class?HelloWorld?extends?Sprite{ ??
  8. ????public?function?HelloWorld(){ ??
  9. ????????var?goods:Goods?=?new?Goods(); ??
  10. ??????? ??
  11. ????????var?myField:TextField?=?new?TextField(); ??
  12. ????????myField.x?=?20; ??
  13. ????????myField.y?=?30; ??
  14. ????????myField.autoSize?=?TextFieldAutoSize.LEFT; ??
  15. ????????myField.text?=?goods.getName(1); ??
  16. ????????addChild(myField); ??
  17. ????} ??
  18. ??} ??
  19. }??
// 这是actionscript.不是js代码
package {
  import com.example.programmingas3.*;
  import flash.display.*;
  import flash.text.*;

  public class HelloWorld extends Sprite{
    public function HelloWorld(){
        var goods:Goods = new Goods();
       
        var myField:TextField = new TextField();
        myField.x = 20;
        myField.y = 30;
        myField.autoSize = TextFieldAutoSize.LEFT;
        myField.text = goods.getName(1);
        addChild(myField);
    }
  }
}


上面的代码是用import关键字引用Goods类,然后就可以像在一个文件中使用Goods那样使用它了。

编译:
amxmlc HelloWorld.as
运行
flashplayer HelloWorld

以下是运行结果:



3. 大规模ActionScript文件交换 : .SWC
在实际项目中你总可能使用到第三方的as文件,按照前面学习的知识,第三方提供的as文件通常应该存储在在以自己公司域名命名的目录下(就是按宝组织源码),使用者只要把这些文件复制到本机某个目录下,然后再import进来就可以使用。

问题提出:大量的as文件不方便交换;其二,第三方组织可能不想公开他们的源代码,怎么办? 解决方案是:第三方提供编译的as给你!

前面不是刚说过as不能编译吗? 其实不完全正确,FlexSDK中的compc就可以将那些带包名的as文件编译成swf文件,并打包成一个文件,文件的扩展名是.swc,在Flash中这叫组件。其实组件文件格式实际上是zip, 把扩展名.swc改成.zip用winrar打开看看就知了

好,仍然以前面例子为基础,现在让我们回顾一下代码目录结构


上面还新增了一个Orders.as,内容如下:

Js代码 复制代码
  1. //?这是actionscript.不是js代码 ??
  2. package?com.example.programmingas3{ ??
  3. ????public?class?Orders{ ??
  4. ???????? ??
  5. ????????public?function?getName(id:int):?String{ ??
  6. ????????????if(id?==?1){? ??
  7. ????????????????return?"ORDER001"; ??
  8. ????????????}?else?{ ??
  9. ????????????????return?"ORDER002"; ??
  10. ????????????}? ??
  11. ????????} ??
  12. ????} ??
  13. }??
// 这是actionscript.不是js代码
package com.example.programmingas3{
	public class Orders{
		
		public function getName(id:int): String{
			if(id == 1){ 
				return "ORDER001";
			} else {
				return "ORDER002";
			} 
		}
	}
}


改造过的HelloWorld.as不但调用了Goods.as,而且调用了Order.as

Js代码 复制代码
  1. //?这是actionscript.不是js代码 ??
  2. package?{ ??
  3. ??import?com.example.programmingas3.*; ??
  4. ??import?flash.display.*; ??
  5. ??import?flash.text.*; ??
  6. ??
  7. ??public?class?HelloWorld?extends?Sprite{ ??
  8. ????public?function?HelloWorld(){ ??
  9. ????????var?order:Orders?=?new?Orders(); ??
  10. ????????var?goods:Goods???=?new?Goods(); ??
  11. ???????? ??
  12. ????????var?myField:TextField?=?new?TextField(); ??
  13. ????????myField.x?=?20; ??
  14. ????????myField.y?=?30; ??
  15. ????????myField.autoSize?=?TextFieldAutoSize.LEFT; ??
  16. ????????myField.text?=?order.getName(1)?+?"?--?"?+?goods.getName(2)?; ??
  17. ????????addChild(myField); ??
  18. ????} ??
  19. ??} ??
  20. }??
// 这是actionscript.不是js代码
package {
  import com.example.programmingas3.*;
  import flash.display.*;
  import flash.text.*;

  public class HelloWorld extends Sprite{
    public function HelloWorld(){
		var order:Orders = new Orders();
		var goods:Goods   = new Goods();
		
		var myField:TextField = new TextField();
		myField.x = 20;
		myField.y = 30;
		myField.autoSize = TextFieldAutoSize.LEFT;
		myField.text = order.getName(1) + " -- " + goods.getName(2) ;
		addChild(myField);
    }
  }
}



1). 将com包下的文件打包成.swc,准备被HelloWorld.as调用.进入命令行d:\,执行:
compc -include-sources com\example\programmingas3\ -output c:/3rd.swc

这将在c:\生成组件文件3rd.swc

2). 编译主文件HelloWorld.as
? amxmlc -library-path=c:/3rd.swc HelloWorld.as
注意参数-library-path是如何引用组件的。生成的HelloWorld.swf将不必依赖组件文件
3). 运行HelloWorld.swf
flashplayer HelloWorld.swf
结果如下:


最后我们来对比一下Java和SWF的雷同:

  相关解决方案