Come gestire le dipendenze tra mappa delle tessere e unità


11

Ho una strategia basata su piastrelle 2D nelle opere. Sto vagando su come gestire la relazione tra la mappa e le unità sulla mappa.

Data una coordinata di tessera, dovrò essere in grado di far stare l'unità, se presente. Allo stesso tempo, se viene data un'unità, voglio essere in grado di ottenere le coordinate dell'unità.

Ho visto due soluzioni a questo. La prima soluzione sarebbe quella di fare in modo che le unità memorizzino una coordinata e i riferimenti alle unità di memorizzazione della mappa nelle sue tessere. Questo crea una dipendenza ciclica tra la mappa e le unità. Dovrei assicurarmi che la mappa e qualsiasi unità siano sincronizzate se l'unità si sposta.

La seconda soluzione sarebbe quella di fare in modo che le unità tengano traccia delle loro coordinate. Per sapere se una tessera contiene un'unità e per ottenere quell'unità, scorrerei l'intero insieme di unità unità e ne trovo una con coordinate corrispondenti. Questo elimina la dipendenza ciclica, ma perde la proprietà O (1) che la prima soluzione aveva per cercare le unità dalla mappa. Ciò potrebbe sommarsi poiché desidero essere in grado di scansionare regolarmente la mappa alla ricerca di elementi quali la ricerca del percorso, la determinazione del raggio di movimento e la ricerca di obiettivi validi per una determinata unità.

Inoltre non posso semplicemente memorizzare le unità nella mappa (o posso?). Le unità sono associate a "eserciti", sia giocatori che AI. Un esercito dovrebbe essere in grado di accedere e iterare facilmente su tutte le sue unità.

Dal momento che questo sembra essere un problema comune nei giochi di strategia, ci sono altri schemi oltre ai due che ho descritto per gestire le relazioni unità / mappa?

Risposte:


3

Non è un modello popolare, ma il mondo dei database relazionali offre un terzo modo: utilizzare una struttura di dati con più chiavi. In forma tabulare, potrebbe apparire così:

Unit id    Location
-------------------
  1309     13,15
  2357      7,93
  8552      7,93

Vuoi essere in grado di chiedere, "dov'è l'unità 2357?" e torna indietro 7,93. Vuoi anche essere in grado di chiedere, "cosa c'è nella posizione 7,93?" e tornare indietro 2357 e 8552. Esistono strutture dati che consentono a più chiavi di cercare le cose. Puoi archiviarlo all'esterno delle unità e all'esterno della mappa se desideri rimuovere le dipendenze.

Tuttavia, in pratica è più comune archiviare la posizione in ciascuna unità e quindi sul lato utilizzare una struttura di dati di partizionamento spaziale che ti dice quali unità si trovano in una determinata regione. Poiché è una struttura separata, le regioni non devono essere spazi della griglia; possono essere aree più grandi.

Consiglio di fare qualunque sia la più semplice (la tua seconda soluzione) e successivamente, se si tratta di un problema di prestazioni, puoi aggiungere una partizione spaziale per velocizzare le ricerche.


Quindi, la struttura dei dati di partizionamento spaziale che menzionate potrebbe essere solo la mappa (che nel mio caso è apparentemente una griglia 2D di tessere). Suppongo che quando un'unità si sposta (o viene aggiunta o rimossa), devo ancora aggiornare sia l'unità che la struttura di partizionamento spaziale per mantenerle sincronizzate. Forse è una di quelle cose con cui dovrò convivere?
AJM,

1
Sì, la mappa è la partizione spaziale a grana più fine che useresti. L'elenco globale di tutte le unità è la partizione a grana più grossa. ;) Devi solo aggiornare la partizione prima di usarla. Se lo usi tutto il tempo, probabilmente desideri aggiornarlo ogni volta che l'unità viene spostata. Tuttavia, se lo si utilizza solo per alcune fasi della logica di aggiornamento, è possibile scorrere l'elenco delle unità in un solo passaggio e calcolare la struttura dei dati della partizione, quindi scartarla al termine. In questo modo non devi tenerli sempre sincronizzati.
tra il

5

Bene, a meno che tu non abbia diverse migliaia di unità per giocatore, non mi preoccuperei dell'utilizzo della memoria e utilizzerei la prima soluzione. Sembra che la memoria sia più economica della CPU.

In effetti anche se tu avessi 4000 unità per giocatore, usando due numeri interi per memorizzare lì la posizione, e 8 giocatori, che richiede solo 2 MB, ma con la prima soluzione, puoi usare un coordinatore O (1), piuttosto che O (n) (supponendo non ordinato), che con molte unità potrebbe essere lento.

La maggior parte dei giochi sembrano basati su pixel, anziché su riquadri, ora un giorno, quindi devono solo fare in modo che l'unità memorizzi le coordinate.


Non sono preoccupato per l'utilizzo della memoria, sono più interessato alla gestione delle dipendenze (nel senso del design orientato agli oggetti). Non è la memoria aggiuntiva che la prima soluzione comporterebbe che mi preoccupa, è la dipendenza ciclica di cui sono sospettoso, tanto quanto mi piace il coordinatore O (1). Inoltre, so che molti giochi sono basati su pixel ora, ma mi piacciono le tessere, quindi è quello che sto usando. : P
AJM,

@AJM, lo stesso, le app a pagamento che rilascerò su Android useranno le tessere.
Ray Britton,
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.