Existem duas classes no meu jogo que são realmente úteis, mas lentamente se tornando uma dor. Mensagem e propriedade (a propriedade é essencialmente um componente).
Ambos derivam de uma classe base e contêm um ID estático, de modo que os sistemas podem prestar atenção apenas àqueles que desejam. Está funcionando muito bem ... exceto ...
Estou constantemente criando novos tipos de mensagens e propriedades à medida que estendo meu jogo. Cada vez que eu preciso escrever 2 arquivos (hpp e cpp) e uma tonelada de clichê para obter essencialmente um classID e um ou dois tipos de dados padrão ou um ponteiro.
Está começando a fazer com que brincar e testar novas idéias seja uma tarefa real. Desejo que, quando desejar criar uma nova mensagem ou tipo de propriedade, queira poder digitar algo como
ShootableProperty: int gunType, float shotspeed;
ItemCollectedMessage: int itemType;
em vez de criar um arquivo de cabeçalho e cpp, escrever um construtor, incluindo a classe pai, etc.
São cerca de 20 a 40 linhas (incluindo guardas e tudo) apenas para fazer o que logicamente são 1 ou 2 linhas em minha mente.
Existe algum padrão de programação para contornar isso?
E quanto aos scripts (dos quais eu não sei nada) ... existe uma maneira de definir um monte de classes quase iguais?
Aqui está exatamente como uma classe se parece:
// Velocity.h
#ifndef VELOCITY_H_
#define VELOCITY_H_
#include "Properties.h"
#include <SFML/System/Vector2.hpp>
namespace LaB
{
namespace P
{
class Velocity: public LaB::Property
{
public:
static const PropertyID id;
Velocity(float vx = 0.0, float vy = 0.0)
: velocity(vx,vy) {}
Velocity(sf::Vector2f v) : velocity(v) {};
sf::Vector2f velocity;
};
} /* namespace P */
} /* namespace LaB */
#endif /* LaB::P_VELOCITY_H_ */
// Velocity.cpp
#include "Properties/Velocity.h"
namespace LaB
{
namespace P
{
const PropertyID Velocity::id = Property::registerID();
} /* namespace P */
} /* namespace LaB */
Tudo isso apenas para um vetor 2D e um ID que espera um vetor 2D. (Concedido, algumas propriedades têm elementos mais complicados, mas é a mesma ideia)