2009-03-07 15 views
8

Così sto costruendo il gioco pacman in Java per insegnarmi la programmazione del gioco.Pacman maze in Java

Ho la finestra di gioco di base con il pacman sprite e gli sprite fantasma disegnati, il pacman si muove con i tasti freccia, non si muove oltre le pareti della finestra, ecc. Ora sto provando a costruire il labirinto , come in questa immagine:

Pacman maze

Senza darmi la soluzione/completa diretto a questo, è possibile che qualcuno mi guida su come questo può essere costruito? Sto parlando solo dei confini e dei tubi (segni 'T') qui che non puoi attraversare e devi andare in giro. Non i punti che il pacman mangia ancora.

Ecco le mie domande:

1) Qual è l'algoritmo/metodo più efficiente per la creazione di questo labirinto? Dovrà essere disegnato ogni volta che viene chiamato il metodo paint() o esiste un modo per disegnarlo solo all'inizio del gioco e mai più?

2) Come verrà effettivamente visualizzato sullo schermo? Presumo che verrà utilizzato il fillRect()?

3) Qualsiasi suggerimento sul rilevamento delle collisioni (in modo che il pacman/i fantasmi non possano attraversare i muri) sarebbe utile.

4) Qualsiasi suggerimento su come verrà calcolato lo spazio libero tra i tubi in modo che i punti possano essere riempiti tra di essi sarà molto utile.

Grazie

risposta

9

Non lo farei in questo modo.

Vorrei disegnare la mappa grafica e quindi creare un array di dati 2D che rappresenta la mappa. La mappa dei dati sarebbe responsabile della determinazione delle collisioni, dei punti mangiare, dove sono le caramelle e dove sono i fantasmi. Una volta che tutta la logica per tutto è gestita, basta usare l'array 2D per visualizzare tutto nelle loro coordinate di pixel corrette sulla mappa grafica.

Ad esempio, l'utente sta premendo il tasto sinistro. Per prima cosa si determina che pacman è all'elemento 3, 3. L'elemento 3, 2 contiene informazioni che denotano un muro in modo da poter implementare il codice per fargli ignorare il comando.

EDIT:

Ogni elemento rappresenterebbe circa dove un punto potrebbe essere. Ad esempio:

No, guardando la scheda direi che la matrice sarebbe simile a questa.

d,d,d,d,d,d,d,d,d,d,d,d,w,w,d,d,d,d,d,d,d,d,d,d,d,d 
d,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,d 
p,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,p  
d,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,d  
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 

E così via. Si potrebbe desiderare di scegliere una struttura dati più flessibile rispetto ai soli caratteri, poiché alcune aree devono contenere una serie di informazioni diverse. IE anche se l'area di spawn fantasma è vuota, pacman non è permesso in là. Il movimento dei fantasmi e del pacman è diverso per le fughe laterali, il punto di spawn delle caramelle è un punto vuoto, ma se si vuole rimanere flessibili, si vorrà indicare dove si trova su una base per mappa.

Un'altra cosa che vorrai ricordare è che pacman e i fantasmi sono spesso punti intermedi, quindi contenere informazioni che rappresentano una percentuale di uno spazio che occupano tra 1,2 e 1,3 è importante per il rilevamento delle collisioni oltre a determinare quando si desidera rimuovere punti, powerup e caramelle dal tabellone.

+0

In che modo questa matrice rappresenta la mappa? Come in una rappresentazione da pixel a pixel? –

+0

Modificato. Vedi sopra. –

+0

Grazie. Quindi, se volessi spostare il pacman a 100 x, 50 y posizione, come lo imposterei sulla mappa per mostrare che quella posizione è occupata? qualsiasi codice per quello? –

2
  1. È possibile dipingere la mappa in un'Immagine raffinata e semplicemente disegnare l'immagine su ogni pittura(). Otterrai prestazioni abbastanza ragionevoli in questo modo.

  2. Se si è soddisfatti della solidità dei muri, è possibile disegnare ciascun blocco di muro quadrato con fillRect. Se desideri ottenere lo stesso aspetto dell'immagine, devi capire come disegnare le linee nel modo giusto e usare gli archi per gli angoli.

  3. La mappa di gioco di Pacman è composta da quadrati e Pacman e i fantasmi si spostano sempre da un riquadro al quadrato adiacente in un passaggio animato (ad esempio, si preme a destra, il pacman si sposta di un quadrato a destra). Ciò significa che il rilevamento delle collisioni è facile: semplicemente non consentire spostamenti a caselle non vuote.

  4. Non capisco cosa stai cercando di chiedere qui.

+0

Per quadrato si intende una coordinata pixel/x, y o un blocco di 10 pixel essendo un quadrato? –

+0

Intendo un blocco di pixel. Spencer Ruport sta parlando della stessa cosa. – TrayMan

2

1) Solo per dare il mio consiglio sul ridisegno. Qualcosa che puoi fare se trovi che ridisegnare l'intera immagine è lento, determina solo gli elementi che sono cambiati sullo schermo e li ridisegna. Un approccio per questo sarebbe il seguente: Determina gli sprite che sono stati mossi. Determina (approssimativo) un rettangolo attorno a quegli sprite. Ridisegna solo quei rettangoli. In questo modo si stanno solo rinfrescando parti dello schermo e non l'intero schermo. Ciò dovrebbe comportare un aumento delle prestazioni rispetto al ridisegno dell'intero schermo.

Le altre risposte sono state ragionevoli per le altre domande che hai chiesto.

7

Ecco un suggerimento per voi:

alt text http://www.freeimagehosting.net/uploads/66e4131f59.jpg

Questo suggerimento, correttamente utilizzati, vi permetterà di gestire il rendering e rilevamento delle collisioni, e permetterà anche di rappresentare il labirinto in modo compatto.

+0

Si prega di fornire anche alcuni dettagli sull'implementazione di questo suggerimento (cioè la mappa basata sulle tessere)! –

+0

Ci sono diversi modi per farlo. Il mio approccio iniziale sarebbe basato sul fatto che il labirinto di Pac-Man non cambia mai. Con questa ipotesi puoi semplicemente rappresentare il labirinto come una griglia 28 x 31 di 0 e 1. Quindi usa solo una bitmap per il labirinto effettivo invece di generarlo dalla griglia. –

+0

... gli 0 e gli 1 rappresentano la presenza o l'assenza di un muro.Il punto di questa rappresentazione è di supportare il rilevamento delle collisioni con le pareti. Il punto della bitmap è solo il rendering. Questo approccio richiede il mantenimento manuale della griglia e della bitmap. –