الشبكة العربية لمطوري الألعاب

محترف  انس مشاركة 1

السلام عليكم.

شد انتباهي خاصية موجودة في الـ XNA  و هي : Game.Service
حسب ما فهمته، فهذا الكائن يسمح باظافة و استرجاع مكونات اللعبة مهما كانة، فهل من معلومات اضافية ؟

سؤال ثاني :
نتجادل انا و صديقي عن مدى فعالية الكائن Game.Service للحصول مثلا على الـ SpriteBatch مقارنة بالطريقة المتبعة في مشروع عبر السدم :


public static Sudum Me { set; get; }

.ما هي الطريقة الاكثر فعالية ؟
.ما هي الحالة التي تستخدم فيها كل من الطريقتين ؟

اتمنى ان اجد عندكم تفسيرا شافيا ☺ ، شكرا.

سلام

خبير مدير وسام البهنسي مشاركة 2

وفي 26/شوال/1431 07:56 م، قال انس متحمساً:

حسب ما فهمته، فهذا الكائن يسمح باظافة و استرجاع مكونات اللعبة مهما كانة، فهل من معلومات اضافية ؟

صحيح. هو يعمل كحاوي للمتغيرات العامة في اللعبة. ويمكننا مبدئياً عن طريقه الوصول إلى خدمة الرسم على ما أعتقد، ويمكننا إضافة أية خدمات أخرى نريدها.
 



وفي 26/شوال/1431 07:56 م، ظهر شبح ابتسامة على وجه انس وهو يقول:

نتجادل انا و صديقي عن مدى فعالية الكائن Game.Service للحصول مثلا على الـ SpriteBatch مقارنة بالطريقة المتبعة في مشروع عبر السدم :


public static Sudum Me { set; get; }

.ما هي الطريقة الاكثر فعالية ؟
.ما هي الحالة التي تستخدم فيها كل من الطريقتين ؟

قبل أن نجيب على هذا السؤال سأسأل أنا سؤالاً: 
كيف تصل إلى الكائن Game.Service من الأصناف الأخرى في اللعبة غير صنف Sudum؟

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

محترف  انس مشاركة 3

مثال :



        public Map(Game game, ref Texture2D allSprite, Song backMusic)
            : base(game)
        {

            spriteBatch = (SpriteBatch)Game.Services.GetService(typeof(SpriteBatch));

        }

خبير مدير وسام البهنسي مشاركة 4

وفي 27/شوال/1431 11:04 ص، قال انس متحمساً:

مثال :

        public Map(Game game, ref Texture2D allSprite, Song backMusic)
            : base(game)
        {

            spriteBatch = (SpriteBatch)Game.Services.GetService(typeof(SpriteBatch));

        }

بمعنى آخر، ستقوم بتمرير كائن الـ Game إلى كل كائن آخر يود الوصول إلى قائمة الخدمات.
 
ما الفائدة إذن؟
 
الفكرة من إتاحة Sudum كمتغير ثابت هو أن تستطيع كافة الأصناف في اللعبة الوصول إليه دون الحاجة لتمريره إليها في كل مرة. بما أن صنف Sudum مشتق من Game، فإنك تستطيع كتابة الآتي:


SpriteBatch batch = Sudum.Me.Services.GetService(typeof(SpriteBatch));
 
لكن في حالتنا، بدلاً من إجبارك على نداء GetService لتصل إلى الـ SpriteBatch، فإنك ببساطة تعلن عنه كمتغير عضو في الصنف Sudum وانتهت القصة.

SpriteBatch batch = Sudum.Me.SpriteBatch;

وسام البهنسي
مبرمج في إنفيديا وإنفريمز