Di solito, entità e componenti o altre parti del codice di gioco in progettazione basata sui dati avranno nomi controllati se si desidera scoprire quale oggetto si sta trattando con esattamente.Quali sono alcuni buoni metodi per sostituire i nomi di stringa con hash di interi
void Player::Interact(Entity *myEntity)
{
if(myEntity->isNearEnough(this) && myEntity->GetFamilyName() == "guard")
{
static_cast<Guard*>(myEntity)->Say("No mention of arrows and knees here");
}
}
Se si ignora la possibilità che questo potrebbe essere l'ottimizzazione prematura, è abbastanza chiaro che la ricerca entità sarebbe molto più veloce se il loro "nome" è stato un valore a 32 bit semplice invece di uno stringa effettiva.
L'hashing di calcolo dei nomi di stringa è una possibile opzione. Non l'ho ancora provato, ma con una gamma di 32 bit e una buona funzione di hashing il rischio di collisione dovrebbe essere minimo.
La domanda è questa: ovviamente abbiamo bisogno di un modo per convertire in-code (o in un qualche tipo di file esterno) nomi di stringhe a quei numeri interi, poiché la persona che lavora su questi oggetti nominati vorrà comunque fare riferimento al oggetto come "guardia" invece di "0x2315f21a".
Supponendo che stiamo usando C++ e vogliamo sostituire tutte le stringhe che appaiono nel codice, questo può anche essere ottenuto con funzionalità incorporate in linguaggio o dobbiamo costruire uno strumento esterno che controlli manualmente tutti i file e gli scambi i valori?
+ LOL per il messaggio della guardia: D – Petruza
Direi che vorresti davvero 'dynamic_cast' qui. RTTI può avere un brutto nome nello sviluppo del gioco, ma questo è destinato ad essere molto più lento di quello, per non dire più difficile da mantenere. –
MSalters