C'è un modo standard per gestire diverse opzioni per gli eventi del mouse in Java?
-
12-09-2019 - |
Domanda
Sto sviluppando un gioco basato sim griglia in Java, e mi chiedevo se esiste un modo standard di fare quanto segue. Ho un pannello che è il pannello di gioco, e ci sono molte cose diverse, che potrebbero accadere quando il pannello viene cliccato. Ad esempio, quando la costruzione di una stanza, ci sono diverse fasi, in cui si trascina il mouse e cliccando sinistra avrà diverse azioni. In questo momento, il modo in cui l'ho fatto, è quello di utilizzare booleani per verificare ciò che è in fase di costruzione, e quindi a che punto è a.
C'è un modo di gestire qualcosa come questo meglio o standard? Ho avuto una rapida di Google, ma come ho detto prima, la gente su Stack Overflow dare sempre un migliore, più rilevante, fino ad oggi risposta.
Mi considero ancora piuttosto nuovo a Java.
Grazie in anticipo.
Soluzione
Si potrebbe provare a guardare in qualcosa di simile al modello di strategia.
In sostanza, si inizia facendo clic sul pulsante stanza sulla barra degli strumenti. La barra degli strumenti attraversa e racconta la griglia di utilizzare l'ActionListener 'posto stanza'. Presumibilmente la rimozione di qualsiasi precedente ascoltatore azione che stava ascoltando
Il luogo stanza ActionListener avrebbe a sua volta implementare tutte la cosa interessante della logica per clic sinistro / destro, trascinamento, ecc
Se si dispone di più fasi per la costruzione di un ambiente (per esempio, mettendo porte, Windows, poi porte trappola); gli ascoltatori azione sarebbe responsabile per consegnare il controllo fuori alla fase successiva: un po 'di una macchina a stati finiti.
Quindi, iniziare facendo clic su 'stanza' pulsante, viene aggiunto 'posto stanza' ascoltatore. Trascinare fuori l'area che si desidera che la camera di essere, 'luogo stanza' modifica lo stato del gioco, poi cambia l'ActionListener per chi ascolta 'Place finestre'. All'infinito ... fino al completamento.
Uno molto semplice (non compilabile) esempio:
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
Ora, che ad esempio non compilabile da parte, Pyrolistical ha ancora un punto: in genere non si vuole combinare il tuo modello di gioco e l'interfaccia grafica in un unico glob di classi. Si desidera che il modello di separato dalla GUI, e di manipolare attraverso un'interfaccia ben definita.
(Inoltre, ci sono probabilmente i metodi migliori per andare sulla rimozione del listener del mouse poi basta rimuovere in modo casuale a tutti gli ascoltatori ... Ero in un po 'di fretta, mi spiace)
Altri suggerimenti
Sembra che è necessario definire il modello di gioco / Stato e tenerlo separato dal tuo azioni del mouse.
Stai usando MVC?