मुझे लगता है कि वस्तु उन्मुख तरीके से जाने के लिए एक तरह का मजबूत समाधान होगा।
आप किस प्रकार की उपलब्धि का समर्थन करना चाहते हैं, इसके आधार पर, आपको अपने खेल की वर्तमान स्थिति और / या क्रियाओं के इतिहास / खेल की वस्तुओं (खिलाड़ी की तरह) की घटनाओं के लिए एक तरीका चाहिए।
मान लीजिए कि आपके पास एक आधार उपलब्धि वर्ग है जैसे:
class AbstractAchievement
{
GameState& gameState;
virtual bool IsEarned() = 0;
virtual string GetName() = 0;
};
AbstractAchievement
खेल की स्थिति का संदर्भ देता है। इसका उपयोग उन चीजों को क्वेरी करने के लिए किया जाता है जो हो रही हैं।
फिर आप ठोस कार्यान्वयन करते हैं। आइए अपने उदाहरणों का उपयोग करें:
class MasterSlicerAchievement : public AbstractAchievement
{
string GetName() { return "Master Slicer"; }
bool IsEarned()
{
Action lastAction = gameState.GetPlayerActionHistory().GetAction(0);
Action previousAction = gameState.GetPlayerActionHistory().GetAction(1);
if (lastAction.GetType() == ActionType::Slice &&
previousAction.GetType() == ActionType::Slice &&
lastAction.GetObjectType() == ObjectType::Watermelon &&
previousAction.GetObjectType() == ObjectType::Strawberry)
return true;
return false;
}
};
class InvinciblePipeRiderAchievement : public AbstractAchievement
{
string GetName() { return "Invincible Pipe Rider"; }
bool IsEarned()
{
if (gameState.GetLocationType(gameState.GetPlayerPosition()) == LocationType::OVER_PIPE &&
gameState.GetPlayerState() == EntityState::INVINCIBLE)
return true;
return false;
}
};
फिर यह तय करना है कि IsEarned()
विधि का उपयोग करके आपको कब जांचना है । आप प्रत्येक गेम अपडेट पर जांच कर सकते हैं।
उदाहरण के लिए, किसी प्रकार का इवेंट मैनेजर होने के लिए एक अधिक कुशल तरीका होगा। और फिर (जैसे घटनाओं रजिस्टर PlayerHasSlicedSomethingEvent
या PlayerGotInvicibleEvent
या बस PlayerStateChanged
एक विधि है कि पैरामीटर में उपलब्धि ले जाएगा के लिए)। उदाहरण:
class Game
{
void Initialize()
{
eventManager.RegisterAchievementCheckByActionType(ActionType::Slice, masterSlicerAchievement);
// Each time an action of type Slice happens,
// the CheckAchievement() method is invoked with masterSlicerAchievement as parameter.
eventManager.RegisterAchievementCheckByPlayerState(EntityState::INVINCIBLE, invinciblePiperAchievement);
// Each time the player gets the INVINCIBLE state,
// the CheckAchievement() method is invoked with invinciblePipeRiderAchievement as parameter.
}
void CheckAchievement(const AbstractAchievement& achievement)
{
if (!HasAchievement(player, achievement) && achievement.IsEarned())
{
AddAchievement(player, achievement);
}
}
};
if(...) return true; else return false;
रूप में ही हैreturn (...)