我正在尝试使用GridWorld(来自AP计算机科学课程)制作游戏,并且我在使用多个网格时遇到问题。World的setGrid方法似乎不起作用。在我的印象中,您可以让多个网格对象共存,并且World所指向的当前对象是在GUI中绘制的对象。但事实并非如此……当我调用World的setGrid并传递给它一个网格时,网格似乎只是在逻辑上被设置,并且System.out.printing它给出了它的演员和他们当前位置的正确结果,但是GUI不更新,您实际上无法看到网格。
我写了一个简单的ActorWorld来说明这一点:
public static void main(String[] args) throws Exception
{
ActorWorld x = new ActorWorld()
{
Grid<Actor> gr1 = new BoundedGrid<Actor>(10,10);
Grid<Actor> gr2 = new BoundedGrid<Actor>(10,10);
public void step()
{
new Actor().putSelfInGrid(gr1, new Location(1,1));
new Actor().putSelfInGrid(gr2, new Location(9,9));
if (getGrid() == gr2)
setGrid(gr1);
else
setGrid(gr2);
System.out.println(getGrid());
}
};
x.show();
}
每一步它应该改变到另一个网格并显示它,所以基本上应该发生的是网格中的一个Actor将位置从(1,1)改变到(9,9)。但实际上,它只是显示一个空网格(因为它使用的是它在默认构造函数中创建的原始网格,因为我没有提供一个)。这是怎么呢我如何让它绘制当前的网格?
好了,我找到问题了。在给gridworld的创建者发邮件后,他透露这是一个bug。
我找到源代码并添加了
行display.setGrid(world.getGrid());
到WorldFrame的repaint()方法的开头。问题是,WorldFrame本身更新了它当前的网格,所以逻辑上它是在正确的网格上,但是WorldFrame的GridPanel对象display,它实际上是绘制网格的JPanel,在重绘之前没有被告知更新它的网格。这样,完整的方法是
public void repaint()
{
display.setGrid(world.getGrid());
String message = getWorld().getMessage();
if (message == null)
message = resources.getString("message.default");
messageArea.setText(message);
messageArea.repaint();
display.repaint(); // for applet
super.repaint();
}
,一切都好。:)