我正在用java开发基于网格的sim游戏,我想知道是否有一种标准的方法来执行以下操作。 我有一个面板,它是游戏面板,单击面板时可能会发生许多不同的事情。例如,在构建房间时,有几个阶段,拖动鼠标和左键单击将有不同的操作。 现在,我这样做的方法是使用布尔值来检查正在构建的内容,然后检查它处于什么阶段。
有没有更好或更标准的方法来处理这样的事情?我有一个快速谷歌,但正如我之前所说,Stack Overflow上的人总是提供更好,更相关,最新的答案。
我认为自己仍然是java的新手。
提前致谢。
答案 0 :(得分:3)
您可能会尝试寻找类似于策略模式的内容。
基本上,您首先点击工具栏上的房间按钮。工具栏通过并告诉网格使用'room place'actionlistener。可能是删除了正在侦听的任何先前的动作侦听器
房间位置actionlistener将依次实现左/右点击,拖动等所有有趣的逻辑。
如果你有多个阶段来建造一个房间(比如,放置门,然后是窗户,然后是门);动作监听器将负责将控制权交给下一阶段:一个有限的状态机。
因此,首先点击“房间”按钮,添加“放置房间”监听器。拖出你想要房间的区域,'放置房间'修改游戏状态,然后将actionlistener更改为'place windows'监听器。无限无疑......直到你完成。
一个非常简单(不可编译)的例子:
class GridPanel extends JPanel
{
void SetMouseListener(MouseListener newListener)
{
for(MouseListener ml : getMouseListeners())
removeMouseListener(ml);
addMouseListener(newListener);
}
}
class ControlPanel extends JPanel
{
GridPanel gameGrid;
void OnRectangleButtonClicked(some stuff)
{
gameGrid.SetMouseListener(new PlaceRoomListener(gameGrid));
}
}
class PlaceRoomListener extends MouseAdapter
{
GridPanel gameGrid;
//constructor, etc
void OnClick(mouse event)
{
gameGrid.doCoolStuff();
gameGrid.SetMouseListener(new PlaceTrapDoorListener());
}
}
//etc
现在,除了不可编辑的例子,Pyrolistical确实有一点:你通常不希望将你的游戏模型和图形界面组合成一个单一的类。您希望模型与GUI分离,并通过定义良好的界面对其进行操作。
(另外,有可能更好的方法来删除鼠标监听器,然后随机删除所有听众......我有点匆忙,抱歉)
答案 1 :(得分:0)
听起来您需要定义游戏模型/状态,并将其与鼠标操作分开。
您使用的是MVC吗?