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库都是新版本,这个新版本的包名大大简化了,而我的项目恰恰使用了这两个库的老版本,因此凡是引用这两个库的类都需要修改。




  • 相关阅读:
    docker 容器使用 systemctl 命令报错
    lxml 这个包和openpyxl 起冲突
    解决GPG error: The following signatures couldn't be verified because the public key is not available
    pyinstaller bug
    PyCharm使用技巧及常用快捷键
    python 软件目录规范
    Wpf canvas 绘图 像素对齐
    wpf ListView 隔行 (各行) 显示 不同 背景 颜色
    C# wpf 获取 数字 类型 所占字节数
    Mybatis-Plus QueryWrapper +sql自定义查询
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3161446.html
Copyright © 2011-2022 走看看