0

我正在用 java 开发一个基于网格的 sim 游戏,我想知道是否有执行以下操作的标准方法。我有一个面板,它是游戏面板,单击面板时可能会发生许多不同的事情。例如,在建造房间时,有几个阶段,其中拖动鼠标和左击会有不同的动作。现在,我这样做的方式是使用布尔值来检查正在构建的内容,然后检查它处于什么阶段。

有没有更好或标准的方法来处理这样的事情?我有一个快速的谷歌,但正如我之前所说,Stack Overflow 上的人们总是给出更好、更相关、最新的答案。

我认为自己对 java 还是很陌生。

提前致谢。

4

2 回答 2

3

您可以尝试研究类似于策略模式的东西。

基本上,您首先单击工具栏上的房间按钮。工具栏通过并告诉网格使用“房间位置”动作侦听器。大概删除任何先前正在监听的动作监听器

房间位置动作监听器将依次实现左/右键单击、拖动等所有有趣的逻辑。

如果您有多个阶段来建造房间(例如,放置门,然后是窗户,然后是活板门);动作监听器将负责将控制权交给下一个阶段:一个有限状态机。

因此,首先单击“房间”按钮,添加“放置房间”侦听器。拖出您希望房间成为的区域,“放置房间”修改游戏状态,然后将动作监听器更改为“放置窗户”监听器。无限……直到你完成。

一个非常简单(不可编译)的例子:

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 分离,并通过定义明确的界面对其进行操作。

(此外,可能有更好的方法来删除鼠标监听器,然后随机删除所有监听器......我有点着急,抱歉)

于 2009-08-06T21:43:20.140 回答
0

听起来您需要定义游戏模型/状态并将其与鼠标操作分开。

你在使用 MVC 吗?

于 2009-08-06T21:42:56.303 回答