您可以尝试研究类似于策略模式的东西。
基本上,您首先单击工具栏上的房间按钮。工具栏通过并告诉网格使用“房间位置”动作侦听器。大概删除任何先前正在监听的动作监听器
房间位置动作监听器将依次实现左/右键单击、拖动等所有有趣的逻辑。
如果您有多个阶段来建造房间(例如,放置门,然后是窗户,然后是活板门);动作监听器将负责将控制权交给下一个阶段:一个有限状态机。
因此,首先单击“房间”按钮,添加“放置房间”侦听器。拖出您希望房间成为的区域,“放置房间”修改游戏状态,然后将动作监听器更改为“放置窗户”监听器。无限……直到你完成。
一个非常简单(不可编译)的例子:
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 分离,并通过定义明确的界面对其进行操作。
(此外,可能有更好的方法来删除鼠标监听器,然后随机删除所有监听器......我有点着急,抱歉)