دەستکەوتەکانی Google Play Games لە یارییە مۆبایلەکاندا: کاریگەری لەسەر فرۆشگا، سنووری 2,000 XP، و تەلارسازیی MonoGame
کاتێک یارییەکی مۆبایل دروست دەکەیت و لە فرۆشگادا بڵاوی دەکەیتەوە، ئاڵنگارییە ڕاستەقینەکە لەوێوە دەست پێدەکات: چۆن سەرنجڕاکێشانی چەند خولەکی یەکەمی یاریزان بکەیتە خولێکی درێژخایەنی یاریکردن. کاتێک یاریزان تەنها بە خولێکی سادەی "قۆناغەکە ببڕە، دەست بە قۆناغی دواتر بکە" بەجێبهێڵرێت، لە کۆتاییدا بێزار دەبێت—یان یارییەکە دادەخات بێ ئەوەی تەنانەت نیوەی ئەو میکانیزمە قووڵانەی گەیمپلەی کە دروستت کردوون، بدۆزێتەوە.
لە سەرەتادا لەوانەیە سیستەمی دەستکەوتەکانی Google Play Games Services (GPGS) تەنها وەک کۆمەڵێک باجی بچووک دەربکەوێت کە لەسەر شاشە دەردەکەون. بەڵام کاتێک بە وردی دیزاین دەکرێت، دەبێتە بزوێنەرێکی بەهێز بۆ هێشتنەوەی یاریزانان (Retention) کە یاریزان بە هەموو چینەکانی میکانیزمی یارییەکەت ئاشنا دەکات.
لەم وتارە تەکنیکییەدا، باس لەوە دەکەین کە دەستکەوتەکان لە ئیکۆسیستەمی Google Play چ دەستکەوتێک بەدەست دەهێنن، چۆن 79 دەستکەوتی جیاوازمان لەژێر یاسا توندەکانی XPی گووگڵ بۆ Blocked: Pixel Panzer دیزاین کرد، و چۆن تەلارسازییەکی ناهاوکاتی بەچکردنمان بە MonoGame / C# ئەندازیاری کرد کە لە کاتی شەڕە توندەکاندا ڕێگری لە دابەزینی FPS و هەڵەکانی Android ANR (Application Not Responding) دەکات.
1. بۆچی دەستکەوتەکانی Google Play Games گرنگن؟
بەستنەوەی دەستکەوتەکانی Google Play Games چوار سوودی کۆنکرێتی لە ڕووی دەروونناسیی یاریزان و پێوەرەکانی فرۆشگاوە دەستەبەر دەکات:
- ئامانجی بەدیل و هێشتنەوەی یاریزانان (Day-7 / Day-30 Retention):
هەموو یاریزانێک ناتوانێت پلەی یەکەم لە تابلۆی گشتی پێشەنگەکان (Leaderboard) بەدەستبهێنێت، بەڵام هەموو یاریزانێک دەتوانێت کار بۆ "تێکشکاندنی 100 قەڵا (Turret)" یان "تەواوکردنی قۆناغێک بەبێ بەرکەوتنی زیان" بکات. دەستکەوتە پلەبەپلەکان (Incremental) هێڵێکی پێشکەوتنی ڕوون دەدەنە دەست یاریزان کە لەگەڵ هەموو دەستپێکردنێکی یارییەکە بەرەوپێش دەچێت. - فێرکردنی سروشتیی میکانیزمەکانی یاری (ئۆنبۆردینگی ناڕاستەوخۆ):
یاریزانان زۆربەی کات پەنا بۆ چەکە سەرەتاییەکەیان دەبەن و دوودڵ دەبن لە تاقیکردنەوەی شتی نوێ. لە Blocked: Pixel Panzer، خەڵاتکردنی یاریزانان لە بەرامبەر تواندنەوەی بلۆکەکان بە فیشەکی ترشی سەوز لەسەر ColorWheel یان لێدانی گورزی کوشندە بە فیشەکی ڕەش، هانیان دەدات هەموو شێوازە توخمییەکان بدۆزنەوە و زاڵ بن بەسەریاندا. - پێدانەوەی کاردانەوەی دەستبەجێ و Google Play Gamer XP:
بینینی بانەری فەرمیی Google Play Games کە لە سەرەوەی شاشەوە لە گەرمەی شەڕدا دێتە خوارەوە—و بەدەستهێنانی XP بۆ ئاستی گشتیی پڕۆفایلی یاریزانی گووگڵ—هەستێکی بەردەوامی پێشکەوتن بە یاریزان دەبەخشێت کە پەیوەستە بە پڕۆفایلی سیستەمی کارپێکردنەکەی. - ئیکۆسیستەمی Google Play و ئاماژەکانی کوالیتی:
بەستنەوەی Google Play Games Services V2 (PGS V2) چوونەژوورەوەی خۆکارانەی بێ دەستلێدان (Zero-Tap Sign-In)، گونجانی تەواو لەگەڵ Google Play Games on PC، و ئاماژەی بەهێزتری بەشداریکردن لە بەشی "یارییەکان"ی فرۆشگای Google Play دەهێنێتە کایەوە.
2. یاساکانی Google Play Console: سنووری 2,000 XP و بەربەستی 10,000 هەنگاو
لە کاتی ڕێکخستنی دەستکەوتەکان لە Google Play Console، دەبێت سێ سنوورداریی توندی پلاتفۆرمەکە لەبەرچاو بگریت:
- سنووری توندی 2,000 XP (Hard Cap): کۆی گشتیی خاڵەکانی دەستکەوت لە یەک یاری نابێت لە 2,000 XP زیاتر بێت. هەر دەستکەوتێکی تاک دەبێت لە نێوان 5 بۆ 200 XP بێت، و دەبێت کە Multipleـی 5 بێت.
- سنووری 10,000 هەنگاو بۆ دەستکەوتە پلەبەپلەکان: ئەو دەستکەوتانەی ژمێریاری کەڵەکەبوویان هەیە زۆرترین سنووریان 10,000 هەنگاوە (steps) لە Play Console.
- پێداویستیی Play Games Services V2: گووگڵ کۆتایی بە SDKی کۆنی V1 دەهێنێت. یارییە مۆدێرنەکانی ئەندرۆید دەبێت لەسەر بنەمای
Xamarin.GooglePlayServices.Games.V2(PlayGamesSdkوPlayGames.GetAchievementsClient) دروست بکرێن.
دیزاینکردنی کەتەلۆگێکی 79 دەستکەوتی لە Blocked: Pixel Panzer
بە شیکردنەوەی ئۆبجێکتە سەرەکییەکانی گەیمپلەی (TurretBlock, FighterJet, EnemyRocket, ColorWheel, HydraRegenerationSkill, Season)، ئێمە 79 دەستکەوتمان بە کۆی گشتی 1,995 / 2,000 XP لە 6 پۆلی سەرەکیدا ڕێکخست:
| پۆل | نموونەی دەستکەوتەکان | جۆر | ئامانج / میکانیزم |
|---|---|---|---|
| ڕاوکەرانی دوژمن (Enemy Hunters) | Jet Hunter I–III, Sky Dominator, Turret Buster I–III, Siege Master |
پلەبەپلە (Incremental) | تێکشکاندنی 10، 100، 1,000، و 10,000 فڕۆکەی جەنگی، قەڵای بەرگری، و مووشەکی ئاراستەکراو. |
| تێکشکاندنی بلۆک و تەقەمەنییەکان | Pioneer Breaker, Demolition Crew, Crusher Supreme, Pixel Obliterator, Chain Reaction |
پلەبەپلە / ئاسایی | شکاندنی 1,000 بۆ 10,000 بلۆک و تەقاندنەوەی 5/25/50 ئامانج بە یەک تەقینەوەی دینامیت. |
| ColorWheel و لێهاتوویی چەکەکان | Prismatic Pilot, Acid Dissolver, Critical Striker, Power Blaster, Speedy Sprinter, Beam Vaporizer |
پلەبەپلە | تواندنەوەی بلۆکەکان بە فیشەکی ترش، کوشتنی دوژمن بە زەبری ڕەش، گوللەی سووری بەهێز، لەیزەر و مووشەک. |
| پێشکەوتنی قۆناغ و دێوەزمەکان (Boss) | First Blood, Giant Slayer, Decimator, Speedrunner I–III |
پلەبەپلە / ئاسایی | یەکەم کوشتنی دوژمن، یەکەم بردنەوە لە Boss، و تەواوکردنی قۆناغەکان لە کەمتر لە 4 خولەکدا. |
| ئاڵنگارییە پاکەکان (Purist) | Untouchable, Clean Victory I–III, Purist Gladiator, Mono Specialist |
پلەبەپلە / ئاسایی | تێکشکاندنی Boss و بڕینی قۆناغە بەرزەکان بەبێ وەرگرتنی هیچ زیانێک یان بەبێ بەکارهێنانی هیچ لێهاتووییەک (Skill). |
| کەشوهەوا، کەرەستە و مێتا | Storm Fighter, Retro Connoisseur, Gem Tycoon, Quad Spectrum, Audiophile, Loyal Supporter |
پلەبەپلە / شاراوە | تێکشکاندنی 100 قەڵا لە کەشوهەوای باراناویدا، کۆکردنەوەی مۆنیتەری CRT، و گوێگرتن لە گۆرانییەکان لە میوزیک پلەیەر. |
بۆ هەر دەستکەوتێک، باجی تایبەتمان بە ستایلی پێکسڵ-ئارتی 512x512 دیزاین کرد کە لەگەڵ بەرزبوونەوەی ئاستی سەختی لە برۆنزەوە بۆ زێڕین و چوارچێوەی پریزماتی گەشە دەکەن:
ئامۆژگاریی پسپۆڕانە (هاوردەکردنی بەکۆمەڵ بە ZIP): تۆمارکردنی 79 دەستکەوت بە دەست لە ڕووکاری وێبی Google Play Console چەندین کاتژمێری پێدەچێت. لە جیاتی ئەوە، تایبەتمەندیی "Import achievements" لە Play Console بەکاربهێنە بە دانانی
AchievementsMetadata.csv,AchievementsIconsMappings.csv, و ئایکۆنە 512x512.jpgـەکان لە یەک ئەرشیڤی.zipبۆ هاوردەکردنی تەواوی کەتەلۆگەکە لە چەند چرکەیەکدا.
3. تەلارسازیی پاک: IGamesService و AchievementDirector لە کۆدی هاوبەشدا
یاریی Blocked: Pixel Panzer پڕۆژەیەکی فرە-پلاتفۆرمی MonoGameـە کە هەم لەسەر Windows PC (Microsoft Store) و هەم لەسەر Android (Google Play) کاردەکات. بۆ ئەوەی پڕۆژەی هاوبەشی گەیمپلەی (Blocked.Shared) بە تەواوی دوور بێت لە پشتبەستن بە Android SDK، ئێمە پرەنسیپی پێچەوانەکردنەوەی پشتبەستن (SOLID - Dependency Inversion) جێبەجێ دەکەین.
سەرەتا گرێبەستێکی سەربەخۆ لە پلاتفۆرم بە ناوی IGamesService لە چینی هاوبەشدا دادەنێین:
namespace Blocked.Shared.Services
{
public interface IGamesService
{
void Initialize();
Task<bool> SignIn();
Task<bool> IsAuthenticated();
// Leaderboards
void SubmitScore(string leaderboardId, long score);
void ShowLeaderboards();
void ShowLeaderboard(string leaderboardId);
// Achievements
void UnlockAchievement(string achievementId);
void IncrementAchievement(string achievementId, int steps = 1);
void ShowAchievements();
}
}
لە جیاتی ئەوەی پشکنینی دەستکەوتەکان بەسەر CollisionManager, GameplayScreen, و Playerدا بڵاوبکەینەوە، هەموو 79 یاساکە لە ناو یەک کلاسی ڕێکخەردا چڕ دەکەینەوە، کە AchievementDirectorە:
public static class AchievementDirector
{
public static void OnEnemyKilled(
bool isJet = false,
bool isTurret = false,
bool isRocket = false,
bool isBoss = false,
Bullet? killingBullet = null,
bool killedByLaser = false)
{
var gamesService = ScreenManager.Instance?.GamesService;
if (gamesService == null) return; // Safely no-ops on Desktop PC builds
if (isTurret)
{
gamesService.IncrementAchievement(AchievementIds.TurretBuster1, 1);
gamesService.IncrementAchievement(AchievementIds.TurretBuster2, 1);
gamesService.IncrementAchievement(AchievementIds.TurretBuster3, 1);
gamesService.IncrementAchievement(AchievementIds.SiegeMaster, 1);
// Turrets destroyed during rainy weather advance "Storm Fighter"
if (Season.Current == SeasonKind.Rainy)
{
gamesService.IncrementAchievement(AchievementIds.StormFighter, 1);
}
}
TrackWeaponKill(gamesService, killingBullet, killedByLaser);
}
}
4. ئەندازیاریی گرنگ: نەمانی کێشەی JNI / Binder IPC بۆ ڕێگری لە ANR
لە یارییەکی ئارکەیدی خێرادا، بەستنەوەی ڕاستەوخۆی دەستکەوتەکان بە Google Play SDK دەبێتە هۆی دروستبوونی تەنگژەیەکی گەورەی کارایی:
کاتێک یاریزانێک بلۆکێکی تەقینەوە (ExplosiveBlock) دەتەقێنێتەوە یان لێهاتوویی Laser Beam بەکاردەهێنێت، 20 بۆ 30 بلۆک و دوژمن دەکرێت لە یەک چوارچێوەدا (16.6 میلی چرکە) لەناوببرێن. کاتێک هەر لەناوچوونێک 5 یان 6 دەستکەوتی پلەبەپلە نوێ دەکاتەوە، تەنها یەک چوارچێوە دەتوانێت هۆکاری زیاتر لە 150 بانگکردنی IncrementAchievement بێت!
ئەگەر 150 بانگکردنی هاوکاتی JNI و Binder IPC بۆ Google Play Services لەسەر سەرەداوی سەرەکیی گەیم لووپ (Main Game Loop) بنێریت:
- ئامێرە ئاست نزمەکانی ئەندرۆید (مۆبایلەکانی Android Go کە 1-2 گێگابایت ڕامیان هەیە) دەستبەجێ دووچاری پچڕانی توندی فڕێیم دەبنەوە.
- خشتەی JNI Global Reference (GREF) پڕ دەبێت، کە دەبێتە هۆی تۆمارکردنی هەڵەی ANR (
Input dispatching timed out) لە Google Play Vitals.
چارەسەری ئێمە: بەچکردنی 1.5 چرکەیی لە میمۆری و لابردنی دووبارەبوونەوە لە دانیشتندا
شێوازی جێبەجێکردنمان لە GooglePlayGamesService.cs لووپی نوێکردنەوەی MonoGame بە تەواوی لە پەیوەندییەکانی Google Play IPC جیا دەکاتەوە:
- لابردنی دووبارەبوونەوە لە دانیشتندا (
_unlockedInSession):
کاتێک دەستکەوتێکی ئاسایی لە کاتی دانیشتنێکدا (Session) دەکرێتەوە، ناسێنەرەکەی بۆ ناوHashSet<string>زیاد دەکرێت. دووبارەبوونەوەی لە هەمان چوارچێوە یان چوارچێوەکانی دواتر ڕاستەوخۆ لە C# بە بێ هیچ تێچوویەکی JNI دەگەڕێتەوە. - بەچکردنی 1.5 چرکەیی لە پاشبنەمادا (
_pendingIncrements):
بانگکردنیIncrementAchievementتەنها ژمارەیەکی تەواو لە ناوDictionary<string, int>لەسەر میمۆری لە سەرەداوی سەرەکیدا زیاد دەکات (سفر بانگکردنی JNI). کرێکارێکی پاشبنەما بەTask.Runدوای 1.5 چرکە دەستبەکار دەبێت، کۆی کەڵەکەبووەکان کۆدەکاتەوە، و بە یەک بانگکردنی تێکەڵکراو بۆ هەر دەستکەوتێک دەینێرێت بۆ Google Play Services. - مامەڵەکردن لەگەڵ
26502: CLIENT_RECONNECT_REQUIREDو کەشکردنی ئۆفلاین:
ئەگەر یاریزانێک بۆ ماوەی چەندین کاتژمێر یارییەکە لە پاشبنەمادا دابنێت و بگەڕێتەوە، لەوانەیە تۆکنی دانیشتنی Google Play بەسەربچێت و هەڵەی26502 (CLIENT_RECONNECT_REQUIRED)بدات. سێرڤیسەکەمان ئەمە دەگرێت، هەوڵی یەکSignIn()ی بێدەنگ لە پاشبنەمادا دەدات، و ئەگەر ئامێرەکە ئۆفلاین بێت پەنا بۆ کەشی خۆجێیی GPGS دەبات (client.Unlock)—کە ئەمەش دڵنیایی دەدات هیچ دەستکەوتێکی یاریزان لەدەست ناچێت.
private static readonly HashSet<string> _unlockedInSession = new(StringComparer.Ordinal);
private static readonly Dictionary<string, int> _pendingIncrements = new(StringComparer.Ordinal);
private static readonly object _achievementBatchLock = new();
private static bool _incrementFlushScheduled = false;
public void IncrementAchievement(string achievementId, int steps = 1)
{
if (!_isInitialized || string.IsNullOrEmpty(achievementId) || steps <= 0)
return;
bool shouldSchedule = false;
lock (_achievementBatchLock)
{
// ZERO JNI cost on the game loop thread — pure in-memory aggregation!
if (_pendingIncrements.TryGetValue(achievementId, out int current))
_pendingIncrements[achievementId] = current + steps;
else
_pendingIncrements[achievementId] = steps;
if (!_incrementFlushScheduled)
{
_incrementFlushScheduled = true;
shouldSchedule = true;
}
}
if (shouldSchedule)
{
Task.Run(async () =>
{
await Task.Delay(1500).ConfigureAwait(false);
FlushPendingIncrementsNow();
});
}
}
private void FlushPendingIncrementsNow()
{
List<KeyValuePair<string, int>>? snapshot = null;
lock (_achievementBatchLock)
{
_incrementFlushScheduled = false;
if (_pendingIncrements.Count == 0) return;
snapshot = new List<KeyValuePair<string, int>>(_pendingIncrements);
_pendingIncrements.Clear();
}
var act = _activity;
if (act == null || act.IsFinishing || act.IsDestroyed) return;
var client = PlayGames.GetAchievementsClient(act);
foreach (var kvp in snapshot)
{
if (kvp.Value > 0)
{
// 150 frame events become 1 combined step call to GPGS
client.Increment(kvp.Key, kvp.Value);
}
}
}
5. یاریزانان چۆن لە ناو یارییەکەدا دەستکەوتەکانیان دەبینن؟
ئاگادارییە دەرکەوتووەکانی کاتی شەڕ زۆر باش و بەچێژن، بەڵام یاریزانان پێویستیان بە شوێنێکی ڕوونیش هەیە بۆ گەڕان بەناو باجە داخراوەکان، پشکنینی ڕێژەی لەسەدی پێشکەوتن لە ئاستە پلەبەپلەکان، و هەڵبژاردنی ئامانجی داهاتوویان.
بۆ پشتیوانیکردنی ئەمە بە شێوەیەکی ڕێکخراو، شاشەی ئامارەکانی مۆبایلمان کردە سەنتەرێکی یەکگرتوو بە ناوی STATS & RANKS. لە بەشی سەرەوەی شاشەکەدا، دوو دوگمەی زێڕین—LEADERBOARD و ACHIEVEMENTS—بە شەپۆلێکی نەرمی 2 چرکەیی (Math.Sin) دەدرەوشێنەوە. لە وەشانی کۆمپیوتەری Windows، ئەم دوگمە تایبەتانەی مۆبایل خۆکارانە دەشاردرێنەوە، تا ڕووکاری کلاسیکی STATISTICS بە پاکی بمێنێتەوە.
کاتێک یاریزان پەنجە دەنێت بە دوگمەی ACHIEVEMENTS:
- ڕاستەوخۆ
FlushPendingIncrementsNow()کاردەکات تاکو هەر پێشکەوتنێک کە لە 1.5 چرکەی ڕابردوودا هەبووە، پێش کرانەوەی ڕووکارەکە تۆمار بکرێت. GetAchievementsIntent()ئۆڤەرلەیی ڕەسەنی Achievementsی Google Play Games ڕاستەوخۆ لەسەر یارییەکە دەکاتەوە:
یاریزانان دەتوانن سەیری پێشکەوتنی 2 / 79ی خۆیان بکەن، پێشنیازە تایبەتەکان ببینن، و بازنەی ڕێژەی لەسەدی ئاستە پلەبەپلەکان بەبێ بەجێهێشتنی یارییەکە بپشکنن.
6. دەرئەنجام و یارییەکانمان
کاتێک دەستکەوتەکانی Google Play Games بە بودجەیەکی هاوسەنگی 2,000 XP و تەلارسازییەکی بەچکردنی پاشبنەمای نان-بلۆکینگ دروست دەکرێن، دەبنە یەکێک لە کاریگەرترین ڕێگاکان بۆ بەخشینی قووڵی و چێژی دووبارە یاریکردن بە یارییەکی ئارکەید بەبێ کەمکردنەوەی خێرایی فڕێیمەکان.
ئەگەر دەتەوێت خۆت ئەزموونی سیستەمی پێشکەوتنی 79 دەستکەوتمان، میکانیزمی شەڕی ColorWheel، و تابلۆی گشتی پێشەنگەکان بکەیت—یان سەیری بەرهەمەکانی ترمان بکەیت—دەتوانیت لەم فرۆشگایانەی خوارەوە بدۆزیتەوە:
🎮 یارییەکانمان:
- 🛡️ Blocked: Pixel Panzer:
ئەکشنی تانکی ڕیترۆ پێکسڵ کە فیشەکی توخمیی ColorWheel، کەشوهەوای داینامیکی، شەڕی دێوەزمەکان (Boss)، تابلۆی گشتی پێشەنگەکان، و 79 دەستکەوتی Google Play لەخۆدەگرێت!
👉 داگرتن لە Google Play (Android & PC) | Microsoft Store (Windows PC) - 🎨 Paint Trek:
یاری تەقەکەری ئاسمانیی ئارکەیدی خێرا و ڕەنگاوڕەنگ کە کاردانەوەی خێرا و جوڵەی تەکتیکی تێکەڵ دەکات.
👉 Google Play | Microsoft Store (PC & Xbox) - 🚀 Space Dodger:
خۆدزینەوە لە بەربەستەکان بە خێرایی بەرز لە قوڵایی بۆشایی ئاسماندا.
👉 داگرتن لە Google Play
📢 بەدواداچوون بۆ گەشەپێدان و کۆمەڵگەکەمان بکەن:
بۆ خوێندنەوەی وتاری تەکنیکی زیاتر، بینینی ڤیدیۆی پشت پەردە، و نوێکارییەکانی یاری، لەم تۆڕانە هاوڕێمان بن:
- 🎵 TikTok: @arargamesstudio
- 📸 Instagram: @arargamesstudio
- 🐦 X (Twitter): @arargamesstudio
- 📺 YouTube: @koreaaria
- 🧵 Threads: @arargamesstudio
- 📘 Facebook: arargamesstudio
تاگەکان و بابەتەکان
#GooglePlayGames #Achievements #MonoGame #CSharp #MobileGameDev #AndroidDev #IndieDev #GameArchitecture #BlockedPixelPanzer #PaintTrek #ArarGames
Hiç yorum yok:
Yorum Gönder