对于客户,我开发了一个用于用户界面的iOS + Android应用程序Cordova (PhoneGap).现在,作为这个应用程序的更新,我正在尝试添加一个用Haxe编写的游戏.最初这个游戏是为这个游戏编写的Flash target,但是我已经更新了它以便与C++目标一起工作Android and iOS.
在Android上,很容易Cordova使用活动将其与应用程序集成(Haxe部分作为单独的活动运行),但我在iOS上实现类似结果时遇到一些麻烦.
到目前为止,我已经尝试将所有hxcpp生成的代码包含在我的项目中(就像当你执行"nme build ios"时NME设置XCode项目一样),hxRunLibrary()当我希望游戏运行时,我正在调用我的代码.
问题是hxRunLibrary()似乎想要创建自己的UIApplication实例,由于我的主应用程序已经在运行实例,因此失败并出现以下错误:
*** Assertion failure in void UIApplicationInstantiateSingleton(Class)(), /SourceCache/UIKit_Sim/UIKit-2380.17/UIApplication.m:2037
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'There can only be one UIApplication instance.'
Run Code Online (Sandbox Code Playgroud)
我认为这可能与SDL有关,Haxe将其用于图形.根据我的理解,SDL需要从应用程序的主要功能运行,这与Cocoa产生冲突,也需要从main函数运行.
这有什么简单的方法吗?我查看了hxcpp源代码,但无法找到UIApplication相关代码或SDL的任何条目代码.
也许有人可以指出我正确的方向.谢谢!
我有一个在Haxe上编写自己的协议,数据结构和逻辑的跨平台实现.如何在iOS和OSX的企业应用程序(使用本机UI)中构建和使用它?
我只是看看Haxe 3.2.0-rc.2的更改日志,并在新功能列表的末尾找到了这个:
cpp : inititial implementation of cppia scripting
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我这意味着什么?我可以说它与C++有关,但谷歌搜索这与编程/脚本没有任何关系,除非你计算与Haxe相关的结果.
好的,我正在尝试将NME示例文件初始构建到Android设备上.
我可以为HTML5,Flash和Windows等平台构建,但是我无法在Android上进行构建 - 我总是会收到错误说:
Unable to find a javac compiler;
com.sun.tools.javac.Main is not on the classpath.
Perhaps JAVA_HOME does not point to the JDK.
Is is currently set to "C:\Program Files (x86)\Java\jre7"
Run Code Online (Sandbox Code Playgroud)
好的 - 显而易见吧?但我检查,复查,重新启动,编辑环境变量并取得绝对确保JAVA_HOME变量实际上是指向的JDK.
有什么解释吗?
这是我的堆栈类的一部分.它在flash中工作正常,但在cpp/windows中,push方法并不总是有效.我不太了解C++,无法理解为什么它可能不一致.
var arr:Array<T>;
public var length(default, null):Int;
public function new() {
clear();
}
public inline function clear():Void {
arr = [];
length = 0;
}
public inline function push(t:T):Void {
// Log.trace(arr) -> []
arr[length++] = t;
// Log.trace(arr) -> []
}
Run Code Online (Sandbox Code Playgroud)
当push内联时,类似的东西stack.push(0)并不总是改变数组,就像它的真实长度固定为0(length然而变量确实增加).其他时候,它工作正常.如果我删除inline关键字,它一直正常工作.
内联(替换stack.push(0))时生成的cpp :
::msg::utils::Stack tmp = this->stack;
::msg::utils::Stack _this = tmp;
Array< int > tmp1 = _this->arr;
int tmp2 = (_this->length)++;
tmp1[tmp2] = (int)0;
Run Code Online (Sandbox Code Playgroud)
当没有内联(内部push())时:
Dynamic …Run Code Online (Sandbox Code Playgroud) 我有兴趣将Haxe转换为我的主要编程语言,到目前为止它已经很棒了,但是我的一个要求是我可以将OpenGL 3.3和C++目标一起用于3D游戏工作.
然而,这似乎是一件奇怪的事情,因为我在网上找到关于在Haxe中使用OpenGL的信息很少.我找到了一些库,特别是hx-ogl和foo3d(抽象的类似ogl),但它们都没有维护,我无法让它们工作.我也发现了一些3D引擎,但我想使用纯OpenGL.此外,我只需要针对C++,因此不需要跨平台性.
有没有人成功使用OpenGL与Haxe C++合作?
因为几天我试着写一个用于线路编码的Haxe hxcpp包装器,用C代码编程; 该库非常简单,标题还包含一个extern C.我遵循snowkit linc宏模板,但是我无法获得编译C模块的方法,并且它与项目的其余部分链接,我不确定怎么继续
我没有问题将代码编译为C对象并将其与我的系统中的C可执行文件(OSX el Capitan)链接,因此我假设我在haxe项目中做错了,也许我无法真正将hxcpp链接到C库直接使用来自haxe的构建过程,或者我应该通过手动编写命令来手动管道.
@:keep
@:structAccess
@:include('linenoise.h')
#if !display
@:build(linc.Linc.touch())
@:build(linc.Linc.xml('linenoise'))
#end
extern class LineNoise {
@:native("linenoiseClearScreen")
static function linenoiseClearScreen(): Void;
} //LineNoise
Run Code Online (Sandbox Code Playgroud)
最近我收到此错误:
g++ -o Test-debug -stdlib=libstdc++ -framework Cocoa -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -m64 @/Users/vresko/projects/linenoise/test/cpp/obj/darwin64-debug/all_objs
Undefined symbols for architecture x86_64:
"_linenoiseClearScreen", referenced from:
Test_obj::main() in ab184b9a_Test.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
我知道这个错误有几个提及,但我不知道如何在haxe hxcpp的上下文中解决这个问题.
如果我使用包含hxcpp.h的C++包装器作为典型的linc示例,那么错误仍然是相同的,我在这里声明的函数(linenoiseClearScreen)实际上是一个简单的print语句.
我还读到了其他可能性,例如CFFI为neko创建了一个围绕库的包装器(我可能已经在互联网上阅读了所有关于它的内容)但是我希望尽可能保持代码静态链接并与所有hxcpp目标兼容.
我需要一个函数来返回CPP目标上的本地时间(以毫秒为单位).
我尝试过Haxe的Date课程,但Date.now()在几秒钟内就给了我时间.
如何使用完全剥离的cpp目标编译Haxe代码,没有调试插件等?
除了能够使用什么-D dce=full和--no-traces编译最快和/或最小的可执行文件?
我正在为移动广告SDK创建一个OpenFL扩展程序,但很难弄清一些CFFI内容。
基本上,我试图将Haxe对象传递给C ++,然后从C ++对该对象调用一个方法。这样做的目的是作为事件侦听器,因此当C ++中发生某些事情时,我将在该对象上调用回调以通知Haxe代码。
我知道如何使用lime的用于Android的JNI东西使用Java来做到这一点。使用JNI类型签名看起来像这样:
var setCallbackListener = JNI.createStaticMethod("com.test.myextension", "setCallbackListener", "(Lorg/haxe/lime/HaxeObject;)V");
var listener = new MyCallbackListener(); //implements `onSomething`
setCallbackListener(listener); //pass the listener to the Java side
Run Code Online (Sandbox Code Playgroud)
然后,从Java方面,我可以这样调用函数onSomething:
public static void setCallbackListener(HaxeObject listener){
listener.call0("onSomething"); //call a function called "onSomething" with zero arguments
}
Run Code Online (Sandbox Code Playgroud)
那行得通,这就是我在Android上的做法。对于iOS,我尝试使用hxcpp做相同的事情。
我知道从Haxe调用C ++函数的一般过程,其使用cpp.Lib.load方式与上述JNI api类似。但是,一旦获得valueC ++方面的类型,我就不知道如何调用它的成员函数。
例如,假设我的C ++函数如下所示:
#include <hx/CFFI.h>
static void setCallbackListener (value listener) {
//...
}
DEFINE_PRIM (setCallbackListener, 1);
Run Code Online (Sandbox Code Playgroud)
然后,我将如何在其中调用函数“ onSomething” listener?
我有简单的Haxe应用程序
class Main
{
public static function main()
{
trace("hello world");
}
}
Run Code Online (Sandbox Code Playgroud)
我知道如何编译这样的应用程序的Windows(不是作为SWF,但作为纯C\C++的应用程序)(你可以看到这里如何,但担心使用hxcpp\0,4)问题是 - 我不想编译适用于Windows Vista或7或XP的应用程序我想获得PURE C\C++代码(在一个地方作为一个项目更好),例如在Windows Mobile上编译代码或我想要的地方.
那么有没有算法将简单的Haxe代码转换为C/C++代码文件?