Existe uma maneira padrão para lidar com muitas opções diferentes para eventos de mouse em java?

StackOverflow https://stackoverflow.com/questions/1241633

  •  12-09-2019
  •  | 
  •  

Pergunta

Estou desenvolvendo um jogo baseado sim grade em java, e eu queria saber se existe uma maneira padrão de fazer o seguinte. Eu tenho um painel que é o painel de jogo, e há muitas coisas diferentes que podem acontecer quando o painel é clicado. Por exemplo, quando a construção de uma sala, há várias etapas, onde arrastando o mouse e clique esquerdo vai ter ações diferentes. Agora, do jeito que eu ter feito isso, é usar booleans para verificar o que está sendo construído, e depois que estágio se encontra.

Existe alguma melhor ou padrão maneira de lidar com algo assim? Eu tive um google rápido, mas como eu disse antes, as pessoas na Stack Overflow sempre dar uma melhor, mais relevante, até resposta data.

Eu me considero ainda bastante novo para java.

Agradecemos antecipadamente.

Foi útil?

Solução

Você pode tentar olhar em algo semelhante ao padrão de estratégia.

Basicamente, você começa clicando no botão espaço em sua barra de ferramentas. A barra de ferramentas passa e diz a grade para usar o ActionListener 'quarto lugar'. Presumivelmente, a remoção de qualquer ouvinte de ação anterior que estava ouvindo

O ActionListener quarto lugar, por sua vez implementar toda a parte interessante da lógica para clicar a esquerda / direita, arrastando, etc.

Se você tem várias etapas para a construção de uma sala (digamos, colocando portas, em seguida, Windows, alçapões); os ouvintes de ação seria responsável pelo controle de entrega off para a próxima fase: um pouco de uma máquina de estados finitos.

Então, comece por botão clicando 'quarto', é adicionado 'quarto lugar' ouvinte. Arrastar para fora da área que você quer o quarto a ser, 'quarto lugar' modifica o estado do jogo, em seguida, muda o ActionListener ao ouvinte 'janelas lugar'. ad infinitum ... até terminar.

Um muito simples (não compilable) exemplo:

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

Agora, esse exemplo não compilável lado, Pyrolistical tem um ponto: você geralmente não quer combinar o seu modelo de jogo e interface gráfica em um único glob de classes. Você quer que o modelo separado do GUI, e manipulá-lo através de uma interface bem definida.

(Além disso, há, provavelmente, melhores métodos para ir sobre como remover o ouvinte do mouse em seguida, basta remover aleatoriamente todos os ouvintes ... Eu estava em um pouco de pressa, sorry)

Outras dicas

Parece que você precisa definir o seu modelo de jogo / estado e mantê-lo separado de suas ações do mouse.

Você está usando MVC?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top