سؤال

كنت أتساءل عما إذا كان هناك طريقة يمكنني من خلالها ترميز نوع من FSM "عام" للعبة مع C ++؟.

تحتوي لعبتي على تصميم موجه للمكون ، لذلك أستخدم مكون FSM.

مكون آلة الحالة المحدودة (FSM) ، يبدو أكثر أو أقل بهذه الطريقة.

class gecFSM : public gecBehaviour 
{

public:
    //Constructors
    gecFSM() { state = kEntityState_walk; }
    gecFSM(kEntityState s) { state = s; }

    //Interface
    void setRule(kEntityState initialState, int inputAction, kEntityState resultingState);
    void performAction(int action);

private:
    kEntityState fsmTable[MAX_STATES][MAX_ACTIONS];

};

أحب أن أسمع آرائك/أفكارك أو اقتراحاتك حول كيفية جعل مكون FSM هذا عام. مع عام أعني:

1) إنشاء FSMTable من ملف XML أمر سهل حقًا ، أعني أنه مجرد مجموعة من الأعداد الصحيحة التي يمكن تحميلها لإنشاء مصفوفة MAX_STATESXMAX_ACTION.

void gecFSM::setRule(kEntityState initialState, int inputAction, kEntityState resultingState)
{
    fsmTable[initialState][inputAction] = resultingState;
}

2) ولكن ماذا عن طريقة "أداء العمل"؟

void gecFSM::performAction(int action)
{
    switch( smTable[ ownerEntity->getState() ][ action ] )
    {
        case WALK:
            /*Walk action*/
        break;
        case STAND:
            /*Stand action*/
        break;
        case JUMP:
            /*Jump action*/
        break;
        case RUN:
            /*Run action*/
        break;
    }
}

ماذا لو أردت أن أجعل "الإجراءات" والمفتاح عام؟

هذا من أجل تجنب إنشاء فئة مكونات FSM مختلفة لكل منها GameEntity? (gecFSMZombie, gecFSMDryad, gecFSMBoss إلخ ؟). هذا من شأنه أن يسمح لي بالذهاب "مدفوعة البيانات" وبناء FSM العام الخاص بي من الملفات على سبيل المثال.

ماذا تقترح الناس؟

هل كانت مفيدة؟

المحلول

إلقاء نظرة على مكتبة Statechart Boost. (المعروف سابقًا باسم Boost :: FSM) يأتي مع مثال كاميرا صور لطيفة للغاية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top