Es gibt zwei Klassen in meinem Spiel, die wirklich nützlich sind, aber langsam zum Schmerz werden. Nachricht und Eigenschaft (Eigenschaft ist im Wesentlichen eine Komponente).
Sie stammen beide von einer Basisklasse und enthalten eine statische ID, sodass Systeme nur auf diejenigen achten können, die sie möchten. Es funktioniert sehr gut ... außer ...
Ich mache ständig neue Nachrichtentypen und Eigenschaftstypen, während ich mein Spiel erweitere. Jedes Mal muss ich 2 Dateien (hpp und cpp) und eine Tonne Boilerplate schreiben, um im Wesentlichen eine classID und einen oder zwei Standarddatentypen oder einen Zeiger zu erhalten.
Es fängt an, das Herumspielen und Ausprobieren neuer Ideen zu einer echten Aufgabe zu machen. Ich möchte, wenn ich eine neue Nachricht oder einen neuen Eigenschaftstyp erstellen möchte, einfach so etwas eingeben können
ShootableProperty: int gunType, float shotspeed;
ItemCollectedMessage: int itemType;
Anstatt einen Header und eine CPP-Datei zu erstellen, schreiben Sie einen Konstruktor, einschließlich der übergeordneten Klasse usw. usw.
Es sind ungefähr 20 - 40 Zeilen (einschließlich Wachen und alles), nur um das zu tun, was in meinem Kopf logischerweise 1 oder 2 Zeilen sind.
Gibt es ein Programmiermuster, um dies zu umgehen?
Was ist mit Skripten (von denen ich nichts weiß) ... gibt es eine Möglichkeit, eine Reihe von Klassen zu definieren, die fast gleich sind?
Genau so sieht eine Klasse aus:
// 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 */
All dies nur für einen 2D-Vektor und eine ID, die sagen, dass ein 2D-Vektor erwartet werden soll. (Zugegeben, einige Eigenschaften haben kompliziertere Elemente, aber es ist die gleiche Idee)