15Fermer17
WarptenLe 11/02/2013 à 11:39
Pour avoir essayé de faire plusieurs jeux d'échecs et m'être compliqué la vie, et pour être en train de recommencer pour la quatrième fois, voilà mon conseil: ne te complique pas la vie avec des features prévues dont tu n'arrives pas à esquisser les limites tongue

Les gens au dessus ont à peu près tout dit je pense, le polymorphisme devrait faire l'affaire. Perso j'utiliserai ce genre de structure (fait au pied du lit, je me plante peut-être):

class GenericBlock
{
    public:
        GenericBlock(uint32 blockType) : _blockType(blockType) { }
        ~GenericBlock();
        DispatchEvent(EventInfo info);
        virtual void OnPlayerWalk(EventInfo info) { };
        virtual void OnPlayerEnter(EventInfo info) { };
        // Etc etc
    private:
        bool IsEventAllowed(EventInfo info) const;

        uint32 _blockType;
};

class WalkableBlock : public GenericBlock
{
    public:
        WalkableBlock(uint32 blockType) : GenericBlock(blockType) { }
        ~WalkableBlock();
        void OnPlayerWalk(EventInfo info);
};


Typiquement, la fonction DispatchEvent appelle IsEventAllowed en interne et vérifie, SELON le type de bloc, si un handler pour l'event existe: elle l'invoque si la réponse est oui. Tu peux même étendre ça à un bitmask pour un bloc qui, typiquement, est walkable ET avec lequel tu peux interagir (coin, life, etc). Si tu pars sur une approche bitmask, tu peux même créer une classe qui hérite de WalkableBlock et, admettons, InteractibleBlock, et tu n'auras rien à définir, chaque sous-classe possèdent déjà les handler nécessaires.

Pour le problème du switch super long tripo, je pense que c'est normal et relativement inévitable si tu ne travailles pas avec des bitmask, le moteur gagnant en complexité à chaque fois que tu rajoutes un type de bloc.

J'espère ne pas t'avoir perdu, je suis très mauvais pédagogue :P

[EDIT] Pour un truc encore plus générique, tu peux partir sur un tableau avec des pointeurs aux fonctions:

uint8 const MAX_EVENT_HANDLERS = <x>;
EventHandlerMap _eventsInfo[MAX_EVENT_HANDLERS] = 
{
    // Type de bloc           Handler associé
    { BLOCK_WALKABLE, &GenericBlock::OnPlayerWalk },
    // Etc
};


Ça s'invoque DANS ta classe, via (this->*ptr)()