分享

haXe相关开源资源(一)

 quasiceo 2015-01-14

[开源项目] haXe相关开源资源(一)

查看: 3425|回复: 4


Rank: 5Rank: 5

威望
30 点
义气
12 点

退役舵主 AQ小生

楼主
发表于 2010-5-3 13:45:55 |只看该作者
不得不说,haXe从最初的一个小众语言,到今天,已经不得不称之为一个牛B项目了。下面,我们来看一下Motion-Twin和haXe社区的这帮人究竟干了什么?

1. haXe语言,这个是几乎所有项目的核心。很多人对它的理解还停留在对AS 3的另一个实现的程度上,但事实上远非如此。

编译成swf文件是haXe的一个重头戏。它提供了直到Flashplayer 10.0的全部API和功能。并通过一个AIR库,提供了结合Flex SDK开发AIR应用的方式。除此之外,早在AIR还是一个构想,项目名字还是Apollo的时候,haXe就已经可以通过swhx库开发非常完善的基于swf的桌面应用程序了。

在我们比较早的印象中,haxe写js比较鸡肋,但现在已经完全不是这样了,haxe为js输出提供了十分强大规范的库,只是由于我们目前并不需要这么强大的js功能,或者说js的效率仍然达不到要求,所以这个功能暂时看来用处并不大,但相信随着各个浏览器对JS执行性能的进一步提升,它早晚会绽放出璀璨的光芒(事实上,它并不比Google的GWT差,某种程度上来说,甚至还有说超出)。

nekoVM字节码编译输出。neko在国内应用极少,在国外应用也不多,这东西某种程度上来说相对于java和python这些语言,并没有任何亮点,然而,我们可以学一种haxe语言,就可以获得实现java、python完全相同的功能,甚至通过ndll的调用,还可以远远超出它们,这应该就是最大的亮点了吧。

php输出,也许会有很多人纳闷,我们真的需要一个输出php的东西吗?也许你很熟悉php,那么这东西就没有必要了。但如果你不熟悉php,还想写服务器端应用呢?当然,你可以列举出一千条理由说没有必要,但我只有一个理由:它避开或者说解决了PHP那混乱的命名空间。可以让你有更多的时间集中在对业务逻辑的处理上,并且输出的代码执行效率也并不差(附带说一点,其实它的安全性处理的也不错,haxe输出的php源码,某种程度上来说就是一个超轻量级的非MVC模式框架,应该算是代理模式的框架了)。

cpp输出,这玩意最初是为了可以开发iphone应用出现的,出现的时间比Adobe 在CS5中增加Iphone输出之前。在2008年末,其开发者就已经实现了在iphone上运行一个haxe的基于flash的二维物理引擎,其基本原理是把haxe的flash API映射为实现相同功能的CPP库,然后生成CPP源码,最后通过不同平台的编译器,即可编译为目标平台的应用程序。只是由于苹果的新的条款的显示,这东西也和Adobe的Iphone输出一样,成了彻底的鸡肋。不知道他们后面会有什么动作,这个部分是就此停滞,还是会转做他用。

AS 3输出,这个应该是对我们来说最有用的一个功能了吧?看下面的源码和输出结果,haxe对它们进行了一些简单的优化,并且局部变量在输出的时候也有一些简单的混淆,是不是很方便?
  1. ==== AS 3输出结果 ====
  2. package  {
  3.         import flash.display.Graphics;
  4.         public class Geometric {
  5.                 public function Geometric() : void {
  6.                         null;
  7.                 }
  8.                
  9.                 static public function drawRing(object : flash.display.Graphics,x : Number,y : Number,radio1 : uint,radio2 : uint,angle1 : int = 0,angle2 : int = 360) : void {
  10.                         object.moveTo(Math.sin(angle1 * Math.PI / 180) * radio1 + x,-Math.cos(angle1 * Math.PI / 180) * radio1 + y);
  11.                         {
  12.                                 var _g1 : int = angle1, _g : int = (angle2 + 1);
  13.                                 while(_g1 < _g) {
  14.                                         var i : int = _g1++;
  15.                                         object.lineTo(Math.sin(i * Math.PI / 180) * radio1 + x,-Math.cos(i * Math.PI / 180) * radio1 + y);
  16.                                 }
  17.                         }
  18.                         {
  19.                                 var _g12 : int = 0, _g2 : int = (angle2 - angle1 + 1);
  20.                                 while(_g12 < _g2) {
  21.                                         var i2 : int = _g12++;
  22.                                         object.lineTo(Math.sin((angle2 - i2) * Math.PI / 180) * radio2 + x,-Math.cos((angle2 - i2) * Math.PI / 180) * radio2 + y);
  23.                                 }
  24.                         }
  25.                         object.lineTo(Math.sin(angle1 * Math.PI / 180) * radio1 + x,-Math.cos(angle1 * Math.PI / 180) * radio1 + y);
  26.                 }
  27.                
  28.                 static public function drawCircular(object : flash.display.Graphics,x : Number,y : Number,radio1 : uint,angle1 : int = 0,angle2 : int = 360) : void {
  29.                         object.moveTo(x,y);
  30.                         {
  31.                                 var _g1 : int = angle1, _g : int = (angle2 + 1);
  32.                                 while(_g1 < _g) {
  33.                                         var i : int = _g1++;
  34.                                         object.lineTo(Math.sin(i * Math.PI / 180) * radio1 + x,-Math.cos(i * Math.PI / 180) * radio1 + y);
  35.                                 }
  36.                         }
  37.                         object.lineTo(x,y);
  38.                 }
  39.                
  40.         }
  41. }

  42. ==== haXe源码 ====
  43. package;

  44. import flash.display.Graphics;

  45. /**
  46.         The Ring class.<br />
  47.         作者 Icebird<br />
  48.         说明: <br />
  49.         事件:无。
  50. **/


  51. class Geometric
  52. {
  53.         /**
  54.                 构造函数
  55.         **/
  56.         function new()
  57.         {
  58.                
  59.         }

  60.         /**
  61.                 绘制圆环
  62.         **/
  63.         public static function drawRing(object:Graphics, x:Float, y:Float, radio1:UInt, radio2:UInt, ?angle1:Int = 0, ?angle2:Int = 360):Void
  64.         {
  65.                 object.moveTo(Math.sin(angle1 * Math.PI/180)*radio1 + x, -Math.cos(angle1 * Math.PI/180)*radio1 + y);
  66.                 for(i in angle1...(angle2 + 1))
  67.                 {
  68.                         object.lineTo(Math.sin(i* Math.PI/180)*radio1 + x, -Math.cos(i* Math.PI/180)*radio1 + y);
  69.                 }

  70.                 for(i in 0...(angle2 - angle1 + 1))
  71.                 {
  72.                         object.lineTo(Math.sin((angle2-i)* Math.PI/180)*radio2 + x, -Math.cos((angle2-i)* Math.PI/180)*radio2 + y);
  73.                 }
  74.                 object.lineTo(Math.sin(angle1 * Math.PI/180)*radio1 + x, -Math.cos(angle1 * Math.PI/180)*radio1 + y);
  75.         }

  76.         /**
  77.                 绘制扇形
  78.         **/
  79.         public static function drawCircular(object:Graphics, x:Float, y:Float, radio1:UInt, ?angle1:Int = 0, ?angle2:Int = 360):Void
  80.         {
  81.                 object.moveTo(x, y);
  82.                 for(i in angle1...(angle2 + 1))
  83.                 {
  84.                         object.lineTo(Math.sin(i* Math.PI/180)*radio1 + x, -Math.cos(i* Math.PI/180)*radio1 + y);
  85.                 }
  86.                 object.lineTo(x, y);
  87.         }
  88. }
复制代码
总之,haXe也许在各个方面的表现并不十分出色,但其思路很独特,Java的思路是为每个平台提供一个虚拟机,实现“一次编译,到处运行”,但由于各个平台的差异过大,这个想法真正实施起来,十分困难。但haXe最初的思路却是“一次编写,到处编译”,或者说,haXe就是一个原型语言。做为原型语言,haXe可以在大多数情况下,编译的代码直接运行即可,特别是编译swf文件,其编译后的文件效率很多情况下甚至比官方的AS 3编译后还要高一些,而其他的各种编译目标,事实上编译后的结果也可以满足绝大多数情况下的功能需要,即使有一些比较极端的需求,像php和js这些编译目标仍然可以在生成后对生成的代码进行优化。

2.HSS

HSS是什么东西?简单来说,就是用来辅助写css的一个工具。这是一个很有趣,也很有用的小工具,介绍页面和下载地址如下:

http:///projects/hss

使用方法:
  1. hss myfile.hss -output dir
复制代码
它使用一种和css十分相似的hss语法文件做为源文件。并且在最后把它编译(或者说转换)成css。并且语法可以接受css的全部语法,也就是说css文件也可以改名为hss做为它的源文件,只是编译输出不会有任何变化而已。

hss有较严格的语法检查,比如
  1. pre {
  2.     color : #FF0000
  3. }
复制代码
编译时会出现如下编译错误:

myfile.hss:3: Unexpected '}' maybe missing ;

它告诉你遇到了错误的花括号,可能是遗漏了结尾的分号,这很有用的。

hss支持变量定义,如
  1. var mycolor = #1111AA;
  2. var myfont = "Trebuchet MS", Arial, sans-serif;

  3. body {
  4.     color : $mycolor;
  5.     font : $myfont;
  6. }
复制代码
支持块变量定义,如
  1. var nomargin = { margin : 0px; padding : 0px; }

  2. pre {
  3.     $nomargin;
  4.     color : #FF0000;
  5. }
复制代码
注意,下面一个特性是最重要的。
  1. .faq {
  2.     color : #BC683C;
  3.     .form {
  4.         width : 100px;
  5.         textarea {
  6.             width : 100%;
  7.             height : 80px;
  8.         }
  9.         .name {
  10.             font-weight : bold;
  11.         }
  12.     }
  13.     ul {
  14.         margin-left : 20px;
  15.         margin-bottom : 20px;
  16.     }
  17. }
复制代码
编译解释后的形式为:
  1. .faq {
  2.     color : #BC683C;
  3. }

  4. .faq .form {
  5.     width : 100px;
  6. }

  7. .faq .form textarea {
  8.     width : 100%;
  9.     height : 80px;
  10. }

  11. .faq .form .name {
  12.     font-weight : bold;
  13. }

  14. .faq ul {
  15.     margin-left : 20px;
  16.     margin-bottom : 20px;
  17. }
复制代码
这样是不是很方便?

hss还有一些其他特性如对选择器的支持等,详情见官方主页。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约