Carregando dados para um RPG


8

Estou criando um RPG de texto pequeno como uma maneira de praticar python e estou tendo uma pergunta sobre como carregar dados. O jogo é um jogo do oeste selvagem, embora isso não seja muito relevante, e eu preciso armazenar listas de armas e suas propriedades, bem como listas de personagens, cenários etc. Eu tenho uma boa idéia de como representar esses dados como classes, mas não sou tão claro sobre como armazenar e carregar os dados.

Minha principal pergunta gira em torno do relacionamento entre dados e classes. Eu li algumas postagens aqui no SE e muitas delas estão relacionadas ao armazenamento, por isso tenho boas informações lá.

Quando devo carregar esses dados? Por exemplo, o jogador escolhe várias armas quando o jogo começa. Devo carregar todas as armas e instanciar todos os objetos de armas nesse ponto? A classe de armas deve ter a capacidade de mostrar armas do banco de dados sem instancia-las?

Obrigado por qualquer ajuda.

Respostas:


7

Como você diz um RPG de texto "pequeno", meu conselho seria apenas pré-carregar tudo. Se não estamos falando de uma quantidade enorme de conteúdo, não deve fazer muita diferença no tempo de inicialização e mantém as coisas, como aconselha Bjorn, simples.

Uma coisa que me ocorre, lendo sua pergunta, é que você pode considerar a diferença entre uma arma e um tipo de arma . Minha preferência é sempre ter uma distinção clara entre os dois e ter os dois modelados em código para que eu possa fazer perguntas sobre o tipo de arma sem necessariamente ter que ter uma instância à mão. (Uma maneira de fazer isso é fazer com que o tipo de arma seja a classe, com métodos de classe que permitem que você interaja com ela, e a arma seja uma instância dessa classe. Na verdade, eu não prefiro essa abordagem porque é impossível ou incrivelmente bagunçado para uma arma mudar de tipo. Obviamente isso não será relevante para todos os jogos.)


Como você os diferenciaria no código? Eu realmente encontrei esse problema.
— Timfreilly 5/05

11
A maneira que eu entendo é que os tipos de armas são objetos gerenciados através do padrão "conjunto de definições intermediadas" de que falo nesta pergunta do SO: stackoverflow.com/questions/401720/… , e cada objeto de arma sabe de que tipo é um código de identificação. Então você pode fazer o que obj->setWeaponType(WEAPON_TYPE_SHOTGUN)quer que seja, e a arma se configura adequadamente. As métricas de desempenho de armas podem usar os valores do tipo como linha de base, mas permitem que o resultado final seja modificado pela instância. Esse tipo de coisas.
— caos

É algo para se pensar, obrigado pelo link. O que você faria em uma situação em que queria exibir uma lista dos tipos de armas disponíveis? Esse tipo de solicitação passa pela versão do broker / tipo?
— timfreilly

11
@timfreilly: Depende do contexto. Se for algo parecido com uma loja, eu normalmente teria o local abastecido com instâncias reais de armas e mostraria suas descrições ao jogador. Se for algo como uma visão geral do desenvolvedor ou uma interface de ajuda, eu pediria ao daemon do broker o conjunto completo de definições de tipos de armas e exibia informações sobre elas.
— caos

4

Carregue tudo no início. Não complique seu programa dividindo dados entre a memória e o disco, a menos que seja necessário (por exemplo, quando houver muito para armazenar na memória de uma só vez).

O importante é entender a distinção entre dados que representam instâncias de um item e dados que representam o tipo de um item. Geralmente, várias instâncias da primeira compartilham uma instância comum da segunda.


Eu poderia usar algumas informações adicionais lá. Como você codifica essa diferença?
— timfreilly

11
@timfreilly: Eu tenho uma hierarquia de classes de amostra para um sistema de itens como o Kylotan descreve em gamedev.stackexchange.com/questions/4516/… ; isso geralmente é chamado de padrão de peso de mosca.

Como Joe diz, o padrão Flyweight é uma maneira de apresentar isso, compartilhando implicitamente esse 'tipo' de dados entre as instâncias. Pessoalmente, prefiro representá-los explicitamente, por exemplo. com uma classe MonsterInstance e uma classe MonsterType. Cada instância do MonsterInstance tem uma referência à sua instância MonsterType relevante.
— Kylotan

(Eu faria o que Kylotan diz, bem, eu ainda diria que foi um objeto flyweight.)

0

Eu não estou muito familiarizado com python. O conselho geral que eu daria é simplificar. Você disse que já tem uma idéia de como representar os dados. Se você tiver algumas classes para os dados que deseja armazenar, poderá armazená-las em uma lista. Essa lista pode ser serializada para o disco onSave e desserializada onLoad. Para uma primeira implementação e se os dados não forem tão grandes, eu carregaria tudo no início do jogo e os salvaria em alguns momentos.


0

Você poderia usar SQLite . Usando o SQLite, você pode criar bancos de dados na memória e no disco rígido e não precisa de um DBMS gigante como o MySQL instalado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.