我在暂停和恢复游戏时遇到困难。我遇到了错误 IllegalThreadStateException,但有趣的是,这段代码在 API 24 上运行良好并且没有问题。在更高的 API 上进行测试是我遇到麻烦的地方。我错过了什么吗?有小费吗?我还是个初学者,谢谢大家!
public class GameLoop extends Thread {
private final SurfaceHolder surfaceHolder;
private Game game;
public static final float MAX_UPS = 60;
private static final double UPS_PERIOD = 1E+3 / MAX_UPS;
public static boolean isRunning = false;
private double avarageUPS;
private double avarageFPS;
public GameLoop(Game game, SurfaceHolder surfaceHolder) {
this.game = game;
this.surfaceHolder = surfaceHolder;
}
public void startLoop() {
Log.d("GameLoop.java", "startLoop()");
isRunning = true;
start();
}
public void stopLoop() {
Log.d("GameLoop.java", "stopLoop()");
isRunning = false;
// Wait for thread to join
try {
join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void run() {
Log.d("GameLoop.java", "run()");
super.run();
//Declare time and cycle count variables
int updateCount = 0;
int frameCount = 0;
long startTime;
long elapsedTime;
long sleepTime;
//Game loop
Canvas canvas = null;
startTime = System.currentTimeMillis();
while(isRunning){
//Poskusi posodobiti in render game
try{
canvas = surfaceHolder.lockCanvas();
synchronized (surfaceHolder){
game.update();
updateCount++;
game.draw(canvas);
}
}catch(IllegalArgumentException e){
e.printStackTrace();
}finally {
if(canvas != null){
try{
surfaceHolder.unlockCanvasAndPost(canvas);
frameCount++;
}catch(Exception e) {
e.printStackTrace();
}
}
}
//Pause game loop to not exceed target UPS
elapsedTime = System.currentTimeMillis() - startTime;
sleepTime = (long) (updateCount * UPS_PERIOD - elapsedTime);
if(sleepTime > 0){
try {
sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//Skip frames to keep up with target UPS
while(sleepTime < 0 && updateCount < MAX_UPS-1){
game.update();
updateCount++;
elapsedTime = System.currentTimeMillis() - startTime;
sleepTime = (long) (updateCount * UPS_PERIOD - elapsedTime);
}
//Calculate avarage UPS in FPS
elapsedTime = System.currentTimeMillis() - startTime;
if(elapsedTime >= 1000){
avarageUPS = updateCount / (1E-3 * elapsedTime);
avarageFPS = frameCount / (1E-3 * elapsedTime);
updateCount = 0;
frameCount = 0;
startTime = System.currentTimeMillis();
}
}
}
public double getAvarageUPS() {
return avarageUPS;
}
public double getAvarageFPS() {
return avarageFPS;
}
}
最佳答案
如果您尝试在同一线程上再次调用启动,则不能。线程完成后,您需要创建一个新实例,同一实例无法重新运行。
关于java - 暂停和恢复 Android 游戏 ->,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61416008/