Java - 来自另一个类的方法,即使它是从该类的实例调用的,也不会被调用

  • 本文关键字:调用 实例 另一个 方法 Java java
  • 更新时间 :
  • 英文 :


我真的迷失在这里。我有两个课程涉及这个问题。第一类是Application类,第二类是GameManager类。GameManager类上有一个名为instantiate()的方法,我想从Application类调用它。

因此,我在Application类中创建了GameManager类的实例。我从那个实例调用了instantiate()方法,但没有任何反应。

它应该将"Instantiating GameObject"输出到控制台,但它没有发生。甚至一次都没有。更令人困惑的是GameManager类中的renderGame()方法确实被调用(出于测试目的,我让它输出GameManager持有的gameobjects量)。

以下是两个类:

应用类:

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferStrategy;
public class Application implements Runnable {
public static boolean isRunning;
GameManager manager = new GameManager();//CREATE AN INSTANCE OF THE GAME MANAGER
JFrame frame;
BufferStrategy buffer;
Graphics drawer;
Thread appThread;
public Application (JFrame frame, BufferStrategy buffer, Graphics drawer) {
this.frame = frame;
this.frame.setBackground(Color.WHITE);
this.buffer = buffer;
this.drawer = drawer;
}
public synchronized void startLoop () {
appThread = new Thread (this);
appThread.start();
isRunning = true;
GameLoop ();
}
public synchronized void endLoop () {
isRunning = false;
try {
appThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
void GameLoop() {
int targetFps = 60;
double timePerTick = 1000000000 / targetFps;
double delta = 0;
long now;
long lastTime = System.nanoTime();
while(isRunning) {//THIS IS A LOOP THAT REPEATEDLY CALLS UPDATE AND RENDER METHODS
now = System.nanoTime();
delta += (now - lastTime) / timePerTick;
lastTime = now;
if(delta >= 1) {
masterUpdate();
masterRender();
delta--;
}
}
System.out.println("STOPPED");
}
void masterUpdate () {
manager.updateGame();
}
void masterRender () {
manager.renderGame(drawer);//THIS IS WHERE THE RENDER METHOD IS CALLED
buffer.show();
drawer.dispose();
}
@Override
public void run() {
startLoop();
manager.instantiate();
}
}

游戏管理器类:

import java.awt.Graphics;
public class GameManager {
public static int currentGameObjectAmount = 0;
public static int maxGameObjects = 100;
Player[] sceneObjects = new Player[maxGameObjects];
public void instantiate () {
System.out.println("Instantiating GameObject");
sceneObjects[currentGameObjectAmount] = new Player(100, 100, 100);
currentGameObjectAmount++;
}
public void updateGame () {
}
public void renderGame (Graphics drawer) {
System.out.println(currentGameObjectAmount);
for(int i = 0; i != maxGameObjects; i++) {
sceneObjects[i].render(drawer);
}
}
}

控制台输出0何时应该输出1因为我调用了instantiate()方法,该方法递增控制台正在推送的整数变量。运行它时会发生什么

PS:对不起,如果我的代码让你头疼,我不是真正的高级程序员。

基本问题就在这里...

@Override
public void run() {
startLoop();
manager.instantiate();
}

当您调用startLoop时,这会阻止当前Thread,直到isRunningfalse

我建议将manager.instantiate()移到startLoop()以上.我也可以考虑使用某种startend的方法,可以用来告诉经理Thread已经开始或停止,但这只是我;)

最新更新