gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:18:21 25 4
gpt4 key购买 nike

我真的迷路了。我有两个类(class)涉及这个问题。第一个类是 Application 类,第二个是 GameManager 类。 GameManager 类有一个名为 instantiate() 的方法,我想从 Application 类调用它。

所以我在 Application 类中创建了一个 GameManager 类的实例。我从 THAT VERY INSTANCE 调用了 instantiate() 方法,但没有任何反应。

它应该输出 "Instantiating GameObject" 到控制台,但它没有发生。一次也没有。更令人困惑的是 GameManagerDOES 中的 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();
}
}

GameManager 类:

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);
}
}
}

控制台在应该输出 1 时输出 0,因为我调用了 instantiate() 方法,该方法增加了控制台输出的整数变量正在推出。 What happens when I run it

PS:如果我的代码让你头疼,我很抱歉,我不是一个真正的高级程序员。

最佳答案

基本问题就在这里...

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

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

我建议将 manager.instantiate() 移动到 startLoop() 之上。我也可能会考虑使用某种 startend 方法来代替,它可以用来告诉管理器 Thread 已经启动或停止,但那只是我 ;)

关于Java - 来自另一个类的方法不会被调用,即使它是从该类的实例调用的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49332755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com