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

Java—来自另一个类的方法,即使它是从该类的实例调用的,也不会被调用,java,Java,我在这里真的迷路了。我有两门课涉及这个问题。第一个类是应用程序类,第二个类是游戏管理器类。GameManager类有一个名为instantiate()的方法,我想从应用程序中调用该方法 因此,我在应用程序类中创建了游戏管理器类的一个实例。我从该实例调用了instantiate()方法,但什么也没发生 它本应将“实例化游戏对象”输出到控制台,但没有发生。一次也没有。更让人困惑的是GameManager类中的renderGame()方法是否被调用(为了测试,我让它输出GameManager持有的ga

我在这里真的迷路了。我有两门课涉及这个问题。第一个类是
应用程序
类,第二个类是
游戏管理器
类。
GameManager
类有一个名为
instantiate()
的方法,我想从
应用程序中调用该方法

因此,我在
应用程序
类中创建了
游戏管理器
类的一个实例。我从该实例调用了
instantiate()
方法,但什么也没发生

它本应将
“实例化游戏对象”
输出到控制台,但没有发生。一次也没有。更让人困惑的是
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();
    }
}
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()
方法,该方法增加了控制台推出的整数变量


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

基本问题在这里

@Override
public void run() {
    startLoop();
    manager.instantiate();
}
当您调用
startOOP
时,将阻止当前
线程
,直到
isRunning
false


我建议将
manager.instantiate()
移到
startoop()
上方。我也可以考虑使用<代码>开始<代码>和<代码>结束>代码>某种方法,而不是用来告诉管理员<代码>线程< /代码>已经启动或停止,但这只是我;p> 这只是整体设计中的许多问题之一。。。这需要做大量的工作来解决。@JimGarrison好吧,这就是解决眼前问题的方法。谢谢你的回答,@MadProgrammer!实例化方法现在被调用。我有一个NullPointerException,但我会自己解决的。另外@Jim Garrison,你能给我一些关于我应该做些什么来改进这个的想法吗?@HansRamos很高兴它有帮助-就个人而言,我并不热衷于你的
缓冲策略
管理-也许可以看看哪个是通用示例,哪个有可运行的示例