0

我目前正在制作地形生成器,在一个类中一切正常,但我将扩展我的应用程序。

目前我有一个 JFrame 类,它包含所有内容、生成地形、绘制地形、查找位置等。

我想添加另一个将生成地形的类,但是当我创建这个类时,我需要访问主 JFrame 类中的字段,当我这样做时,我得到一个堆栈溢出错误 - 这是我的代码。

public class Simulator extends Applet
{
//fields

public Simulator()
{
    grid = new int[100][100];
    inhabGrid = new boolean[grid.length][grid.length];
    gridSize = grid.length - 1;
    dist = grid.length;
            TerrainGenerator gen = new TerrainGenerator();
    setSize(dist,dist);
    seedGrid();
    findInhabLocation();
    printGridToConsole();
}

public void paint(Graphics g)   
{
    //panting the grid
}

public void seedGrid()
{
    //seeding

}

public boolean generateTerrain(int x1,int y1, int x2, int y2) 
{

    //terrain generator
}

public boolean mouseUp(Event evt, int x, int y)
{
    seedGrid(); //Create a new map
    findInhabLocation();
    repaint();
    printGridToConsole();
    return true;
}

public boolean keyEvents(Event evt, int x, int y)
{
    seedGrid(); //Create a new map
    findInhabLocation();
    repaint();
    printGridToConsole();
    return true;
}

public void findInhabLocation()
{
    //find best inhabitant location
}

public int locateWater(int x, int y)
{

    //finding closest water
}

public int locateJungle(int x, int y)
{
    //finding closest jungle
}


}
}

这在它自己的类中工作正常,但是当我创建一个类时,例如:

public class TerrainGenerator 
{
Simulator sim = new Simulator();
}

我知道这与构造函数有关,而且我正在做一些愚蠢的事情,将这个应用程序分成类的最佳方法是什么,例如地形生成器、居民等

例如,我希望能够从“TerrainGenerator”类中调用一个方法并调用即 terrainGenerator.generateTerrain

4

3 回答 3

1

TerrainGenerator创建了一个Simulator对象,反之亦然,因此您最终会得到无限多的对象(但有时堆栈已满,而是抛出堆栈溢出异常......)

与其Simulator在您TerrainGeneratorSimulator.

于 2013-04-09T14:35:49.627 回答
0

Heuster 的回答是正确的,此外,我认为您可以查看 MVC来帮助您组织课程。

于 2013-04-09T14:40:11.930 回答
0

根据哪个应该是父级,您可以将实例化的类传递给另一个,即;

private final TerrainGenerator gen;  //if you need to save this.
public Simulator(TerrainGenerator terrainGenerator)
{

  this.gen = terrainGenerator;
 ....etc
}


public class TerrainGenerator 
{
Simulator sim = new Simulator(this);
}

或者

private final TerrainGenerator gen;  //if you need to save this.
public Simulator()
{

  this.gen = new TerrainGenerator(this);
 ....etc
}

private final Simulator sim; //If you need to save it.
public class TerrainGenerator 
{
  public TerrainGenerator(Simulator simulator) {
    this.sim = simulator;
  }
}
于 2013-04-09T14:48:50.540 回答