Devo condividere la stessa struttura di riquadri per la visualizzazione e l'indirizzamento del percorso?


8

So come visualizzare una mappa 2D con riquadri.

So come creare un algoritmo di pathfinding usando A *.

Queste due cose richiedono una struttura o una classe. La mia domanda è: usi la stessa struttura per la visualizzazione e il path computing? Struttura del nodo per la richiesta di pathfinding per aggiungere alcuni dati: posizione x, posizione y, F, G, H più il nodo padre. La struttura del riquadro per la visualizzazione può essere ottimizzata per quasi una sola informazione: il valore del riquadro.

Usi una grande classe per le tue tessere, che gestiscono sia la visualizzazione che il pathfinding, oppure usi un metodo diverso? Grazie per i tuoi consigli!


Domanda fantastica, avevo davvero bisogno di imparare questo, ma non sapevo cosa chiedere.
DFectuoso,

Risposte:


6

La mia domanda è: usi la stessa struttura per la visualizzazione e il path computing?

No, non lo so. Puoi ottenere un po 'di ottimizzazione dal calcolo del tuo A * direttamente sulla mappa delle tessere, ma non puoi usare facilmente l'algoritmo A * per cose che non mappano direttamente alle tessere. Inoltre, significa che non puoi eseguire l'algoritmo A * contemporaneamente in più thread mentre finiscono per condividere i dati della mappa. Infine, alcuni metodi di spostamento non consentono l'ottimizzazione tile = node; un veicolo che ha bisogno di spazio per girare potrebbe potenzialmente arrivare alla stessa tessera da direzioni diverse e avere opzioni diverse in ogni caso - non possono essere uniti in un punteggio.

Quindi suggerisco di mantenere separati i dati.


Sebbene sia interessante tenerli separati, non è necessario utilizzare un grafico esplicito per la ricerca del percorso, ma è possibile disporre di una "piastrella" con solo le informazioni di collisione / costo, completamente separate dal rendering e dal modello logico. Ad esempio, se aggiungi un oggetto al mondo che non è memorizzato nella tilemap, ma semplicemente usando i coordini (x, y) potresti ancora inserirlo nella mappa delle collisioni e usarlo per la ricerca di percorsi basata sulla griglia.
Trinidad,

3

Dal punto di vista dello sviluppo del software, è sempre bene tenere separate cose diverse .

Per una soluzione rapida e sporca, metti tutto insieme e inizia a lavorare sulle specifiche del gioco.

Per una soluzione estensibile, tieni le cose a parte: non vuoi cambiare le classi di piastrelle perché l'algoritmo di pathfinding è stato modificato! Mantieni due strutture: una che rappresenta le tessere di gioco visibili e una che rappresenta la struttura del percorso. Idealmente, un algoritmo di pathfinding è mantenuto a un livello basso, quindi forse una matrice di punti x, y come input per l'algoritmo è un'idea migliore che fornirla con le classi di tile. L'algoritmo stesso può impostare array per valori F, G, H.

Penso che in questo caso (e presumo che ti sforzi di essere un buon programmatore), dovresti optare per la soluzione estensibile, perché non ti richiederà molto sforzo in più ma manterrà il tuo codice più pulito e otterrai buone pratiche Esperienza.


2

Una volta stavo costruendo un gioco basato su tessere sull'Amiga 500 con tessere 512x512 ma il giocatore poteva spostare solo 8 tessere, quindi ho generato un "9x9" tessere "mappa muro" pr. soldato. Se avessi fatto questo con la mappa originale, prima di tutto avrei dovuto "ripulirlo" dopo ogni calcolo + la quantità di memoria necessaria per avere entrambi i dati del riquadro + i dati di tracciamento renderebbe 512x512 un gran ricordo della memoria.

Quindi no, mantieni le cose il più piccole possibile e separate in modo da poterle modificare pr. oggetto / classe se necessario. Un'altra cosa a cui pensare potrebbe anche essere che alcuni dei tuoi oggetti in movimento POTREBBERO spostarsi in modo diverso su alcune parti della mappa. Per esempio. lento nella sabbia, può / non può nuotare, può aprire le porte ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.