1

我正在为我的班级编写一个基于文本的小型游戏。导航很简单,玩家可以点击按钮进入不同的部分。所有这些部分都被分成它们自己的代码块。到目前为止,我只设置了两个部分,每个部分都可以通过按钮相互访问。基本上:

private void level1() {
//Stuff here, player clicks a button which runs "level2();"
}

private void level2() {
//Stuff here, player clicks a button which runs "level1();"
}

这样就可以了,但是在 1 和 2 之间来回单击后,程序开始运行非常缓慢。任务管理器报告大约 700MB 的内存使用情况。

我敢肯定,我遗漏了一些非常明显的东西。我正在寻找一种方法,让用户能够多次单击许多按钮,而不是让程序使用这么多资源。帮助将不胜感激。

编辑:更多代码。Choice1-3 是按钮的名称。变量已经在程序顶部声明,并在初始化部分设置。它们将使用每个代码块进行修改,例如 Scene1 和 2。

private void setScene1() // TITLE SCREEN
{
    TITLE.setText("Title Label");
    main.setText("Main text body for the game.");
    choice1.setText("Play");
    choice1.setBounds(10, 600, 996, 91); // This makes choice1 as large as
                                            // all three buttons combined.
    choice2.setEnabled(false);// There's only one option anyway.
    choice3.setEnabled(false);
    choice2.setVisible(false);
    choice3.setVisible(false);

    choice1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            setScene2();
        }
    });

}

private void setScene2() // CHARACTER GENERATION SCENE
{
    TITLE.setText("Character Generation");
    main.setEnabled(false); // Disable & Hide the main text window, as
                            // Chargen requires a nicer looking interface.
    main.setVisible(false);
    choice2.setEnabled(true);
    choice2.setVisible(true);
    choice1.setBounds(10, 600, 996, 34); //Resizing the bottom portion to fit two buttons
    choice2.setBounds(10, 645, 996, 34);
    choice1.setText("Continue");
    choice1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            // Nothing here for now
        }
    });
    choice2.setText("Back to the Title Screen");
    choice2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            main.setEnabled(true);
            main.setVisible(true);
            setScene1();
        }
    });

}
4

3 回答 3

2

如果这两种方法继续相互调用,你最终会吃掉你的记忆:这就是递归。如果你从不返回调用树,它只会变得任意深,直到繁荣。

于 2013-01-11T21:51:33.630 回答
2

问题似乎在于您每次切换场景时都添加了一个 ActionListener 。以前的 ActionListener 永远不会消失,但你在它上面堆叠了更多的东西来做同样的事情。每一个都执行相同的动作,所以当你按下切换场景时,它现在拥有的所有ActionListners也会去切换场景。你的 CPU 会上升,因为现在有 2^n 个 ActionListeners 等待输入,而且内存中有很多。

于 2013-01-11T22:09:20.233 回答
1

您应该在构造函数或其他地方添加 ActionListeners。这样,您每次按下按钮时都会添加一个新的 ActionListener(即使它相同)。

于 2013-01-11T22:09:06.850 回答