如何在不退出Java代码的情况下退出2D游戏模拟(仅限)?
我(Java新手)正在从事一个已有数十年历史的Java项目,该项目使用Golden T Studio游戏开发jdk构建。我在项目中有一个运行2D模拟的游戏。简而言之,代码结构如下:如何在不退出Java代码的情况下退出2D游戏模拟(仅限)?,java,game-development,Java,Game Development,我(Java新手)正在从事一个已有数十年历史的Java项目,该项目使用Golden T Studio游戏开发jdk构建。我在项目中有一个运行2D模拟的游戏。简而言之,代码结构如下: package game; import java.io.*; import java.lang.reflect.Field; import javax.swing.JFrame; import com.golden.gamedev.GameLoader; import com.google.gson.Gson;
package game;
import java.io.*;
import java.lang.reflect.Field;
import javax.swing.JFrame;
import com.golden.gamedev.GameLoader;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import sometcpimports.*;
public class MainGAME extends JFrame implements Runnable {
public static void main(String[] args) { //call new MainGAME;
}
public MainGAME() {//initiate game parameters;
//start new THREAD;
}
@Override
public void run() { //initiate new game and environment;
game = new GameLoader();
gameenv = new GameEnvironment(params); //This class is in another file "public class GameEnvironment extends Game {}"
//I don't clearly undertsand what the following lines do, so I'm mentioning them as is;
game.setup(gameenv, dimensions);
this.setVisible(false);
gameenv.setVisible(false);
game.start();
game.setVisible(true);
//tbd (code reaches this step)
}
}
我的目标是多次运行上述模拟(每次使用不同的输入),并在每次运行后在新的主类中提取信息,如下所示
public class gamedriver {
public static void main(String[] args) {
MainGAME.params = some params;
MainGAME.main(); // runs the simulation;
//tbd1 (code doesn't reach this step)
}
}
问题是,在从不同的文件(新的主类)运行模拟时,我无法在一次运行后退出2D模拟器。代码在新的主类中没有到达//tbd1
,该主类有一些输出打印语句。本质上,我只想退出模拟器,而不是整个JVM。到目前为止,我已经尝试:
game.stop()
和gameenv.finish()
在//tbd
上,它什么也不做System.exit(0)
at//tbd
,它在模拟后退出游戏,但也退出jvm,不会到达其他主类finish()
位于//tbd
和GameEnvironment类,其行为与第2点完全相同Game.Exception错误
。我知道这与线程有关,但我不确定如何运行它们
谢谢你抽出时间。谢谢你的帮助 我找到了解决上述问题的方法。我将我的解决方法作为遇到类似问题的人的参考。请注意,可能还有其他(更好的)解决方案
System.out.println()
,以便在模拟结束时打印所有输出这可能是一种草率的解决问题的方法,但对我来说很有效,尤其是因为GTGE提供的其他方法都不起作用。你确定你需要你所说的吗?你只想在你的MainGame类运行后打印一些东西,对吗?如果是这样,你就严重地过度思考了这个问题。为什么你认为你需要第二个类来运行第一个类,以便在屏幕上转储一些信息?嗨,MarsAtomic,谢谢你的阅读。抱歉,实际问题是在游戏顶部运行优化代码。这只是一个测试,检查我是否从游戏中得到了想要的变量。完成后,我只需将优化代码导入gamedriver并运行它(迭代游戏)。。。这里有三个选项:1)在调试器中运行代码,在设置了要查看的值后设置断点,并使用调试器检查变量;2) 学习使用JUnit并编写一个测试,其中包含一些测试相关变量的断言;或者3)在设置变量后删除一些简单的System.out.println()语句,并将变量打印到控制台。因为你专注于一种特殊的方法,所以你真的让这件事变得比需要的难多了。这个问题与驱动程序或线程无关。谢谢!我要试试这些。
public class gamedriver {
public static void main(String[] args) {
try {
String separator = System.getProperty("file.separator");
String classpath = System.getProperty("java.class.path");
String path = System.getProperty("java.home") + separator + "bin" + separator + "java";
String[] command = new String[]{path, "-cp", classpath, gamedriver.GAME.class.getName(), "output.csv"};
Process process = Runtime.getRuntime().exec(command);
process.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
static class GAME {
public static void main(String args[]) {
PrintStream out = null;
try {
out = new PrintStream(args[1]);
} catch (FileNotFoundException p) {
p.printStackTrace();
}
System.setOut(out);// this catches all output from the game to a csv file (output.csv)
MainGAME temp = new MainGame(some params); // initiate the simulation
temp.run()
out.close();
System.exit(0); // force close the simulator
}
}
}