Je travaille sur un moteur de jeu en tant que projet pendant l'été. Chaque composant scriptable devrait avoir accès à certaines méthodes de la scène dans laquelle il se trouve. Pour que cela soit possible, je passe lambdas de la scène qui appelle les méthodes respectives au scriptable où elles sont implicitement converties en types std :: function.Donner un autre accès à des méthodes spécifiques
Scene.h:
class Scene
{
private:
unsigned int _currentId;
std::vector<System*> _systems;
//SCRIPTABLE NEEDS THE BELOW METHODS THESE EXCLUSIVELY:
bool exists(unsigned id);
void destroy(unsigned int);
void addComponent(Component*, unsigned int);
template<typename T> T& getComponent(unsigned int);
template<typename T> bool hasComponent(unsigned int);
template<typename T> void removeComponent(unsigned int);
protected:
unsigned int instantiate(std::vector<Component*>);
public:
Scene(ChangeSceneCallback);
~Scene();
void initiate();
void update(long dt);
};
template<typename T>
inline T & Scene::getComponent(unsigned int id)
{
for (System* system : _systems) {
if (system->corresponds(T)) {
return static_cast<T*>(system->getComponent(entityId));
}
}
}
template<typename T>
inline bool Scene::hasComponent(unsigned int id)
{
for (System* system : _systems) {
if (system->corresponds(T)) {
return system->contains(id);
}
}
}
template<typename T>
inline void Scene::removeComponent(unsigned int id)
{
for (System* system : _systems) {
if (system->corresponds(T)) {
return system->destroy(id);
}
}
}
La méthode de rappel fonctionne pour les fonctions non-modèle i besoin d'un accès, mais pas ceux templated, il est donc hors de question.
scriptable:
typedef std::function<void(int)> ChangeSceneCallback;
typedef std::function<int(std::vector<Component*>)> InstantiateCallback;
typedef std::function<void(int)> DestroyCallback;
typedef std::function<bool(int)> ExistCallback;
typedef std::function<void(Component*, unsigned int)> AddComponentCallback;
class Scriptable: public Component
{
protected:
ChangeSceneCallback changeScene;
InstantiateCallback instantiate;
DestroyCallback destroy;
ExistCallback exists;
public:
~Scriptable();
Scriptable();
void assignCallbacks(ChangeSceneCallback, InstantiateCallback etc ...);
virtual void init() = 0;
virtual void update() = 0;
};
scriptable ne peut pas avoir accès aux méthodes publiques en scène, car cela donnerait l'accès utilisateur/développeur pour les (scriptable est une classe de base pour le comportement du jeu). C'est pourquoi je dois trouver quelque chose qui donne un accès limité à la scène.
Des pensées?
Il n'y a pas de pointeur vers la fonction de modèle. Cela nécessiterait une compilation de code d'exécution. –
La question n'a aucun sens. Tant que le paramètre du template n'est pas fixé (spécialisé), template est un template. Ce n'est pas un type, ce n'est pas une fonction. Vous pouvez définir un template typedef (en utilisant les fonctionnalités C++ 11), mais cela ne vous permettra pas de l'utiliser comme un type sans spécifier le paramètre template. – AnT
Cela vous dérange-t-il d'expliquer ce que 'system-> correspond (T)' est supposé vouloir dire? –