نشر ألعاب سطح المكتب MonoGame على Microsoft Store: الدليل الكامل لـ MSIX و WAP
يتيح إطلاق لعبة مستقلة على Microsoft Store في Windows 10 و Windows 11 للمطورين وصولاً مباشراً إلى مئات الملايين من لاعبي الحواسيب، إلى جانب التحديثات التلقائية الخلفية، والتكامل مع شريط ألعاب Windows، وأمان بيئة التثبيت المعزولة. ومع ذلك، إذا كانت لعبتك مبنية باستخدام MonoGame (.NET 8.0 أو .NET 9.0 WindowsDX)، فإن إدخالها إلى المتجر يتطلب جسراً معمارياً: ربط ملف تنفيذي تقليدي من نوع Win32 (.exe) بنموذج التطبيقات الحديث MSIX / AppX.
في Arar Games، خضنا هذه التجربة بنجاح مع ألعابنا مثل Paint Trek و Blocked: Pixel Panzer من مرحلة البناء الأولى وحتى النشر المباشر. في هذا الدليل العملي، نستعرض كافة الخطوات التقنية: تهيئة المشاريع، فهم خيارات قائمة Publish في Visual Studio، ضبط ملف Package.appxmanifest، ضبط مقاسات الأيقونات والبلاطات، حل أخطاء حزمة اعتماد تطبيقات Windows (WACK)، والتقديم النهائي عبر Microsoft Partner Center.
1. الأسس المعمارية: مقارنة بين Win32 و MSIX
تُبنى ألعاب MonoGame التقليدية كملف تنفيذي قياسي بنظام Win32 مصحوباً بمكتبات وقت التشغيل (.dll) ومجلد Content/ يحتوي على الأصول الثنائية المضغوطة (خامات .xnb، ملفات صوت .ogg، ومظللات HLSL).
على الرغم من أن متجر مايكروسوفت يدعم حالياً توزيع ملفات Win32 التنفيذية المنفصلة، إلا أن تغليف لعبتك ضمن مشروع حزم تطبيقات Windows (WAP) لإنتاج حزمة MSIX bundle يوفر فوائد تقنية وعملية هائلة:
flowchart TD
subgraph "قاعدة كود اللعبة"
Shared["المكتبة المشتركة
(الميكانيكا، الأنظمة، حالة اللعبة)"]
Desktop["مشروع سطح المكتب (.NET 9.0 WindowsDX)
(نقطة الدخول Win32 Executable)"]
Shared --> Desktop
end
subgraph "طبقة الحزم (مشروع WAP)"
WAP["حزم تطبيقات Windows (.wapproj)
(Microsoft Desktop Bridge)"]
Manifest["Package.appxmanifest
(الهوية، الصلاحيات، العناصر المرئية)"]
StoreAssoc["Package.StoreAssociation.xml
(الربط بـ Partner Center)"]
Desktop --> WAP
Manifest --> WAP
StoreAssoc --> WAP
end
subgraph "المخرجات والتوزيع"
WAP -->|إنشاء الحزم| Sideload["حزمة التحميل الجانبي
(*.appxbundle + Add-AppDevPackage.ps1)"]
WAP -->|نمط المتجر| UploadBundle["حزمة رفع المتجر
(*_bundle.appxupload / *.msixupload)"]
UploadBundle --> MSStore["Microsoft Partner Center
(النشر المباشر في المتجر)"]
end
لماذا نغلف مشروع MonoGame بواسطة WAP؟
- دورة حياة معزولة داخل حاوية: تعمل تطبيقات MSIX في بيئة معزولة وآمنة. عند إلغاء التثبيت، تُحذف كافة الملفات ومدخلات السجل الافتراضية دون ترك أي مخلفات على النظام.
- توزيع ديناميكي وحجم أصغر: تجمع حزمة
.appxuploadواحدة بين ثنائيات معمارياتx86وx64مع حزم مقاييس الشاشة المتعددة (scale-100حتىscale-400). يرسل المتجر للجهاز فقط المعمارية والأصول التي تناسبه. - تقارير الأعطال التلقائية: يُضمن Visual Studio ملفات رموز التصحيح (
.appxsym) داخل حزمة الرفع، مما يتيح لك رؤية تفاصيل تتبع الأعطال (stack trace) بدقة في لوحة تحكم Partner Center.
2. الهيكل التنظيمي للمشروع والتهيئة
SolutionDir/
│
├── YourGame.Shared/ # المنطق الأساسي للعبة، المراحل والأنظمة (مكتبة مشتركة)
│ └── YourGame.Shared.csproj
│
├── YourGame.Desktop/ # نقطة تشغيل سطح المكتب (WinExe)
│ ├── Content/ # أصول خط معالجة المحتوى (.mgcb -> .xnb)
│ ├── Program.cs
│ └── YourGame.Desktop.csproj
│
└── YourGame.Package/ # مشروع حزم WAP (.wapproj)
├── Images/ # الأيقونات والشعارات وشاشة البدء
├── Package.appxmanifest # إعلان الهوية والصلاحيات
├── Package.StoreAssociation.xml
└── YourGame.Package.wapproj
الخطوة 1: تهيئة مشروع اللعبة الرئيسي (.csproj)
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net9.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<ApplicationHighDpiMode>PerMonitorV2</ApplicationHighDpiMode>
<Platforms>AnyCPU;x64;x86</Platforms>
</PropertyGroup>
<!-- ضمان نسخ أصول اللعبة أثناء الحزم -->
<ItemGroup>
<Content Include="Content\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<PackageReference Include="MonoGame.Framework.WindowsDX" Version="3.8.*" />
<PackageReference Include="MonoGame.Content.Builder.Task" Version="3.8.*" />
</ItemGroup>
</Project>
الخطوة 2: استعادة حزم NuGet لكلا المعماريتين
dotnet restore YourGame.Desktop.csproj -r win-x64
dotnet restore YourGame.Desktop.csproj -r win-x86
3. خيارات قائمة Publish في Visual Studio
عند النقر بزر الفأرة الأيمن على مشروع WAP واختيار Publish، تظهر ثلاثة خيارات:
- Associate App with the Store... (ربط التطبيق بالمتجر): تسجيل الدخول بحساب المطور وربط المشروع باسم التطبيق المحجوز في Partner Center لجلب معرّف الناشر الرسمي وتوليد ملف
Package.StoreAssociation.xml. - Convert Content Group Map File (تحويل ملف خريطة مجموعات المحتوى): يُستخدم في الألعاب الضخمة (أكثر من 50 جيجابايت) لدعم تقنية التثبيت التدريجي (Streaming Install)؛ يمكن للألعاب المستقلة العادية تجاهل هذا الخيار بأمان.
- Create App Packages... (إنشاء حزم التطبيق): المعالج الرئيسي لبناء وتوقيع الحزم سواء للاختبار المحلي (Sideloading) أو لإنشاء حزمة الرفع للمتجر (
_bundle.appxupload).
4. تكوين معالج إنشاء الحزم (Create App Packages)
┌─────────────────────────────────────────────────────────────┐
│ Output location: .\AppPackages\ │
│ Version: 1.0.0.0 [☑ Automatically increment] │
│ │
│ Generate app bundle: Always │
│ │
│ المعماريات: │
│ ☑ x86 التهيئة: Release (x86) │
│ ☑ x64 التهيئة: Release (x64) │
│ ☐ ARM (غير موصى به لألعاب Win32 لسطح المكتب) │
│ ☐ ARM64 (غير موصى به لألعاب Win32 لسطح المكتب) │
│ │
│ الخيارات: │
│ ☑ Include public symbol files │
│ ☑ Generate artifacts to validate app with WACK │
└─────────────────────────────────────────────────────────────┘
- قاعدة إصدارات المتجر: يتبع ترقيم الإصدارات النمط
Major.Minor.Build.Revision، ويجب أن يكون رقم إصدار أي حزمة جديدة يُرفع إلى المتجر أعلى دائماً من الإصدار المعروض حالياً. - تفعيل خيار
Automatically incrementيرفع رقم المراجعة (Revision) تلقائياً مع كل بناء لمنع تعارض أرقام الإصدارات.
5. ضبط ملف Package.appxmanifest
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap rescap">
<Identity
Name="YourPublisher.YourGame"
Publisher="CN=YOUR-OFFICIAL-PUBLISHER-ID"
Version="1.0.0.0" />
<Properties>
<DisplayName>اسم لعبتك</DisplayName>
<PublisherDisplayName>اسم الاستوديو</PublisherDisplayName>
<Logo>Images\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.26100.0" />
</Dependencies>
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="$targetentrypoint$">
<uap:VisualElements
DisplayName="اسم لعبتك"
Description="لعبة إطلاق نار ثنائية الأبعاد مبنية بواسطة MonoGame."
BackgroundColor="transparent"
Square150x150Logo="Images\Square150x150Logo.png"
Square44x44Logo="Images\Square44x44Logo.png">
<uap:DefaultTile
Wide310x150Logo="Images\Wide310x150Logo.png"
Square71x71Logo="Images\SmallTile.png"
Square310x310Logo="Images\LargeTile.png" />
<uap:SplashScreen Image="Images\SplashScreen.png" />
<uap:LockScreen BadgeLogo="Images\BadgeLogo.png" Notification="badgeAndTileText"/>
<uap:InitialRotationPreference>
<uap:Rotation Preference="landscape"/>
</uap:InitialRotationPreference>
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClient" />
<rescap:Capability Name="runFullTrust" />
</Capabilities>
</Package>
نقاط أساسية:
- صلاحية
<rescap:Capability Name="runFullTrust" />: نظراً لأن MonoGame يعتمد على مكتبات DirectX 11 ومكتبات محلية، فإنه يحتاج إلى صلاحية سطح المكتب الكاملة ليعمل بشكل سليم داخل الحاوية. - قفل اتجاه الشاشة
InitialRotationPreferenceعلىlandscape: يضمن تشغيل اللعبة بالوضع الأفقي على الأجهزة المحمولة مثل ASUS ROG Ally و Lenovo Legion Go.
6. مقاييس العناصر المرئية وقاعدة BadgeLogo
Warning
شرط BadgeLogo الصارم:
يجب أن يتكون شعار شاشة القفل (BadgeLogo) حصراً من بكسلات بيضاء ناصعة (#FFFFFF) وخلفية شفافة. وجود ألوان أو تدرجات يؤدي لرسوب الفحص في WACK.
7. فحص WACK واستكشاف الأخطاء
- خطأ "AppCert.exe wasn't found": يتم تثبيت أداة فحص الاعتماد عبر Visual Studio Installer من تبويب المكونات المستقلة (Individual components) بالبحث عن "Windows App Certification Kit". مع العلم أن تشغيل الاختبار محلياً اختياري؛ فالمتجر ينفذ الفحص تلقائياً عند الرفع.
- تحذير "Blocked Executable" لأصول MonoGame: يرجع لتشابه عشوائي بين بايتات الملفات المضغوطة وترويسات PE. تعترف مايكروسوفت بها كأصول لعب ثابتة وتوافق عليها دون مشاكل.
8. الاختبار المحلي عبر التحميل الجانبي (Sideloading)
من مجلد AppPackages/YourGame_1.0.0.0_Test/، افتح PowerShell كمسؤول ونفّذ:
Set-ExecutionPolicy RemoteSigned -Scope Process
.\Add-AppDevPackage.ps1
لتثبيت اللعبة محلياً والتأكد من دعم وحدات التحكم والصوت والأداء.
9. قائمة مراجعة التقديم في Microsoft Partner Center
- التسعير والتوفر: اختيار كافة الأسواق العالمية (240 دولة) وتحديد السعر بالدولار.
- الخصائص وسياسة الخصوصية: تصنيف اللعبة تحت
Gamesوإضافة رابط سياسة الخصوصية (Privacy Policy). - التقييم العمري (IARC): إكمال الاستبيان (تحصل ألعاب الأركيد عادة على تصنيف Everyone / PEGI 3).
- اللقطات والوصف: رفع لقطات شاشة 1920x1080 لسطح المكتب بدون أزرار لمس الموبايل.
- رفع الحزمة: سحب وإفلات ملف
_bundle.appxuploadثم الضغط على Submit to the Store.
الخلاصة
نشر ألعاب MonoGame على Microsoft Store لا يتطلب التخلي عن إمكانيات .NET 9 أو إعادة كتابة الألعاب لنظام UWP. بفضل مشاريع WAP وحزم MSIX، يمكنك تقديم لعبتك لملايين اللاعبين بأعلى درجات الاحترافية والأمان!
Hiç yorum yok:
Yorum Gönder