আমি মনে করি এক ধরণের দৃ solution় সমাধান হ'ল অবজেক্ট ওরিয়েন্টেড পথে যাওয়া।
আপনি কোন ধরণের অর্জনকে সমর্থন করতে চান তার উপর নির্ভর করে আপনার গেমের বর্তমান অবস্থা এবং / অথবা গেমের অবজেক্টগুলি (প্লেয়ারের মতো) যে ক্রিয়াকলাপ / ইভেন্টগুলির ইতিহাস তৈরি করেছে সে সম্পর্কে আপনার জিজ্ঞাসা করার একটি উপায় প্রয়োজন।
ধরা যাক আপনার একটি বেস অ্যাচিভমেন্ট ক্লাস রয়েছে যেমন:
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 (...)