如何区分处理草图运行的模式(Java/JS/Android)?
我编写了一个多平台逻辑游戏,它必须在所有模式下工作:Java、JS和Android。我需要在所有模式下做一些不同的事情(特别是但不限于存储,对于Java/Android,我想使用load/saveTable,对于JS-localStorage) 为此,我需要获取信息,即草图运行的模式。我需要在运行时这样做,只是为了避免为所有平台保留不同的源代码 我在看文档,但在主题中什么也没找到。我的谷歌研究也让我想到,甚至没有人要求 我曾考虑使用try/catch检查Java中存在但JS中不存在的一些函数,但这似乎是不合法的,而且我找不到合适的方法 我发现:如何区分处理草图运行的模式(Java/JS/Android)?,java,javascript,android,processing,mode,Java,Javascript,Android,Processing,Mode,我编写了一个多平台逻辑游戏,它必须在所有模式下工作:Java、JS和Android。我需要在所有模式下做一些不同的事情(特别是但不限于存储,对于Java/Android,我想使用load/saveTable,对于JS-localStorage) 为此,我需要获取信息,即草图运行的模式。我需要在运行时这样做,只是为了避免为所有平台保留不同的源代码 我在看文档,但在主题中什么也没找到。我的谷歌研究也让我想到,甚至没有人要求 我曾考虑使用try/catch检查Java中存在但JS中不存在的一些函数,但
try {
PApplet a;
a = new PApplet();
mode = "JAVA";
}
catch(Throwable e) {
mode = "JS";
}
这区分了Java和JavaScript,但无法识别Android
总而言之,区分我是在JS模式下运行草图还是在运行时在Java模式下运行草图的最佳方法是什么?好的,我找到了使用try/catch的非常好的方法:
String mode;
mode = "unknown";
try {
java.lang.Object a;
a = new java.lang.Object();
mode = "JAVA";
}
catch(Throwable e) {
mode = "JS";
}
这将JavaScript与Java/Android区分开来,但无法将Android与Java区分开来。但是,由于差异是最小的,这不会对我的兼容性造成重大问题
如果有人知道如何做得更好,请张贴你的答案 我想出了如何检测Java与Android模式的区别。有点像黑客:
import java.lang.reflect.*;
Method getInternalProcessingMethod(String methodName) {
/*
* Helper method that can be used to return
* an internal processing method by name
*/
Class cls = this.getClass();
try {
return cls.getMethod(methodName);
} catch (Exception e) {
return null;
}
}
boolean isAndroidMode() {
/*
* Determine if we're running in Android mode or not
*/
// What?
// In Android mode 'displayDensity' is a field and in Java
// mode 'displayDensity' is a method. This is a hack...but
// it works.
if (getInternalProcessingMethod("displayDensity") == null) {
return true;
}
return false;
}
然后你可以用它做一些事情,比如我用它做什么:
void settings() {
IS_ANDROID_MODE = isAndroidMode();
if (IS_ANDROID_MODE) {
println("Android mode detected");
fullScreen();
SAVE_LOCATION = "blah.json";
} else {
println("Java mode detected");
size(600, 1233);
SAVE_LOCATION = "data/blah.json";
}
}
现在,我可以在桌面上的一个小窗口中运行我的测试应用程序,然后在Android上以不同的保存文件路径全屏运行。Java是编译语言,JavaScript是解释语言。这意味着,尽管您只需按下播放按钮,但在Java模式下,您的源代码将被编译为Java字节码,剩下的是一个已编译的二进制程序,您“无法”进一步更改,在JavaScript中,源代码被转换为JavaScript源代码,剩下的只是文件中转换后的可读源代码。因此,决定是在编译时做出的,您将始终需要处理IDE来重新编译所有内容。谢谢您的评论。我知道,源代码将分别编译为Android应用程序、Java可执行文件和JS。但是我只想写代码,所有平台都有相同的源代码,因此我只需要编译它们,而不需要对每个平台做进一步的更改。我猜你也可以做类似的事情,尝试实例化一个Android特定的类。