رسم XNA :باستخدام spritebatch واحدة في اللعبة بأكملها

StackOverflow https://stackoverflow.com//questions/12714720

  •  13-12-2019
  •  | 
  •  

سؤال

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

public void Draw(SpriteBatch sb, GameTime gameTime)
{
    sb.Begin();
    // ... to draw ...
    sb.End();
}

كنت أحفر DrawableGameComponent ورأيت أن طريقة Draw تأتي بهذه الطريقة:

public void Draw(GameTime gameTime)
{
    // ...
}

بادئ ذي بدء، أعلم أن SpriteBatch يمكنه جمع العديد من Texture2D بين البداية والنهاية، بحيث يكون من المفيد فرزها أو الرسم بنفس التأثيرات.

سؤالي يتعلق بالأداء وتكلفة اجتياز SpriteBatch.في DrawableGameComponent، من الممكن استدعاء spritebatch لكائن اللعبة إذا كان spritebatch عامًا.

ما هو المقترح، ما الذي يجب على مبرمج لعبة xna فعله؟

شكرا في النصيحة.

هل كانت مفيدة؟

المحلول

واحدة من عيوب خطيرة من DrawableGameComponent هو أنك تخوض في المقدمة طريقة التوقيع.في حين لا يوجد شيء "خطأ" ، في حد ذاته ، DrawableGameComponent, لا أعتقد "واحد صحيح العمارة".أنت أفضل حالا التفكير في الأمر على النحو مثال ممكن العمارة.

إذا كنت تجد نفسك بحاجة إلى تمرير SpriteBatch (أو أي شيء آخر) إلى رسم الأسلوب من "لعبة مكون" - أفضل طريقة هو لتمرير ذلك كحجة.أي شيء آخر هو معقد.

ومن الواضح أن هذا يعني أنه لا يمكنك استخدام XNA ما قدمت GameComponent النظام لديك لجعل الخاصة بك البديلة.ولكن هذا هو تافهة تقريبا:في أبسط مستوى ، انها مجرد قائمة من بعض نوع قاعدة أن مناسبة طرق افتراضية.


بالطبع, إذا كان يجب عليك استخدام GameComponent - أو اللعبة هو بسيط جدا (على سبيل المثال:النموذج) أن كنت لا تهتم حقا حول العمارة - ثم يمكنك استخدام الأساس أي طريقة كنت ترغب في الحصول على SpriteBatch إلى رسم الأسلوب.لديهم كل العيوب.

ربما القادم-معظم معماريا قوة الأسلوب هو لتمرير الخاص بك SpriteBatch على سبيل المثال في منشئ كل من المكونات الخاصة بك.هذا وتبقى مكونات منفصلة عن اللعبة الفئة.

من ناحية أخرى, إذا كنت تقيم في العمارة الرياح, أقترح جعل الخاص بك MyGame.spriteBatch المجال public static.هذا هو أبسط وسيلة للسماح الوصول إليها من أي مكان.فإنه من السهل تطبيق وسهلة لتنظيف في وقت لاحق عندما/إذا كنت بحاجة إلى.


بالنسبة لسؤالك عن الأداء:أي شيء للقيام مع تمرير SpriteBatch حول سوف يكون تقريبا تأثير يذكر على الأداء (توفير أجل من يدعو إلى Draw/Begin/End يبقى نفس).لا تقلق بشأن ذلك.

(إذا كنت ترى SpriteBatch whatever في الكود الذي يمثل المرجعية.مرجع هو قيمة 32 بت (في برنامج 32-بت التي XNA الألعاب).هذا هو نفس الحجم كما int أو float.انها صغيرة جدا و رخيصة جدا لتمرير حول/الوصول/الخ.)

نصائح أخرى

إذا تعثرت على هذا السؤال، فربما كنت تبحث في حل لطيف وعام.أود أن أقترح عليك إلقاء نظرة على هذا:

https://gamedev.stackexchange.com/Questions/14217/SIVERAL-CLASSES-CLEED-TO-ACSES-SMESTAME-DATA-WACE-SHOLD-TET-DATA-BEDECLARED/14232#14232

شعرت بالحاجة إلى تصحيح هذا السؤال لأن "أفضل طريقة هي تمريرها كوسيطة. هو ببساطة غير صحيح .

شخصيا أنا الآن أفعل ذلك بهذه الطريقة في فئة لعبتي:

giveacodicetagpre.

الآن، نظرا لأنك تقوم بإضافة عمليات رسمية في طريقة تهيئة فئة اللعبة، فستتمكن من الاتصال

giveacodicetagpre.

أود أن أقول إن أنظف نهج لحل المشكلة.

إذا DrawableGameComponent يجب أن تكون جزءًا من الوالدين SpriteBatch, ، ثم قم بتمريرها عبر المُنشئ وتخزينها في عضو خاص (أو اعرضها كخاصية إذا كنت ترغب في ذلك).

يمكنك أيضًا فضح SpriteBatch كملكية لك Game فئة إذا أردت، كما اقترحت، ولكن في كل مرة أشرت إليها this.Game, ، ستحتاج إلى إرسالها إلى موقعك المحدد Game نوع الفصل.

((MyGame)this.Game).SpriteBatch.Draw(...)

أو يمكنك فقط الحصول على DrawableGameComponent إنشاء جديد SpriteBatch.لا حرج في ذلك (بقدر ما رأيت).أفترض أن ذلك يعتمد على كم DrawableGameComponentما الذي ستقوم بإنشائه وعدد المرات.

تصفح أيضًا النتائج الخاصة بـ أ بحث عن DrawableGameComponent - هناك الكثير من النصائح الجيدة هناك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top