2009-07-17 15 views
6

Sto programmando un semplice gioco in Java ma sto cercando di farlo 'giusto' con un bel design pulito e senza hack.OO game design question

Ho due classi GamePanel che riceve clic e pressioni dei tasti e Model che contiene tutte le entità ed è responsabile dei loro aggiornamenti. Il modello deve sapere dove si trova il mouse dell'utente, ma non posso decidere il modo "giusto" per farlo.

Qualora il Model ed ogni Entity mantenere all'interno di un riferimento alla GamePanel o semplicemente cache l'ultima posizione nota del mouse e di ricevere aggiornamenti dal GamePanel regolarmente. Con la prima opzione quando viene creato il modello, sarà necessario fornire un riferimento allo GamePanel e con il secondo l'ultima posizione del mouse verrà inviata come parametro al metodo World.update().

Nessuna di queste soluzioni sembra elegante, quindi mi chiedevo se c'è un modo "giusto" per fare ciò che mi è mancato.

Grazie, Ben.

+0

Buona domanda, +1. –

+0

Quindi immagino che il consenso sia che se la posizione del mouse è necessaria solo occasionalmente usare osservatori o ascoltatori di eventi e se la posizione del mouse è necessaria nella maggior parte degli aggiornamenti, fornire al modello un riferimento al pannello in modo che possa eseguire il polling? –

risposta

3

A mio parere, dipenderà dal modo in cui le classi stanno interagendo. È una modifica nella posizione del mouse che attiva le entità nella classe Model? o La classe Model è indipendente dal GamePanel e funziona solo sui valori correnti della posizione del mouse?

Se in seguito e in tal caso sono d'accordo con ciò che jeff ha detto prima di me. Passa un handle su GamePanel alla classe Model durante la creazione e lascia che ogni entità utilizzi l'handle per accedere alla posizione del mouse ogni volta che è necessario. In questo modo viene sempre utilizzata la posizione aggiornata del mouse.

Se il primo suggerirei utilizzare Observers per far sapere alla classe Model quando il valore della posizione del mouse è cambiato. Quindi la classe Model potrebbe utilizzare lo stesso design (cioè lasciare che la classe Model abbia sempre un handle sulla classe GamePanel) e accedere ai valori correnti nel GamePanel.

Per riassumere la mia risposta alla tua domanda, penso che sia logico e conforme ai concetti OO lasciare che GamePanel mantenga i valori della posizione del mouse e che altre classi accedano a tali informazioni utilizzando un'istanza di GamePanel.

Grazie, Rohan.

2

Le coordinate correnti possono essere sempre una proprietà pubblica di GamePanel, in modo che le Entità/Modelli possano accedervi semplicemente da lì.

1

Se si vuole interrogare la posizione corrente del mouse, è possibile eseguire questo codice snipplet nel thread evento spedizione in qualsiasi momento lo si desidera:

Point pt = MouseInfo.getPointerInfo().getLocation(); 
Point cpt = GamePanel.getLocationOnScreen(); 
Point rel = new Point(pt.x - cpt.x, pt.y - cpt.y); 

E rel contiene la posizione relativa del mouse.

In alternativa, si potrebbe avere uno sguardo a JInput, come è stato progettato per far fronte a tastiera/mouse/qualunque ingressi.

+0

Mouse Info dal 1.5 – akarnokd

3

Una soluzione comune è quella di generare eventi. In questo caso, GamePanel genera un evento che informa tutti gli oggetti interessati (sottoscritti all'evento) (Entità) nel Modello della nuova posizione.

In questo modo, GamePanel non ha bisogno di sapere in modo esplicito quali Entità informare, e le Entità non hanno bisogno di tenere un'istanza di GamePanel in giro.

Il mio consiglio: leggere gli ascoltatori di eventi. (Java.util)

+0

Cosa intendi con Java.util? Gli eventi mouse e gli ascoltatori si trovano nel pacchetto java.awt.event. – akarnokd

+1

Siete entrambi corretti. Java.awt.event.MouseListener estende java.util.EventListener (http://java.sun.com/javase/6/docs/api/java/util/EventListener.html). – Nelson

+0

Ho immaginato che l'OP non stava usando awt o swing, quindi gli ho consigliato di utilizzare. – NomeN

1

Il modello deve sempre sapere dove si trova il mouse. IE: Hai bisogno della posizione del mouse ad ogni aggiornamento, o solo in un punto specifico.

Se ne avete bisogno in ogni punto o durante ogni aggiornamento, o la soluzione che avete documentato, o qualsiasi soluzione qui dovrebbe essere solida.

Se ne hai solo bisogno in punti specifici, allora basta prenderlo. (IE: se il tuo gioco risponde ai clic del mouse, fai qualcosa al clic). Significato Leggi gli ascoltatori di eventi.

Buona fortuna! Spero possa aiutare.

+0

C'è un caso in cui è possibile utilizzare l'approccio basato sul sondaggio - se non si vuole combattere l'evento trascinato dal mouse quando si "trascina" il mouse (ad esempio, sparare e girare) – akarnokd