Como posso definir itens no meu RPG como um jogo Java?

21

Estou trabalhando casualmente em um jogo do tipo RPG em Java, mas estou tendo problemas para descobrir como posso ter itens que podem fazer muitas coisas diferentes sem criar uma classe diferente para cada item.

Como exemplo, como eu criaria um Machado que poderia cortar árvores e atacar monstros?

Se eu estender a classe de corte ou de arma, não posso estender a outra classe.

Se eu tiver um chopping e uma arma como interface, terei muito código duplicado quando um punhal também pode atacar monstros e um machado diferente pode cortar árvores.

Espero que haja uma maneira de ter uma única classe de item e carregar os itens e suas respectivas habilidades de um arquivo. Se isso é possível, como isso pode ser feito? Caso contrário, qual é a melhor maneira de ter itens em um jogo?

MESLewis
fonte

Respostas:

15

A resposta de Gregory Weir é a minha favorita para estruturar as instâncias de itens para desempenhar várias funções.

Para carregar de um arquivo:

Primeiro, use o YAML. YAML é uma linguagem de descrição de dados abrangente; ele pode ser analisado com relativa rapidez, lido e editado por humanos, suporta dados binários e existem bibliotecas para a maioria das linguagens de programação, incluindo Java. Isso resolve o "como faço para obter dados de arquivos em objetos?"

Segundo, use o padrão flyweight . A maioria dos dados que você lê desses arquivos é estática. Não vai mudar por exemplo ("machado causa 1d10 de dano básico e quebra madeira, mas não pedra" - isso é verdade para todos os cinco eixos que um jogador possui). O que você realmente lê dos arquivos YAML são essas definições platônicas, e suas instâncias de itens individuais têm referências não proprietárias (e constantes) a elas, juntamente com dados por instância como "Quantos balanços antes de eu quebrar?", "O jogador deu me um nome personalizado? "e assim por diante.

Ao compartilhar os dados entre instâncias em um único objeto, você preserva muita memória e facilita a atualização de itens sem o estado persistente do jogo (salve jogos ou banco de dados de jogadores).

Portanto, sua estrutura de classes se parece com:

  • item de classe - uma instância por item
    • Possui uma instância de arma
    • Instância de ferramenta Owns-a
    • Tem um nome personalizado etc.
  • classe Arma - (até) uma instância por item
    • Is-a ItemComponent
    • Refere-se a WeaponDef
    • Possui um nível de encantamento bônus, etc.
  • classe Ferramenta - (até) uma instância por item
    • Is-a ItemComponent
    • Refere-se a ToolDef
    • Possui durabilidade, etc.
  • classe WeaponDef - Uma instância por tipo de arma
    • Leia de um arquivo, os campos devem ser constantes.
    • Tem uma quantidade de dano base, 1 ou 2 mãos, etc.
  • classe ToolDef - Uma instância por tipo de ferramenta
    • Leia de um arquivo, os campos devem ser constantes.
    • Possui durabilidade básica, materiais que podem quebrar, etc.
Marko Zajc
fonte
18

O padrão de design do componente (não composto) é excelente para esse propósito: http://gameprogrammingpatterns.com/component.html

Basicamente, um Axe seria uma instância da classe Item que continha um WeaponComponent e um ToolComponent (talvez). Para testar se algo pode ser usado como arma, verifique se ele possui um WeaponComponent conectado e, em seguida, fale com a instância WeaponComponent para obter as informações da arma do item.

Carregar de um arquivo é um exercício separado, é claro.

Gregory Avery-Weir
fonte
E, é claro, depois de ter componentes, você poderá fazer bom uso das interfaces novamente. Seu tipo Axe pode implementar o IChopper e o IWeapon, mas pode expor o comportamento do componente, permitindo que você reutilize o tipo e a implementação conforme necessário e faça o teste dos componentes. Se todos os eixos tiverem os mesmos recursos, mas com estatísticas diferentes, você será de ouro. Se você precisa que os itens tenham habilidades únicas, pode ser necessário implementar uma coleção de componentes do jogo e fazer com que suas rotinas de atualização consultem os objetos sobre o que eles podem fazer através de quais componentes estão presentes.
CodexArcanum 15/10/10
6
@CodexArcanum: "Seu tipo Ax pode implementar IChopper e IWeapon, mas pode expor o comportamento do componente" - Qual é o objetivo disso? Apenas incha sua hierarquia de classes. O ponto do padrão de componente é que você não precisa de uma classe Ax ou uma interface IChopper ou uma interface IWeapon, apenas componentes concretos de helicóptero e arma e um item de nível superior.
Atualmente, estou trabalhando em um sistema de componentes para meus itens de jogo e realmente só tenho uma reclamação importante sobre como o padrão é usado. Dado os componentes de Arma, Vestuário e Consumível, um item pode ser teoricamente "corrompido" em termos de itens que não podem ser Armas e Vestuário, ou um Vestuário que também seja Consumível. Logicamente, um item pode ser apenas um "Componente Principal", mas, ao restringir os componentes, você estará quebrando a necessidade de um sistema de componentes. Assim, uma das falhas fundamentais com um sistema de outra forma incrível
Krythic