У моїй грі є два заняття, які справді корисні, але повільно стають болем. Повідомлення та властивість (властивість по суті є компонентом).
Вони обидва походять від базового класу і містять статичний ідентифікатор, щоб системи могли звертати увагу лише на ті, які вони хочуть. Це дуже добре працює ... за винятком ...
По мірі розширення гри я постійно створюю нові типи повідомлень та типи властивостей. Кожен раз, коли мені потрібно записати 2 файли (hpp та cpp) та тонну панелі котлів, щоб отримати по суті classID та один або два стандартних типи даних або покажчик.
Починати перетворювати та випробовувати нові ідеї потрібно справжньою справою. Я хочу, коли я хочу створити нове повідомлення або тип властивості, я можу просто ввести щось на зразок
ShootableProperty: int gunType, float shotspeed;
ItemCollectedMessage: int itemType;
замість створення файлу заголовка та cpp, написання конструктора, включаючи батьківський клас тощо, тощо.
Це приблизно 20 - 40 рядків (включаючи охорону, і все), щоб зробити те, що логічно - це 1 або 2 рядки.
Чи існує якась схема програмування, щоб обійти це?
А як щодо сценаріїв (про які я нічого не знаю) ... чи є спосіб визначити купу класів, які майже однакові?
Ось як виглядає один клас:
// 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 */
Все це лише для 2D вектора та ідентифікатора, що говорить про очікування 2D вектора. (Звичайно, деякі властивості мають складніші елементи, але це одна і та ж ідея)