zoukankan      html  css  js  c++  java
  • Haxe2.10到Haxe3,NME到OpenFL的迁移备忘

    终于决定正式向Haxe3和OpenFL迁移了,这期间也遇到不少问题,这里总结记录如下:


    首先是Haxe3环境


    * 因为还想保留Haxe 2.10的环境,因此没有使用官网的Haxe 3安装包,而是下载了zip包,手动解压。

    * Haxe 3现在依赖于Neko 2.0,原来Haxe 2.10用的Neko 1.83已经不适用了,因此还需要下载neko 2.0的安装包,手动解压;千万不要以为neko没有用,实际上Haxe和OpenFL的构建工具链都是基于neko虚拟机的。

    * 修改Path,把Haxe 3和Neko 2的可执行文件路径添加进去。

    * 打开一个命令行窗口,执行haxe命令和haxelib命令,确认都是3.0版本。

    * 执行haxelib setup命令,设置第三方库的默认仓库路径,如果不修改的话,有可能还会使用原来haxe 2.10的仓库路径,而导致混乱。

    * 如果你需要本地开发库(即用haxelib dev lib_name lib_path设置的本地库)的话,那么需要升级一下haxelib,因为官网发布版内的haxelib有一个有关dev库设定的bug,会在dev版lib目录后添加'/',导致无法构建。需要升级haxelib,具体步骤为在命令行窗口内执行以下两个命令:

      haxelib selfupdate
      haxe update.hxml
    


    安装OpenFL


    * 执行haxelib install openfl即可下载

    * 执行haxelib run openfl setup,openfl会自动下载其依赖库,包括openfl-tools, openfl-html5, openfl-native, openfl-compatibility, openfl-samples, hxcpp,这可能需要一段时间,因为有几个库很大,另外国内访问haxelib服务器也不快,我是FQ下载的。

    * 分别执行haxelib run openfl setup windows, haxelib run openfl setup android来设置Windows和Android的环境,这些和以前NME时没有区别,因此我这里基本上一路回车跳过即可,唯一一点更新在于,原来我用的NME3.4使用的是Android NDK r7c,这次升级到了Android NDK r8c。


    项目文件的修改


    原来的nmml文件,现在openfl项目里改后缀为xml了,不过格式基本上无太大变化。

    把原来的<haxelib name="nme"/> 改成以下的两行即可,那个openfl-compatibility就是为了确保nme项目到openfl的兼容性的:

        <haxelib name="openfl" />
        <haxelib name="openfl-compatibility" />
    

    <ndll>命令现在好像没用了,可以删除。


    Android原生部分的第三方jar包目录和资源目录(即android项目下的libs, res, assets目录),我原来是用template命令来复制的,现在有问题,无法正常复制目录;我已经给openfl-tools项目提了issue。单个模板文件的复制没有问题,仍然工作正常。

    目前的解决方案是手动复制过来,反正只要不clean的话,这个工作也只要做一次就好。


    源码的修改


    * Hash和IntHash替换成Map

      Haxe3中去掉了Hash和IntHash类,换成了更通用的Map类,可以用任意对象作为键。不过麻烦的就是Hash和IntHash都是大量使用的基本数据结构,因此对老项目的影响比较大。我的做法是在一个被广泛导入的类中加入了如下定义:

    #if haxe3
    typedef Hash<T> = Map<String, T>;
    typedef IntHash<T> = Map<Int, T>;
    #end

    其它零星的未导入该类的就加入私有的类型定义。


    * inline static var现在不能使用表达式赋值了,而只能限于常量。

      这个影响也比较广泛,因为Haxe中的inline static var基本上相当于其它语言中的常量定义。官网给出的解释是内联的表达式可能会出现不可预料的结果,方案则是换成内敛的函数调用,不过我的解决方案更简单:能用常量的改用常量,不能用的改成普通的静态成员即可,普通静态成员依然是可以用表达式赋初值的。


    * Haxe中callback关键字被去掉了,取而代之的是更灵活的function.bind(),具体可以参见官网的移植指南。


    * Haxe3中基于模式匹配的switch语法已经强到爆棚,不过和Haxe2有些地方是不兼容的。比如:

      现在似乎必须有"default:"或"case _:"分支了;

      switch (true) { case a > 5: ...; case a <= 5: ...; } 这种方式似乎不行了,需要用if ... else if ... else ... 来代替。


    * haxe.FastList现在被haxe.ds.GenericStack取代,用法一致。


    * haxe.BaseCode现在挪到haxe.crypto.BaseCode。


    * 现在Haxe3不能自动推断出混合类型的数组,必须显式的声明为Array<Dynamic>。比如:

      var a = [ 3, "hello" ];             =========>>>>  var a: Array<Dynamic> = [ 3, "hello" ];
    

    * 因为Haxe3兼容的actuate库和spritesheet库都是新版本,这个新版本的包名大大简化了,而我的项目恰恰使用了这两个库的老版本,因此凡是引用这两个库的类都需要修改。




  • 相关阅读:
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 3037 Saving Beans【Lucas定理】【模板题】【模板】【组合数取余】
    8.Math 对象
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3161446.html
Copyright © 2011-2022 走看看