您可以尝试研究类似于策略模式的内容。
基本上,首先单击工具栏上的“房间”按钮。工具栏通过并告诉网格使用“room place”actionListener。可能删除了以前正在侦听的任何操作侦听器
RoomPlaceActionListener将依次实现左/右键单击、拖动等所有有趣的逻辑位。
如果你有多个阶段来建造一个房间(比如,先装门,然后装窗,然后装门);动作监听器将负责把控制权交给下一个阶段:一个有限状态机。
因此,首先单击“房间”按钮,添加“放置房间”侦听器。拖出你想要房间的区域,“PlaceRoom”修改游戏状态,然后将ActionListener更改为“PlaceWindows”侦听器。无限大…直到你完成。
一个非常简单(不可编译)的示例:
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
现在,撇开不可编译的例子不谈,火爆的确实有一点:你通常不想把你的游戏模型和图形界面组合成一个单一的类。您希望模型与GUI分离,并通过一个定义良好的接口来操作它。
(另外,可能还有更好的方法来删除鼠标监听器,然后随机删除所有监听器…我有点着急,对不起)