Caricamento dei dati per un gioco di ruolo


8

Sto creando un piccolo gioco di ruolo di testo come un modo per esercitarsi in Python e sto incontrando una domanda su come caricare i dati. Il gioco è un gioco del selvaggio west, anche se non è troppo rilevante, e ho bisogno di memorizzare elenchi di armi e loro proprietà, nonché elenchi di personaggi, scenari, ecc. Ho una buona idea di come rappresentare questi dati come le classi ma non sono così chiaro su come archiviare e caricare i dati.

La mia domanda principale ruota attorno al rapporto tra dati e classi. Ho letto alcuni post qui su SE e molti di questi riguardano l'archiviazione, quindi ho alcune buone informazioni lì.

Quando devo caricare tali dati? Ad esempio, il giocatore sceglie tra diverse armi all'inizio del gioco. Devo caricare tutte le armi e creare un'istanza di tutti gli oggetti dell'arma in quel punto? La classe di armi dovrebbe avere la capacità di mostrare le armi dal database senza istanziarle?

Grazie per qualsiasi aiuto.

Risposte:


7

Dato che dici un "piccolo" gioco di ruolo, il mio consiglio sarebbe di precaricare tutto. Se non stiamo parlando di un'enorme quantità di contenuti, allora non dovrebbe fare una grande differenza nei tempi di avvio e mantiene le cose, come consiglia Bjorn, semplici.

Una cosa che mi viene in mente, leggendo la tua domanda, è che potresti voler considerare la differenza tra un'arma e un tipo di arma . La mia preferenza è sempre quella di avere una chiara distinzione tra i due e di avere entrambi modellato nel codice in modo da poter porre domande sul tipo di arma senza necessariamente avere un'istanza a portata di mano. (Un modo per farlo è quello di far sì che il tipo di arma sia la classe, con metodi di classe che ti consentano di interagire con essa, e l'arma sia un'istanza di quella classe. In realtà non preferisco questo approccio perché allora è impossibile o incredibilmente disordinato per un'arma che cambia tipo. Ovviamente non sarà rilevante per tutti i giochi.)


Come li differenzeresti nel codice? Ho davvero incontrato questo problema.
timfreilly,

1
Il modo in cui ho è che i tipi di armi sono oggetti gestiti attraverso il modello di "set di definizioni mediate" di cui parlo in questa domanda SO: stackoverflow.com/questions/401720/… , e ogni oggetto dell'arma sa che tipo è tramite un codice ID. Quindi potresti fare obj->setWeaponType(WEAPON_TYPE_SHOTGUN)qualsiasi cosa e l'arma si configura in modo appropriato. Le metriche sulle prestazioni dell'arma potrebbero utilizzare i valori del tipo come base ma consentire al risultato finale di essere modificato dall'istanza. Questo genere di cose.
caos

È qualcosa a cui pensare, grazie per il link. Cosa faresti in una situazione in cui desideri visualizzare un elenco dei tipi di armi disponibili? Questo tipo di richiesta passa attraverso la versione del broker / tipo?
timfreilly,

1
@timfreilly: dipende dal contesto. Se è qualcosa di simile a un negozio, di solito avrei il posto rifornito con esempi reali di armi e mostrerei le loro descrizioni al giocatore. Se è qualcosa come una panoramica dello sviluppatore o un'interfaccia di aiuto, allora chiederei al demone broker la serie completa di definizioni del tipo di arma e visualizzare informazioni su di esse.
caos

4

Carica tutto all'inizio. Non complicare il programma suddividendo i dati tra memoria e disco a meno che non sia necessario (ad es. Quando c'è troppo da conservare in memoria contemporaneamente).

L'importante è comprendere la distinzione tra dati che rappresentano istanze di un articolo e dati che rappresentano il tipo di un articolo. Generalmente diverse istanze della prima condividono un'istanza comune della seconda.


Potrei usare alcune informazioni aggiuntive lì. Come si codifica questa differenza?
timfreilly,

1
@timfreilly: ho una gerarchia di classi di esempio per un sistema di articoli che Kylotan descrive su gamedev.stackexchange.com/questions/4516/… ; questo è spesso chiamato il modello flyweight.

Come dice Joe, il modello Flyweight è un modo per presentare questo, condividendo implicitamente quel tipo di dati tra le istanze. Personalmente preferisco rappresentarli esplicitamente, ad es. con una classe MonsterInstance e una classe MonsterType. Ogni istanza di MonsterInstance ha un riferimento alla relativa istanza MonsterType.
Kylotan,

(Farei anche quello che dice Kylotan, lo definirei comunque un oggetto peso mosca.)

0

Non ho molta familiarità con Python. Il consiglio generale che vorrei dare è di mantenerlo semplice. Hai detto che hai già avuto un'idea di come rappresentare i dati. Se hai alcune classi per i dati che desideri archiviare, puoi memorizzarle in un elenco. Tale elenco può quindi essere serializzato su disco onSave e deserializzato onLoad. Per una prima implementazione e se i dati non sono così grandi, caricarei tutto all'avvio del gioco e lo salverei in determinati punti nel tempo.


0

È possibile utilizzare SQLite . Usando SQLite, puoi creare database in memoria e sul disco rigido e non hai bisogno di un DBMS gigante come MySQL installato.

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.